aboutsummaryrefslogtreecommitdiff
path: root/src/visualizations/Goom
diff options
context:
space:
mode:
Diffstat (limited to 'src/visualizations/Goom')
-rw-r--r--src/visualizations/Goom/Main.cpp309
-rw-r--r--src/visualizations/Goom/Makefile.in26
-rw-r--r--src/visualizations/Goom/build_xbmc_win32.sh36
-rw-r--r--src/visualizations/Goom/goom.patch26454
-rw-r--r--src/visualizations/Goom/goom2k4-0/AUTHORS9
-rw-r--r--src/visualizations/Goom/goom2k4-0/COPYING3
-rw-r--r--src/visualizations/Goom/goom2k4-0/ChangeLog85
-rw-r--r--src/visualizations/Goom/goom2k4-0/KNOWNBUGS1
-rw-r--r--src/visualizations/Goom/goom2k4-0/Makefile.am7
-rw-r--r--src/visualizations/Goom/goom2k4-0/NEWS1
-rw-r--r--src/visualizations/Goom/goom2k4-0/README25
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/autogen.sh8
-rw-r--r--src/visualizations/Goom/goom2k4-0/configure.in147
-rw-r--r--src/visualizations/Goom/goom2k4-0/goom2k4.pngbin0 -> 26535 bytes
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ABOUT-NLS226
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/AUTHORS0
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/COPYING340
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ChangeLog0
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/INSTALL231
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/Makefile.am29
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/NEWS0
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/README0
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/acconfig.h9
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/aclocal.m4796
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/gtk-gui-devel/autogen.sh148
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/config.h.in134
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure4206
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure.in58
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/goom2.glade158
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am16
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c267
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h24
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c137
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h5
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c162
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h61
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/main.c42
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/gtk-gui-devel/install-sh251
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/ChangeLog1086
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/VERSION1
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c203
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/cat-compat.c262
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dcgettext.c624
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dgettext.c59
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/explodename.c188
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/finddomain.c216
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.c70
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.h105
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettextP.h89
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/hash-string.h59
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/intl-compat.c76
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/l10nflist.c411
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/libgettext.h182
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed100
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadinfo.h76
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c222
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/localealias.c424
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in102
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/textdomain.c108
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed104
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/gtk-gui-devel/missing336
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/gtk-gui-devel/mkinstalldirs101
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/ChangeLog0
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/Makefile.in.in248
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/POTFILES.in6
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c25
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/goom2.pot65
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/stamp-cat-id1
-rw-r--r--src/visualizations/Goom/goom2k4-0/gtk-gui-devel/stamp-h.in1
-rw-r--r--src/visualizations/Goom/goom2k4-0/libgoom2.pc.in12
-rw-r--r--src/visualizations/Goom/goom2k4-0/m4/sdl.m4175
-rw-r--r--src/visualizations/Goom/goom2k4-0/m4/xmms.m4148
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/Makefile88
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/ReadMe.rtf256
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.h38
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.m438
-rw-r--r--src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp126
-rw-r--r--src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.h53
-rw-r--r--src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp70
-rw-r--r--src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.h29
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings7
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib44
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib23
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/keyedobjects.nibbin0 -> 15055 bytes
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings14
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.h46
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.m294
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.h26
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.m213
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.h22
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.m65
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.h88
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.m249
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.h45
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.m57
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.h36
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.mm372
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist32
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch7
-rw-r--r--src/visualizations/Goom/goom2k4-0/mac/StandAlone/icon.icnsbin0 -> 46092 bytes
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/StandAlone/main.m45
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iGoom.xcode/project.pbxproj1130
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/About.strings3
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings7
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib4
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib18
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib138
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/About.strings3
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings7
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib4
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib18
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib138
-rw-r--r--src/visualizations/Goom/goom2k4-0/mac/iTunes/Installer.applescript1
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom-Info.plist46
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom.c896
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c1
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h1
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h1
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mac/iTunes/ppc_doubling.s50
-rwxr-xr-xsrc/visualizations/Goom/goom2k4-0/mkinstalldirs162
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/Makefile.am11
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.c83
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.h30
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.c42
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.h31
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.c416
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.h24
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.c138
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.h5
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.c162
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.h61
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.c44
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.h58
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler_athlon.s118
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/readme.c49
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.c746
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.h30
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.c51
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.h2
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/surface.c18
-rw-r--r--src/visualizations/Goom/goom2k4-0/sdl-goom/surface.h16
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/DOCODE.TXT55
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/Makefile.am34
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/TODO32
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/config_param.c110
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/convolve_fx.c336
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/convolve_fx.c.jc333
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/cpu_info.c71
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/cpu_info.h34
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/default_script.goom34
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/default_scripts.h6
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/drawmethods.c203
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/drawmethods.h9
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/empty_script.goom0
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/filter_test/mmx.h705
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/filter_test/px_py_calc.c94
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c202
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx.c186
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/filters.c773
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/filters_mmx.s200
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/flying_stars_fx.c316
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/gfontlib.c231
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/gfontlib.h10
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/gfontrle.c2500
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/gfontrle.h7
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom.h30
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_config.h28
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_config_param.h115
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_core.c895
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_filters.h52
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_fx.h12
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_graphic.h74
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_hash.c100
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_hash.h34
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_plugin_info.h176
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_tools.c25
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_tools.h42
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_typedefs.h11
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goom_visual_fx.h26
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goomsl.c1514
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goomsl.h34
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goomsl_hash.c120
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goomsl_hash.h40
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goomsl_heap.c105
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goomsl_heap.h29
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goomsl_lex.c2110
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goomsl_lex.l94
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goomsl_private.h251
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.c2997
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.h104
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.y1405
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/graphic.c10
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/ifs.c763
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/ifs.h27
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/jitc_test.c38
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/jitc_x86.c530
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/jitc_x86.h214
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/lines.c239
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/lines.h81
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/mathtools.c84
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/mathtools.h36
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/mmx.c275
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/mmx.h729
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/motif_goom1.h1026
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/motif_goom2.h1026
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/plugin_info.c202
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/pngload.c144
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s305
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/powerpc/ppc_doubling.s50
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/ppc_drawings.h18
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/ppc_drawings.s381
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.h14
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.s323
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/sound_tester.c138
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/sound_tester.h11
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/surf3d.c107
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/surf3d.h38
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/surf3d.s484
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/tentacle3d.c299
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/tentacle3d.h8
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/v3d.c15
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/v3d.h65
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/xmmx.c390
-rw-r--r--src/visualizations/Goom/goom2k4-0/src/xmmx.h537
-rw-r--r--src/visualizations/Goom/goom2k4-0/test/testapp.c17
-rw-r--r--src/visualizations/Goom/goom2k4-0/tools/Makefile.devel5
-rw-r--r--src/visualizations/Goom/goom2k4-0/tools/gfont.c3483
-rw-r--r--src/visualizations/Goom/goom2k4-0/tools/minicompress.c65
-rw-r--r--src/visualizations/Goom/goom2k4-0/tools/xmms-goom.spec41
-rw-r--r--src/visualizations/Goom/goom2k4-0/xmms-goom/Makefile.am11
-rw-r--r--src/visualizations/Goom/goom2k4-0/xmms-goom/xmms_goom.c130
-rw-r--r--src/visualizations/Goom/goom_config.h12
-rw-r--r--src/visualizations/Goom/visualization.goom/addon.xml15
-rw-r--r--src/visualizations/Goom/visualization.goom/icon.pngbin0 -> 21730 bytes
234 files changed, 77132 insertions, 0 deletions
diff --git a/src/visualizations/Goom/Main.cpp b/src/visualizations/Goom/Main.cpp
new file mode 100644
index 0000000000..890e01a687
--- /dev/null
+++ b/src/visualizations/Goom/Main.cpp
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2005-2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+/*
+
+Goom Visualization Interface for XBMC
+- Team XBMC
+
+*/
+
+#define __STDC_LIMIT_MACROS
+
+#include "../../addons/include/xbmc_vis_dll.h"
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <string>
+extern "C" {
+#include "goom.h"
+}
+#include "goom_config.h"
+#include <GL/glew.h>
+
+extern int preset_index;
+char g_visName[512];
+PluginInfo* g_goom = NULL;
+
+int g_tex_width = GOOM_TEXTURE_WIDTH;
+int g_tex_height = GOOM_TEXTURE_HEIGHT;
+int g_window_width = 512;
+int g_window_height = 512;
+int g_window_xpos = 0;
+int g_window_ypos = 0;
+
+GLuint g_texid = 0;
+unsigned char* g_goom_buffer = NULL;
+short g_audio_data[2][512];
+std::string g_configFile;
+
+using namespace std;
+
+//-- Create -------------------------------------------------------------------
+// Called once when the visualisation is created by XBMC. Do any setup here.
+//-----------------------------------------------------------------------------
+extern "C" ADDON_STATUS ADDON_Create(void* hdl, void* props)
+{
+ if (!props)
+ return ADDON_STATUS_UNKNOWN;
+
+ VIS_PROPS* visprops = (VIS_PROPS*)props;
+
+ strcpy(g_visName, visprops->name);
+ g_configFile = string(visprops->profile) + string("/goom.conf");
+ std::string presetsDir = string(visprops->presets) + string("/resources");
+
+ /** Initialise Goom */
+ if (g_goom)
+ {
+ goom_close( g_goom );
+ g_goom = NULL;
+ }
+
+ g_goom = goom_init(g_tex_width, g_tex_height);
+ if (!g_goom)
+ return ADDON_STATUS_UNKNOWN;
+
+ g_goom_buffer = (unsigned char*)malloc(g_tex_width * g_tex_height * 4);
+ goom_set_screenbuffer( g_goom, g_goom_buffer );
+ memset( g_audio_data, 0, sizeof(g_audio_data) );
+ g_window_width = visprops->width;
+ g_window_height = visprops->height;
+ g_window_xpos = visprops->x;
+ g_window_ypos = visprops->y;
+
+ return ADDON_STATUS_OK;
+}
+
+//-- Destroy -------------------------------------------------------------------
+// Do everything before unload of this add-on
+// !!! Add-on master function !!!
+//-----------------------------------------------------------------------------
+extern "C" void ADDON_Destroy()
+{
+ if ( g_goom )
+ {
+ goom_close( g_goom );
+ g_goom = NULL;
+ }
+ if ( g_goom_buffer )
+ {
+ free( g_goom_buffer );
+ g_goom_buffer = NULL;
+ }
+}
+
+//-- Start --------------------------------------------------------------------
+// Called when a new soundtrack is played
+//-----------------------------------------------------------------------------
+extern "C" void Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName)
+{
+ if ( g_goom )
+ {
+ goom_update( g_goom, g_audio_data, 0, 0, (char*)szSongName, (char*)"XBMC" );
+ }
+}
+
+//-- Stop ---------------------------------------------------------------------
+// Called when the visualisation is closed by XBMC
+//-----------------------------------------------------------------------------
+extern "C" void ADDON_Stop()
+{
+ if (g_texid)
+ {
+ glDeleteTextures( 1, &g_texid );
+ g_texid = 0;
+ }
+}
+
+//-- Audiodata ----------------------------------------------------------------
+// Called by XBMC to pass new audio data to the vis
+//-----------------------------------------------------------------------------
+extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength)
+{
+ int copysize = iAudioDataLength < (int)sizeof( g_audio_data ) >> 1 ? iAudioDataLength : (int)sizeof( g_audio_data ) >> 1;
+ int ipos, i;
+ for(ipos = 0, i = 0; i < copysize; i += 2, ++ipos)
+ {
+ g_audio_data[0][ipos] = (int)(pAudioData[i ] * (INT16_MAX+.5f));
+ g_audio_data[1][ipos] = (int)(pAudioData[i+1] * (INT16_MAX+.5f));
+ }
+}
+
+
+//-- Render -------------------------------------------------------------------
+// Called once per frame. Do all rendering here.
+//-----------------------------------------------------------------------------
+extern "C" void Render()
+{
+ if ( g_goom )
+ {
+ goom_set_screenbuffer( g_goom, g_goom_buffer );
+ if (!g_texid)
+ {
+ // initialize the texture we'll be using
+ glGenTextures( 1, &g_texid );
+ if (!g_texid)
+ return;
+ goom_update( g_goom, g_audio_data, 0, 0, NULL, (char*)"XBMC" );
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture( GL_TEXTURE_2D, g_texid );
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexImage2D( GL_TEXTURE_2D, 0, 4, g_tex_width, g_tex_height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, g_goom_buffer );
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ }
+ else
+ {
+ // update goom frame and copy to our texture
+ goom_update( g_goom, g_audio_data, 0, 0, NULL, (char*)"XBMC" );
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture( GL_TEXTURE_2D, g_texid );
+ glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, g_tex_width, g_tex_height,
+ GL_RGBA, GL_UNSIGNED_BYTE, g_goom_buffer );
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ }
+
+ glDisable(GL_BLEND);
+ glBegin( GL_QUADS );
+ {
+ glColor3f( 1.0, 1.0, 1.0 );
+ glTexCoord2f( 0.0, 0.0 );
+ glVertex2f( g_window_xpos, g_window_ypos );
+
+ glTexCoord2f( 0.0, 1.0 );
+ glVertex2f( g_window_xpos, g_window_ypos + g_window_height );
+
+ glTexCoord2f( 1.0, 1.0 );
+ glVertex2f( g_window_xpos + g_window_width, g_window_ypos + g_window_height );
+
+ glTexCoord2f( 1.0, 0.0 );
+ glVertex2f( g_window_xpos + g_window_width, g_window_ypos );
+ }
+ glEnd();
+ glDisable( GL_TEXTURE_2D );
+ glEnable(GL_BLEND);
+ }
+}
+
+//-- GetInfo ------------------------------------------------------------------
+// Tell XBMC our requirements
+//-----------------------------------------------------------------------------
+extern "C" void GetInfo(VIS_INFO* pInfo)
+{
+ pInfo->bWantsFreq = false;
+ pInfo->iSyncDelay = 0;
+}
+
+//-- OnAction -----------------------------------------------------------------
+// Handle XBMC actions such as next preset, lock preset, album art changed etc
+//-----------------------------------------------------------------------------
+extern "C" bool OnAction(long flags, const void *param)
+{
+ bool ret = false;
+ return ret;
+}
+
+//-- GetPresets ---------------------------------------------------------------
+// Return a list of presets to XBMC for display
+//-----------------------------------------------------------------------------
+extern "C" unsigned int GetPresets(char ***presets)
+{
+ return 0;
+}
+
+//-- GetPreset ----------------------------------------------------------------
+// Return the index of the current playing preset
+//-----------------------------------------------------------------------------
+extern "C" unsigned GetPreset()
+{
+ return 0;
+}
+
+//-- IsLocked -----------------------------------------------------------------
+// Returns true if this add-on use settings
+//-----------------------------------------------------------------------------
+extern "C" bool IsLocked()
+{
+ return false;
+}
+
+//-- GetSubModules ------------------------------------------------------------
+// Return any sub modules supported by this vis
+//-----------------------------------------------------------------------------
+extern "C" unsigned int GetSubModules(char ***names)
+{
+ return 0; // this vis supports 0 sub modules
+}
+
+//-- HasSettings --------------------------------------------------------------
+// Returns true if this add-on use settings
+// !!! Add-on master function !!!
+//-----------------------------------------------------------------------------
+extern "C" bool ADDON_HasSettings()
+{
+ return false;
+}
+
+//-- GetStatus ---------------------------------------------------------------
+// Returns the current Status of this visualisation
+// !!! Add-on master function !!!
+//-----------------------------------------------------------------------------
+extern "C" ADDON_STATUS ADDON_GetStatus()
+{
+ return ADDON_STATUS_OK;
+}
+
+//-- GetSettings --------------------------------------------------------------
+// Return the settings for XBMC to display
+// !!! Add-on master function !!!
+//-----------------------------------------------------------------------------
+extern "C" unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet)
+{
+ return 0;
+}
+
+//-- FreeSettings --------------------------------------------------------------
+// Free the settings struct passed from XBMC
+// !!! Add-on master function !!!
+//-----------------------------------------------------------------------------
+
+extern "C" void ADDON_FreeSettings()
+{
+}
+
+//-- SetSetting ---------------------------------------------------------------
+// Set a specific Setting value (called from XBMC)
+// !!! Add-on master function !!!
+//-----------------------------------------------------------------------------
+extern "C" ADDON_STATUS ADDON_SetSetting(const char *strSetting, const void* value)
+{
+ return ADDON_STATUS_OK;
+}
+
+//-- Announce -----------------------------------------------------------------
+// Receive announcements from XBMC
+// !!! Add-on master function !!!
+//-----------------------------------------------------------------------------
+extern "C" void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data)
+{
+}
diff --git a/src/visualizations/Goom/Makefile.in b/src/visualizations/Goom/Makefile.in
new file mode 100644
index 0000000000..a172e670b0
--- /dev/null
+++ b/src/visualizations/Goom/Makefile.in
@@ -0,0 +1,26 @@
+ARCH=@ARCH@
+INCLUDES=-I. -I.. -I../../linux -I../../ -Igoom2k4-0/src
+OBJS=Main.o
+SLIB=visualization.goom/Goom.vis
+DEFINES+=-DHAS_SDL_OPENGL -DHAS_SDL
+CXXFLAGS=-fPIC
+DIRS=goom2k4-0
+DISTCLEAN_FILES=../../../addons/visualization.goom
+
+$(SLIB): $(OBJS) goom2k4-0/src/.libs/libgoom2.a
+ifeq ($(findstring osx,$(ARCH)), osx)
+ $(CXX) $(CXXFLAGS) $(LDFLAGS) -Wl,-alias_list,@abs_top_srcdir@/src/cores/DllLoader/exports/wrapper_mach_alias \
+ -bundle -undefined suppress -read_only_relocs suppress -o $(SLIB) \
+ @abs_top_srcdir@/src/cores/DllLoader/exports/wrapper.o goom2k4-0/src/.libs/libgoom2.a $(OBJS)
+else
+ $(CXX) $(LDFLAGS) -fPIC goom2k4-0/src/*.o -shared $(CXXFLAGS) -o $(SLIB) $(OBJS) \
+ `cat ../../cores/DllLoader/exports/wrapper.def` \
+ ../../cores/DllLoader/exports/wrapper.o
+endif
+ @find visualization.goom -regextype posix-extended -type f -not -iregex ".*svn.*|.*\.so|.*\.dll|.*\.pyd|.*\.pvr|.*python/.*\.zlib|.*\.vis" -exec install -D -m 0644 "{}" ../../../addons/"{}" \; -printf " -- %-75.75f\r"
+ @find visualization.goom -type f -not -iregex ".*svn.*|.*win32(dx)?\.vis\.vis" -iregex ".*\.vis" -exec install -D "{}" ../../../addons/"{}" \; -printf " -- %-75.75f\r"
+
+goom2k4-0/src/.libs/libgoom2.a:
+ $(MAKE) -C goom2k4-0
+
+include ../../../Makefile.include
diff --git a/src/visualizations/Goom/build_xbmc_win32.sh b/src/visualizations/Goom/build_xbmc_win32.sh
new file mode 100644
index 0000000000..1e586689dc
--- /dev/null
+++ b/src/visualizations/Goom/build_xbmc_win32.sh
@@ -0,0 +1,36 @@
+
+GOOM_SRC="
+goom2k4-0/src/config_param.c \
+goom2k4-0/src/convolve_fx.c \
+goom2k4-0/src/cpu_info.c \
+goom2k4-0/src/drawmethods.c \
+goom2k4-0/src/filters.c \
+goom2k4-0/src/flying_stars_fx.c \
+goom2k4-0/src/gfontlib.c \
+goom2k4-0/src/gfontrle.c \
+goom2k4-0/src/goom_core.c \
+goom2k4-0/src/goom_tools.c \
+goom2k4-0/src/goomsl.c \
+goom2k4-0/src/goomsl_hash.c \
+goom2k4-0/src/goomsl_heap.c \
+goom2k4-0/src/goomsl_lex.c \
+goom2k4-0/src/goomsl_yacc.c \
+goom2k4-0/src/graphic.c \
+goom2k4-0/src/ifs.c \
+goom2k4-0/src/jitc_test.c \
+goom2k4-0/src/jitc_x86.c \
+goom2k4-0/src/lines.c \
+goom2k4-0/src/mathtools.c \
+goom2k4-0/src/mmx.c \
+goom2k4-0/src/plugin_info.c \
+goom2k4-0/src/sound_tester.c \
+goom2k4-0/src/surf3d.c \
+goom2k4-0/src/tentacle3d.c \
+goom2k4-0/src/v3d.c \
+goom2k4-0/src/xmmx.c \
+"
+
+gcc -c -O3 -g -D_WIN32PC -DHAS_SDL_OPENGL -DHAVE_MMX -D_MINGW -Igoom2k4-0/src/ -I../../../lib/libSDL-WIN32/include/ -I../../../visualisations/ ${GOOM_SRC} Main.cpp
+
+gcc -g -s -shared -o ../../../visualisations/goom_win32.vis *.o -lopengl32 -lstdc++
+rm *.o
diff --git a/src/visualizations/Goom/goom.patch b/src/visualizations/Goom/goom.patch
new file mode 100644
index 0000000000..78a07d11c2
--- /dev/null
+++ b/src/visualizations/Goom/goom.patch
@@ -0,0 +1,26454 @@
+diff -Naur /home/d4rk/goom2k4-0/src/config_param.c /src/config_param.c
+--- /home/d4rk/goom2k4-0/src/config_param.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/config_param.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,110 +0,0 @@
+-/*---------------------------------------------------------------------------*/
+-/*
+-** config_param.c
+-** Goom Project
+-**
+-** Created by Jean-Christophe Hoelt on Sat Jul 19 2003
+-** Copyright (c) 2003 iOS. All rights reserved.
+-*/
+-/*---------------------------------------------------------------------------*/
+-
+-#include "goom_config_param.h"
+-#include <string.h>
+-
+-/* TODO: Ajouter goom_ devant ces fonctions */
+-
+-static void empty_fct(PluginParam *dummy) {
+-}
+-
+-PluginParam goom_secure_param() {
+- PluginParam p;
+- p.changed = empty_fct;
+- p.change_listener = empty_fct;
+- p.user_data = 0;
+- p.name = p.desc = 0;
+- p.rw = 1;
+- return p;
+-}
+-
+-PluginParam goom_secure_f_param(char *name) {
+- PluginParam p = secure_param();
+- p.name = name;
+- p.type = PARAM_FLOATVAL;
+- FVAL(p) = 0.5f;
+- FMIN(p) = 0.0f;
+- FMAX(p) = 1.0f;
+- FSTEP(p) = 0.01f;
+- return p;
+-}
+-
+-PluginParam goom_secure_f_feedback(char *name) {
+- PluginParam p = secure_f_param(name);
+- p.rw = 0;
+- return p;
+-}
+-
+-PluginParam goom_secure_s_param(char *name) {
+- PluginParam p = secure_param();
+- p.name = name;
+- p.type = PARAM_STRVAL;
+- SVAL(p) = 0;
+- return p;
+-}
+-
+-PluginParam goom_secure_b_param(char *name, int value) {
+- PluginParam p = secure_param();
+- p.name = name;
+- p.type = PARAM_BOOLVAL;
+- BVAL(p) = value;
+- return p;
+-}
+-
+-PluginParam goom_secure_i_param(char *name) {
+- PluginParam p = secure_param();
+- p.name = name;
+- p.type = PARAM_INTVAL;
+- IVAL(p) = 50;
+- IMIN(p) = 0;
+- IMAX(p) = 100;
+- ISTEP(p) = 1;
+- return p;
+-}
+-
+-PluginParam goom_secure_i_feedback(char *name) {
+- PluginParam p = secure_i_param(name);
+- p.rw = 0;
+- return p;
+-}
+-
+-PluginParameters goom_plugin_parameters(const char *name, int nb) {
+- PluginParameters p;
+- p.name = (char *)name;
+- p.desc = "";
+- p.nbParams = nb;
+- p.params = (PluginParam**)malloc(nb*sizeof(PluginParam*));
+- return p;
+-}
+-
+-/*---------------------------------------------------------------------------*/
+-
+-void goom_set_str_param_value(PluginParam *p, const char *str) {
+- int len = strlen(str);
+- if (SVAL(*p))
+- SVAL(*p) = (char*)realloc(SVAL(*p), len+1);
+- else
+- SVAL(*p) = (char*)malloc(len+1);
+- memcpy(SVAL(*p), str, len+1);
+-}
+-
+-void goom_set_list_param_value(PluginParam *p, const char *str) {
+- int len = strlen(str);
+-#ifdef VERBOSE
+- printf("%s: %d\n", str, len);
+-#endif
+- if (LVAL(*p))
+- LVAL(*p) = (char*)realloc(LVAL(*p), len+1);
+- else
+- LVAL(*p) = (char*)malloc(len+1);
+- memcpy(LVAL(*p), str, len+1);
+-}
+-
+diff -Naur /home/d4rk/goom2k4-0/src/convolve_fx.c /src/convolve_fx.c
+--- /home/d4rk/goom2k4-0/src/convolve_fx.c 2005-02-07 06:46:42.000000000 -0700
++++ /src/convolve_fx.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,335 +0,0 @@
+-#include "goom_fx.h"
+-#include "goom_plugin_info.h"
+-#include "goomsl.h"
+-#include "goom_config.h"
+-#include <math.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <string.h>
+-
+-//#define CONV_MOTIF_W 32
+-//#define CONV_MOTIF_WMASK 0x1f
+-
+-#define CONV_MOTIF_W 128
+-#define CONV_MOTIF_WMASK 0x7f
+-
+-typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W];
+-
+-#include "motif_goom1.h"
+-#include "motif_goom2.h"
+-
+-#define NB_THETA 512
+-
+-#define MAX 2.0f
+-
+-typedef struct _CONV_DATA{
+- PluginParam light;
+- PluginParam factor_adj_p;
+- PluginParam factor_p;
+- PluginParameters params;
+-
+- GoomSL *script;
+-
+- /* rotozoom */
+- int theta;
+- float ftheta;
+- int h_sin[NB_THETA];
+- int h_cos[NB_THETA];
+- int h_height;
+- float visibility;
+- Motif conv_motif;
+- int inverse_motif;
+-
+-} ConvData;
+-
+-/* init rotozoom tables */
+-static void compute_tables(VisualFX *_this, PluginInfo *info)
+-{
+- ConvData *data = (ConvData*)_this->fx_data;
+- double screen_coef;
+- int i;
+- double h;
+- double radian;
+-
+- if (data->h_height == info->screen.height) return;
+-
+- screen_coef = 2.0 * 300.0 / (double)info->screen.height;
+- data->h_height = info->screen.height;
+-
+- for ( i=0 ; i<NB_THETA ; i++ ) {
+- radian = 2*i*M_PI/NB_THETA;
+- h = (0.2 + cos (radian) / 15.0 * sin(radian * 2.0 + 12.123)) * screen_coef;
+- data->h_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian));
+- data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian));
+- }
+-}
+-
+-static void set_motif(ConvData *data, Motif motif)
+-{
+- int i,j;
+- for (i=0;i<CONV_MOTIF_W;++i) for (j=0;j<CONV_MOTIF_W;++j)
+- data->conv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1];
+-}
+-
+-static void convolve_init(VisualFX *_this, PluginInfo *info) {
+- ConvData *data;
+- data = (ConvData*)malloc(sizeof(ConvData));
+- _this->fx_data = (void*)data;
+-
+- data->light = secure_f_param("Screen Brightness");
+- data->light.param.fval.max = 300.0f;
+- data->light.param.fval.step = 1.0f;
+- data->light.param.fval.value = 100.0f;
+-
+- data->factor_adj_p = secure_f_param("Flash Intensity");
+- data->factor_adj_p.param.fval.max = 200.0f;
+- data->factor_adj_p.param.fval.step = 1.0f;
+- data->factor_adj_p.param.fval.value = 70.0f;
+-
+- data->factor_p = secure_f_feedback("Factor");
+-
+- data->params = plugin_parameters ("Bright Flash", 5);
+- data->params.params[0] = &data->light;
+- data->params.params[1] = &data->factor_adj_p;
+- data->params.params[2] = 0;
+- data->params.params[3] = &data->factor_p;
+- data->params.params[4] = 0;
+-
+- /* init rotozoom tables */
+- compute_tables(_this, info);
+- data->theta = 0;
+- data->ftheta = 0.0;
+- data->visibility = 1.0;
+- set_motif(data, CONV_MOTIF2);
+- data->inverse_motif = 0;
+-
+- _this->params = &data->params;
+-}
+-
+-static void convolve_free(VisualFX *_this) {
+- free (_this->fx_data);
+-}
+-
+-static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest,
+- PluginInfo *info, int iff)
+-{
+- ConvData *data = (ConvData*)_this->fx_data;
+-
+- int x,y;
+- int i = 0;//info->screen.height * info->screen.width - 1;
+-
+- const int c = data->h_cos [data->theta];
+- const int s = data->h_sin [data->theta];
+-
+- const int xi = -(info->screen.width/2) * c;
+- const int yi = (info->screen.width/2) * s;
+-
+- const int xj = -(info->screen.height/2) * s;
+- const int yj = -(info->screen.height/2) * c;
+-
+- int xprime = xj;
+- int yprime = yj;
+-
+- int ifftab[16];
+- if (data->inverse_motif) {
+- int i;
+- for (i=0;i<16;++i)
+- ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0);
+- }
+- else {
+- int i;
+- for (i=0;i<16;++i)
+- ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0);
+- }
+-
+- for (y=info->screen.height;y--;) {
+- int xtex,ytex;
+-
+- xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2;
+- xprime += s;
+-
+- ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2;
+- yprime += c;
+-
+-#ifdef HAVE_MMX
+- __asm__ __volatile__
+- ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */
+- "\n\t movd %[xtex], %%mm2"
+- "\n\t movd %[ytex], %%mm3"
+- "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */
+- "\n\t movd %[c], %%mm4"
+- "\n\t movd %[s], %%mm6"
+- "\n\t pxor %%mm5, %%mm5"
+- "\n\t psubd %%mm6, %%mm5"
+- "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */
+- "\n\t movd %[motif], %%mm6" /* mm6 = motif */
+-
+- ::[xtex]"g"(xtex) ,[ytex]"g"(ytex)
+- , [c]"g"(c), [s]"g"(s)
+- , [motif] "g"(&data->conv_motif[0][0]));
+-
+- for (x=info->screen.width;x--;)
+- {
+- __asm__ __volatile__
+- (
+- "\n\t movd %[src], %%mm0" /* mm0 = src */
+- "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */
+- "\n\t movd %%esi, %%mm5" /* save esi into mm5 */
+- "\n\t movq %%mm2, %%mm3"
+- "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */
+- "\n\t movd %%mm3, %%eax" /* eax = xtex' */
+-
+- "\n\t psrlq $25, %%mm3"
+- "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */
+-
+- "\n\t andl $127, %%eax"
+- "\n\t andl $16256, %%ecx"
+-
+- "\n\t addl %%ecx, %%eax"
+- "\n\t movd %%mm6, %%esi" /* esi = motif */
+- "\n\t xorl %%ecx, %%ecx"
+- "\n\t movb (%%eax,%%esi), %%cl"
+-
+- "\n\t movl %[ifftab], %%eax"
+- "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */
+- "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */
+-
+- "\n\t punpcklwd %%mm1, %%mm1"
+- "\n\t punpcklbw %%mm7, %%mm0"
+- "\n\t punpckldq %%mm1, %%mm1"
+- "\n\t psrlw $1, %%mm0"
+- "\n\t psrlw $2, %%mm1"
+- "\n\t pmullw %%mm1, %%mm0"
+- "\n\t psrlw $5, %%mm0"
+- "\n\t packuswb %%mm7, %%mm0"
+- "\n\t movd %%mm0, %[dest]"
+- : [dest] "=g" (dest[i].val)
+- : [src] "g" (src[i].val)
+- , [ifftab]"g"(&ifftab[0])
+- : "eax","ecx");
+-
+- i++;
+- }
+-#else
+- for (x=info->screen.width;x--;) {
+-
+- int iff2;
+- unsigned int f0,f1,f2,f3;
+-
+- xtex += c;
+- ytex -= s;
+-
+- iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]];
+-
+-#define sat(a) ((a)>0xFF?0xFF:(a))
+- f0 = src[i].val;
+- f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8;
+- f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8;
+- f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8;
+- dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET);
+-/*
+- f0 = (src[i].cop[0] * iff2) >> 8;
+- f1 = (src[i].cop[1] * iff2) >> 8;
+- f2 = (src[i].cop[2] * iff2) >> 8;
+- f3 = (src[i].cop[3] * iff2) >> 8;
+-
+- dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0;
+- dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1;
+- dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2;
+- dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3;
+-*/
+- i++;
+- }
+-#endif
+- }
+-#ifdef HAVE_MMX
+- __asm__ __volatile__ ("\n\t emms");
+-#endif
+-
+- compute_tables(_this, info);
+-}
+-
+-
+-/*#include <stdint.h>
+-
+-static uint64_t GetTick()
+-{
+- uint64_t x;
+- asm volatile ("RDTSC" : "=A" (x));
+- return x;
+-}*/
+-
+-
+-static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) {
+-
+- ConvData *data = (ConvData*)_this->fx_data;
+- float ff;
+- int iff;
+-
+- ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f;
+- iff = (unsigned int)(ff * 256);
+-
+- {
+- double fcycle = (double)info->cycle;
+- double rotate_param, rotate_coef;
+- float INCREASE_RATE = 1.5;
+- float DECAY_RATE = 0.955;
+- if (FVAL(info->sound.last_goom_p) > 0.8)
+- FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE;
+- FVAL(data->factor_p) *= DECAY_RATE;
+-
+- rotate_param = FVAL(info->sound.last_goom_p);
+- if (rotate_param < 0.0)
+- rotate_param = 0.0;
+- rotate_param += FVAL(info->sound.goom_power_p);
+-
+- rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0;
+- data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3));
+- data->theta = ((unsigned int)data->ftheta) % NB_THETA;
+- data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5;
+- if (data->visibility < 0.0) data->visibility = 0.0;
+- data->factor_p.change_listener(&data->factor_p);
+- }
+-
+- if (data->visibility < 0.01) {
+- switch (goom_irand(info->gRandom, 300))
+- {
+- case 1:
+- set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break;
+- case 2:
+- set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break;
+- }
+- }
+-
+- if ((ff > 0.98f) && (ff < 1.02f))
+- memcpy(dest, src, info->screen.size * sizeof(Pixel));
+- else
+- create_output_with_brightness(_this,src,dest,info,iff);
+-/*
+-// Benching suite...
+- {
+- uint64_t before, after;
+- double timed;
+- static double stimed = 10000.0;
+- before = GetTick();
+- data->visibility = 1.0;
+- create_output_with_brightness(_this,src,dest,info,iff);
+- after = GetTick();
+- timed = (double)((after-before) / info->screen.size);
+- if (timed < stimed) {
+- stimed = timed;
+- printf ("CLK = %3.0f CPP\n", stimed);
+- }
+- }
+-*/
+-}
+-
+-VisualFX convolve_create(void) {
+- VisualFX vfx = {
+- init: convolve_init,
+- free: convolve_free,
+- apply: convolve_apply,
+- fx_data: 0
+- };
+- return vfx;
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/convolve_fx.c.jc /src/convolve_fx.c.jc
+--- /home/d4rk/goom2k4-0/src/convolve_fx.c.jc 2005-02-07 06:46:42.000000000 -0700
++++ /src/convolve_fx.c.jc 1969-12-31 17:00:00.000000000 -0700
+@@ -1,333 +0,0 @@
+-#include "goom_fx.h"
+-#include "goom_plugin_info.h"
+-#include "goomsl.h"
+-#include "goom_config.h"
+-#include <math.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <string.h>
+-
+-//#define CONV_MOTIF_W 32
+-//#define CONV_MOTIF_WMASK 0x1f
+-
+-#define CONV_MOTIF_W 128
+-#define CONV_MOTIF_WMASK 0x7f
+-
+-typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W];
+-
+-#include "motif_goom1.h"
+-#include "motif_goom2.h"
+-
+-#define NB_THETA 512
+-
+-#define MAX 2.0f
+-
+-typedef struct _CONV_DATA{
+- PluginParam light;
+- PluginParam factor_adj_p;
+- PluginParam factor_p;
+- PluginParameters params;
+-
+- GoomSL *script;
+-
+- /* rotozoom */
+- int theta;
+- float ftheta;
+- int h_sin[NB_THETA];
+- int h_cos[NB_THETA];
+- int h_height;
+- float visibility;
+- Motif conv_motif;
+- int inverse_motif;
+-
+-} ConvData;
+-
+-/* init rotozoom tables */
+-static void compute_tables(VisualFX *_this, PluginInfo *info)
+-{
+- ConvData *data = (ConvData*)_this->fx_data;
+- double screen_coef;
+- int i;
+- double h;
+- double radian;
+-
+- if (data->h_height == info->screen.height) return;
+-
+- screen_coef = 2.0 * 300.0 / (double)info->screen.height;
+- data->h_height = info->screen.height;
+-
+- for ( i=0 ; i<NB_THETA ; i++ ) {
+- radian = 2*i*M_PI/NB_THETA;
+- h = (0.2 + cos (radian) / 15.0 * sin(radian * 2.0 + 12.123)) * screen_coef;
+- data->h_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian));
+- data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian));
+- }
+-}
+-
+-static void set_motif(ConvData *data, Motif motif)
+-{
+- int i,j;
+- for (i=0;i<CONV_MOTIF_W;++i) for (j=0;j<CONV_MOTIF_W;++j)
+- data->conv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1];
+-}
+-
+-static void convolve_init(VisualFX *_this, PluginInfo *info) {
+- ConvData *data;
+- data = (ConvData*)malloc(sizeof(ConvData));
+- _this->fx_data = (void*)data;
+-
+- data->light = secure_f_param("Screen Brightness");
+- data->light.param.fval.max = 300.0f;
+- data->light.param.fval.step = 1.0f;
+- data->light.param.fval.value = 100.0f;
+-
+- data->factor_adj_p = secure_f_param("Flash Intensity");
+- data->factor_adj_p.param.fval.max = 200.0f;
+- data->factor_adj_p.param.fval.step = 1.0f;
+- data->factor_adj_p.param.fval.value = 70.0f;
+-
+- data->factor_p = secure_f_feedback("Factor");
+-
+- data->params = plugin_parameters ("Bright Flash", 5);
+- data->params.params[0] = &data->light;
+- data->params.params[1] = &data->factor_adj_p;
+- data->params.params[2] = 0;
+- data->params.params[3] = &data->factor_p;
+- data->params.params[4] = 0;
+-
+- /* init rotozoom tables */
+- compute_tables(_this, info);
+- data->theta = 0;
+- data->ftheta = 0.0;
+- data->visibility = 1.0;
+- set_motif(data, CONV_MOTIF2);
+- data->inverse_motif = 0;
+-
+- _this->params = &data->params;
+-}
+-
+-static void convolve_free(VisualFX *_this) {
+- free (_this->fx_data);
+-}
+-
+-static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest,
+- PluginInfo *info, int iff)
+-{
+- ConvData *data = (ConvData*)_this->fx_data;
+-
+- int x,y;
+- int i = 0;//info->screen.height * info->screen.width - 1;
+-
+- const int c = data->h_cos [data->theta];
+- const int s = data->h_sin [data->theta];
+-
+- const int xi = -(info->screen.width/2) * c;
+- const int yi = (info->screen.width/2) * s;
+-
+- const int xj = -(info->screen.height/2) * s;
+- const int yj = -(info->screen.height/2) * c;
+-
+- int xprime = xj;
+- int yprime = yj;
+-
+- int ifftab[16];
+- if (data->inverse_motif) {
+- int i;
+- for (i=0;i<16;++i)
+- ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0);
+- }
+- else {
+- int i;
+- for (i=0;i<16;++i)
+- ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0);
+- }
+-
+- for (y=info->screen.height;y--;) {
+- int xtex,ytex;
+-
+- xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2;
+- xprime += s;
+-
+- ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2;
+- yprime += c;
+-
+-#ifdef HAVE_MMX
+- __asm__ __volatile__
+- ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */
+- "\n\t movd %[xtex], %%mm2"
+- "\n\t movd %[ytex], %%mm3"
+- "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */
+- "\n\t movd %[c], %%mm4"
+- "\n\t movd %[s], %%mm6"
+- "\n\t pxor %%mm5, %%mm5"
+- "\n\t psubd %%mm6, %%mm5"
+- "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */
+- "\n\t movd %[motif], %%mm6" /* mm6 = motif */
+-
+- ::[xtex]"g"(xtex) ,[ytex]"g"(ytex)
+- , [c]"g"(c), [s]"g"(s)
+- , [motif] "g"(&data->conv_motif[0][0]));
+-
+- for (x=info->screen.width;x--;)
+- {
+- __asm__ __volatile__
+- (
+- "\n\t movd %[src], %%mm0" /* mm0 = src */
+- "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */
+- "\n\t movd %%esi, %%mm5" /* save esi into mm5 */
+- "\n\t movq %%mm2, %%mm3"
+- "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */
+- "\n\t movd %%mm3, %%eax" /* eax = xtex' */
+-
+- "\n\t psrlq $25, %%mm3"
+- "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */
+-
+- "\n\t andl $127, %%eax"
+- "\n\t andl $16256, %%ecx"
+-
+- "\n\t addl %%ecx, %%eax"
+- "\n\t movd %%mm6, %%esi" /* esi = motif */
+- "\n\t xorl %%ecx, %%ecx"
+- "\n\t movb (%%eax,%%esi), %%cl"
+-
+- "\n\t movl %[ifftab], %%eax"
+- "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */
+- "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */
+-
+- "\n\t punpcklwd %%mm1, %%mm1"
+- "\n\t punpcklbw %%mm7, %%mm0"
+- "\n\t punpckldq %%mm1, %%mm1"
+- "\n\t psrlw $1, %%mm0"
+- "\n\t psrlw $1, %%mm1"
+- "\n\t pmullw %%mm1, %%mm0"
+- "\n\t psrlw $6, %%mm0"
+- "\n\t packuswb %%mm7, %%mm0"
+- "\n\t movd %%mm0, %[dest]"
+- : [dest] "=g" (dest[i].val)
+- : [src] "g" (src[i].val)
+- , [ifftab]"g"(&ifftab[0])
+- : "eax","ecx");
+-
+- i++;
+- }
+-#else
+- for (x=info->screen.width;x--;) {
+-
+- int iff2;
+- unsigned int f0,f1,f2,f3;
+-
+- xtex += c;
+- ytex -= s;
+-
+- iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]];
+-
+-#define sat(a) ((a)>0xFF?0xFF:(a))
+- f0 = src[i].val;
+- f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8;
+- f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8;
+- f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8;
+- dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET);
+-/*
+- f0 = (src[i].cop[0] * iff2) >> 8;
+- f1 = (src[i].cop[1] * iff2) >> 8;
+- f2 = (src[i].cop[2] * iff2) >> 8;
+- f3 = (src[i].cop[3] * iff2) >> 8;
+-
+- dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0;
+- dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1;
+- dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2;
+- dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3;
+-*/
+- i++;
+- }
+-#endif
+- }
+- __asm__ __volatile__ ("\n\t emms");
+-
+- compute_tables(_this, info);
+-}
+-
+-/*
+-#include <stdint.h>
+-
+-static uint64_t GetTick()
+-{
+- uint64_t x;
+- asm volatile ("RDTSC" : "=A" (x));
+- return x;
+-}
+-*/
+-
+-static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) {
+-
+- ConvData *data = (ConvData*)_this->fx_data;
+- float ff;
+- int iff;
+-
+- ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f;
+- iff = (unsigned int)(ff * 256);
+-
+- {
+- double fcycle = (double)info->cycle;
+- double rotate_param, rotate_coef;
+- float INCREASE_RATE = 1.5;
+- float DECAY_RATE = 0.955;
+- if (FVAL(info->sound.last_goom_p) > 0.8)
+- FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE;
+- FVAL(data->factor_p) *= DECAY_RATE;
+-
+- rotate_param = FVAL(info->sound.last_goom_p);
+- if (rotate_param < 0.0)
+- rotate_param = 0.0;
+- rotate_param += FVAL(info->sound.goom_power_p);
+-
+- rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0;
+- data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3));
+- data->theta = ((unsigned int)data->ftheta) % NB_THETA;
+- data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5;
+- if (data->visibility < 0.0) data->visibility = 0.0;
+- data->factor_p.change_listener(&data->factor_p);
+- }
+-
+- if (data->visibility < 0.01) {
+- switch (goom_irand(info->gRandom, 300))
+- {
+- case 1:
+- set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break;
+- case 2:
+- set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break;
+- }
+- }
+-
+- if ((ff > 0.96f) && (ff < 1.04f))
+- memcpy(dest, src, info->screen.size * sizeof(Pixel));
+- else
+- create_output_with_brightness(_this,src,dest,info,iff);
+-/*
+- Benching suite...
+- {
+- uint64_t before, after;
+- double timed;
+- static double stimed = 10000.0;
+- before = GetTick();
+- data->visibility = 1.0;
+- create_output_with_brightness(_this,src,dest,info,iff);
+- after = GetTick();
+- timed = (double)((after-before) / info->screen.size);
+- if (timed < stimed) {
+- stimed = timed;
+- printf ("CLK = %3.0f CPP\n", stimed);
+- }
+- }
+-*/
+-}
+-
+-VisualFX convolve_create(void) {
+- VisualFX vfx = {
+- init: convolve_init,
+- free: convolve_free,
+- apply: convolve_apply,
+- fx_data: 0
+- };
+- return vfx;
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/cpu_info.c /src/cpu_info.c
+--- /home/d4rk/goom2k4-0/src/cpu_info.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/cpu_info.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,71 +0,0 @@
+-/*
+- * cpu_info.c
+- * Goom
+- *
+- * Created by Guillaume Borios on Sun Dec 28 2003.
+- * Copyright (c) 2003 iOS. All rights reserved.
+- *
+- */
+-
+-#include "cpu_info.h"
+-
+-#ifdef CPU_X86
+-#include "mmx.h"
+-#endif
+-
+-#ifdef CPU_POWERPC
+-#include <sys/types.h>
+-#include <stdlib.h>
+-#endif
+-
+-static unsigned int CPU_FLAVOUR = 0;
+-static unsigned int CPU_NUMBER = 1;
+-static unsigned int CPU_DETECTED = 0;
+-
+-static void autoset_cpu_info (void)
+-{
+- CPU_DETECTED = 1;
+-
+-#ifdef CPU_POWERPC
+- int result;
+- size_t size;
+-
+- result = 0;
+- size = 4;
+- if (sysctlbyname("hw.optional.altivec",&result,&size,NULL,NULL) == 0)
+- {
+- if (result != 0) CPU_FLAVOUR |= CPU_OPTION_ALTIVEC;
+- }
+-
+- result = 0;
+- size = 4;
+- if (sysctlbyname("hw.optional.64bitops",&result,&size,NULL,NULL) == 0)
+- {
+- if (result != 0) CPU_FLAVOUR |= CPU_OPTION_64_BITS;
+- }
+-
+- result = 0;
+- size = 4;
+- if (sysctlbyname("hw.ncpu",&result,&size,NULL,NULL) == 0)
+- {
+- if (result != 0) CPU_NUMBER = result;
+- }
+-#endif /* CPU_POWERPC */
+-
+-#ifdef CPU_X86
+- if (mmx_supported()) CPU_FLAVOUR |= CPU_OPTION_MMX;
+- if (xmmx_supported()) CPU_FLAVOUR |= CPU_OPTION_XMMX;
+-#endif /* CPU_X86 */
+-}
+-
+-unsigned int cpu_flavour (void)
+-{
+- if (CPU_DETECTED == 0) autoset_cpu_info();
+- return CPU_FLAVOUR;
+-}
+-
+-unsigned int cpu_number (void)
+-{
+- if (CPU_DETECTED == 0) autoset_cpu_info();
+- return CPU_NUMBER;
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/cpu_info.h /src/cpu_info.h
+--- /home/d4rk/goom2k4-0/src/cpu_info.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/cpu_info.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,34 +0,0 @@
+-#ifndef CPU_INFO_H
+-#define CPU_INFO_H
+-
+-/*
+- * cpu_info.h
+- * Goom
+- *
+- * Created by Guillaume Borios on Sun Dec 28 2003.
+- * Copyright (c) 2003 iOS. All rights reserved.
+- *
+- */
+-
+-#ifdef HAVE_MMX
+-#ifndef CPU_X86
+-#define CPU_X86
+-#endif
+-#endif
+-
+-/* Returns the CPU flavour described with the constants below */
+-unsigned int cpu_flavour (void);
+-
+-#define CPU_OPTION_ALTIVEC 0x1
+-#define CPU_OPTION_64_BITS 0x2
+-#define CPU_OPTION_MMX 0x4
+-#define CPU_OPTION_XMMX 0x8
+-#define CPU_OPTION_SSE 0x10
+-#define CPU_OPTION_SSE2 0x20
+-#define CPU_OPTION_3DNOW 0x40
+-
+-
+-/* Returns the CPU number */
+-unsigned int cpu_number (void);
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/default_script.goom /src/default_script.goom
+--- /home/d4rk/goom2k4-0/src/default_script.goom 2005-02-07 06:46:41.000000000 -0700
++++ /src/default_script.goom 1969-12-31 17:00:00.000000000 -0700
+@@ -1,34 +0,0 @@
+-/*
+- * specify here high-level properties of a flash.
+- */
+-
+-flash_occurs when (Sound.Goom_Detection > 50%) and (Sound.Sound_Speed > 14%);
+-
+-max_flash = 200%;
+-slow_down_coef = 96%;
+-
+-/*
+- * Here you have the fx's state machin behaviour.
+- */
+-
+-(locked) ? locked--;
+-
+-(not locked) and (flash_occurs) ?
+-{
+- cur_power = Sound_Speed.Goom_Detection;
+- start flashing_up;
+-}
+-
+-(not locked) and (flashing_up) ?
+-{
+- factor += cur_power * 2 * (speedvar / 4 + 0.95);
+- if (factor > max_flash) factor = max_flash;
+-
+- (not flash_occurs) ?
+- {
+- locked = 200;
+- stop flashing_up;
+- }
+-}
+-
+-factor *= slow_down_coef;
+diff -Naur /home/d4rk/goom2k4-0/src/default_scripts.h /src/default_scripts.h
+--- /home/d4rk/goom2k4-0/src/default_scripts.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/default_scripts.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,6 +0,0 @@
+-#ifndef _DEFAULT_SCRIPTS_H
+-#define _DEFAULT_SCRIPTS_H
+-
+-#define GOOM_MAIN_SCRIPT ""
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/DOCODE.TXT /src/DOCODE.TXT
+--- /home/d4rk/goom2k4-0/src/DOCODE.TXT 2005-02-07 06:46:41.000000000 -0700
++++ /src/DOCODE.TXT 1969-12-31 17:00:00.000000000 -0700
+@@ -1,55 +0,0 @@
+-Les différentes données..
+------
+-
+-typedef struct {
+- int32 * buf;
+- int32 width;
+- int32 height;
+- int32 size;
+-
+- int32 * realstart;
+-} Surface;
+------
+-
+->> taille du buffer de zoom
+-guint32 mmx_zoom_size;
+------
+-
+->> les buffers bruts contiennent les px et py de chaque point
+->> => brutS[0] = px0, brutS[1] = py0, brutS[2] = px1, [...]
+-
+-signed int *brutS = 0, *freebrutS = 0; // source
+-signed int *brutD = 0, *freebrutD = 0; // dest
+-signed int *brutT = 0, *freebrutT = 0; // temp (en cours de génération)
+-
+->> pointeur vers p1
+-guint32 *expix1 = 0;
+->> pointeur vers p2
+-guint32 *expix2 = 0;
+-
+->> largeur d'une ligne = prevX
+-guint32 zoom_width;
+-
+->> largeur et hauteur des differents buffers.
+-int prevX=0,prevY=0;
+------
+-
+->> buffratio est un fixpoint : 16,16
+->> valeur normalement comprise entre 0 et 1,
+->> soit 0<=buffratio<=BUFFPOINTMASK
+-
+-int buffratio = 0;
+-
+-#define BUFFPOINTNB 16
+-#define BUFFPOINTMASK 0xffff
+-#define BUFFINCR 0xff
+------
+-
+-#define sqrtperte 16
+->> faire : a % sqrtperte <=> a & pertemask
+-#define PERTEMASK 0xf
+->> faire : a / sqrtperte <=> a >> PERTEDEC
+-#define PERTEDEC 4
+------
+-
+-int precalCoef[16][16];
+diff -Naur /home/d4rk/goom2k4-0/src/drawmethods.c /src/drawmethods.c
+--- /home/d4rk/goom2k4-0/src/drawmethods.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/drawmethods.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,203 +0,0 @@
+-#include "drawmethods.h"
+-
+-#define DRAWMETHOD_PLUS(_out,_backbuf,_col) \
+-{\
+- int tra=0,i=0;\
+- unsigned char *bra = (unsigned char*)&(_backbuf);\
+- unsigned char *dra = (unsigned char*)&(_out);\
+- unsigned char *cra = (unsigned char*)&(_col);\
+- for (;i<4;i++) {\
+- tra = *cra;\
+- tra += *bra;\
+- if (tra>255) tra=255;\
+- *dra = tra;\
+- ++dra;++cra;++bra;\
+- }\
+-}
+-
+-#define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col)
+-
+-void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny)
+-{
+- int x, y, dx, dy, yy, xx;
+- Pixel *p;
+-
+- if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) return;
+-
+- /* clip to top edge
+- if ((y1 < 0) && (y2 < 0))
+- return;
+-
+- if (y1 < 0) {
+- x1 += (y1 * (x1 - x2)) / (y2 - y1);
+- y1 = 0;
+- }
+- if (y2 < 0) {
+- x2 += (y2 * (x1 - x2)) / (y2 - y1);
+- y2 = 0;
+- }
+-
+- clip to bottom edge
+- if ((y1 >= screeny) && (y2 >= screeny))
+- return;
+- if (y1 >= screeny) {
+- x1 -= ((screeny - y1) * (x1 - x2)) / (y2 - y1);
+- y1 = screeny - 1;
+- }
+- if (y2 >= screeny) {
+- x2 -= ((screeny - y2) * (x1 - x2)) / (y2 - y1);
+- y2 = screeny - 1;
+- }
+- clip to left edge
+- if ((x1 < 0) && (x2 < 0))
+- return;
+- if (x1 < 0) {
+- y1 += (x1 * (y1 - y2)) / (x2 - x1);
+- x1 = 0;
+- }
+- if (x2 < 0) {
+- y2 += (x2 * (y1 - y2)) / (x2 - x1);
+- x2 = 0;
+- }
+- clip to right edge
+- if ((x1 >= screenx) && (x2 >= screenx))
+- return;
+- if (x1 >= screenx) {
+- y1 -= ((screenx - x1) * (y1 - y2)) / (x2 - x1);
+- x1 = screenx - 1;
+- }
+- if (x2 >= screenx) {
+- y2 -= ((screenx - x2) * (y1 - y2)) / (x2 - x1);
+- x2 = screenx - 1;
+- }
+- */
+-
+- dx = x2 - x1;
+- dy = y2 - y1;
+- if (x1 > x2) {
+- int tmp;
+-
+- tmp = x1;
+- x1 = x2;
+- x2 = tmp;
+- tmp = y1;
+- y1 = y2;
+- y2 = tmp;
+- dx = x2 - x1;
+- dy = y2 - y1;
+- }
+-
+- /* vertical line */
+- if (dx == 0) {
+- if (y1 < y2) {
+- p = &(data[(screenx * y1) + x1]);
+- for (y = y1; y <= y2; y++) {
+- DRAWMETHOD;
+- p += screenx;
+- }
+- }
+- else {
+- p = &(data[(screenx * y2) + x1]);
+- for (y = y2; y <= y1; y++) {
+- DRAWMETHOD;
+- p += screenx;
+- }
+- }
+- return;
+- }
+- /* horizontal line */
+- if (dy == 0) {
+- if (x1 < x2) {
+- p = &(data[(screenx * y1) + x1]);
+- for (x = x1; x <= x2; x++) {
+- DRAWMETHOD;
+- p++;
+- }
+- return;
+- }
+- else {
+- p = &(data[(screenx * y1) + x2]);
+- for (x = x2; x <= x1; x++) {
+- DRAWMETHOD;
+- p++;
+- }
+- return;
+- }
+- }
+- /* 1 */
+- /* \ */
+- /* \ */
+- /* 2 */
+- if (y2 > y1) {
+- /* steep */
+- if (dy > dx) {
+- dx = ((dx << 16) / dy);
+- x = x1 << 16;
+- for (y = y1; y <= y2; y++) {
+- xx = x >> 16;
+- p = &(data[(screenx * y) + xx]);
+- DRAWMETHOD;
+- if (xx < (screenx - 1)) {
+- p++;
+- /* DRAWMETHOD; */
+- }
+- x += dx;
+- }
+- return;
+- }
+- /* shallow */
+- else {
+- dy = ((dy << 16) / dx);
+- y = y1 << 16;
+- for (x = x1; x <= x2; x++) {
+- yy = y >> 16;
+- p = &(data[(screenx * yy) + x]);
+- DRAWMETHOD;
+- if (yy < (screeny - 1)) {
+- p += screeny;
+- /* DRAWMETHOD; */
+- }
+- y += dy;
+- }
+- }
+- }
+- /* 2 */
+- /* / */
+- /* / */
+- /* 1 */
+- else {
+- /* steep */
+- if (-dy > dx) {
+- dx = ((dx << 16) / -dy);
+- x = (x1 + 1) << 16;
+- for (y = y1; y >= y2; y--) {
+- xx = x >> 16;
+- p = &(data[(screenx * y) + xx]);
+- DRAWMETHOD;
+- if (xx < (screenx - 1)) {
+- p--;
+- /* DRAWMETHOD; */
+- }
+- x += dx;
+- }
+- return;
+- }
+- /* shallow */
+- else {
+- dy = ((dy << 16) / dx);
+- y = y1 << 16;
+- for (x = x1; x <= x2; x++) {
+- yy = y >> 16;
+- p = &(data[(screenx * yy) + x]);
+- DRAWMETHOD;
+- if (yy < (screeny - 1)) {
+- p += screeny;
+- /* DRAWMETHOD; */
+- }
+- y += dy;
+- }
+- return;
+- }
+- }
+-}
+-
+diff -Naur /home/d4rk/goom2k4-0/src/drawmethods.h /src/drawmethods.h
+--- /home/d4rk/goom2k4-0/src/drawmethods.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/drawmethods.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,9 +0,0 @@
+-#ifndef _DRAWMETHODS_H
+-#define _DRAWMETHODS_H
+-
+-#include "goom_config.h"
+-#include "goom_graphic.h"
+-
+-void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny);
+-
+-#endif /* _DRAWMETHODS_H */
+diff -Naur /home/d4rk/goom2k4-0/src/filters.c /src/filters.c
+--- /home/d4rk/goom2k4-0/src/filters.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/filters.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,767 +0,0 @@
+-// --- CHUI EN TRAIN DE SUPPRIMER LES EXTERN RESOLX ET C_RESOLY ---
+-
+-/* filter.c version 0.7
+-* contient les filtres applicable a un buffer
+-* creation : 01/10/2000
+-* -ajout de sinFilter()
+-* -ajout de zoomFilter()
+-* -copie de zoomFilter() en zoomFilterRGB(), gerant les 3 couleurs
+-* -optimisation de sinFilter (utilisant une table de sin)
+-* -asm
+-* -optimisation de la procedure de generation du buffer de transformation
+-* la vitesse est maintenant comprise dans [0..128] au lieu de [0..100]
+-*/
+-
+-/* #define _DEBUG_PIXEL */
+-
+-#include <string.h>
+-#include <stdlib.h>
+-#include <math.h>
+-#include <stdio.h>
+-#include <inttypes.h>
+-
+-#include "goom_filters.h"
+-#include "goom_graphic.h"
+-#include "goom_tools.h"
+-#include "goom_plugin_info.h"
+-#include "goom_fx.h"
+-#include "v3d.h"
+-
+-/* TODO : MOVE THIS AWAY !!! */
+-/* jeko: j'ai essayer de le virer, mais si on veut les laisser inline c'est un peu lourdo... */
+-static inline void setPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color c)
+-{
+- Pixel i;
+-
+- i.channels.b = c.b;
+- i.channels.g = c.v;
+- i.channels.r = c.r;
+- *(buffer + (x + y * goomInfo->screen.width)) = i;
+-}
+-
+-static inline void setPixelRGB_ (Pixel *buffer, Uint x, Color c)
+-{
+- buffer[x].channels.r = c.r;
+- buffer[x].channels.g = c.v;
+- buffer[x].channels.b = c.b;
+-}
+-
+-static inline void getPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color * c)
+-{
+- Pixel i = *(buffer + (x + y * goomInfo->screen.width));
+- c->b = i.channels.b;
+- c->v = i.channels.g;
+- c->r = i.channels.r;
+-}
+-
+-static inline void getPixelRGB_ (Pixel *buffer, Uint x, Color * c)
+-{
+- Pixel i = *(buffer + x);
+- c->b = i.channels.b;
+- c->v = i.channels.g;
+- c->r = i.channels.r;
+-}
+-/* END TODO */
+-
+-
+-/* DEPRECATED */
+-// retourne x>>s , en testant le signe de x
+-//#define ShiftRight(_x,_s) (((_x)<0) ? -(-(_x)>>(_s)) : ((_x)>>(_s)))
+-//#define EFFECT_DISTORS 4
+-//#define EFFECT_DISTORS_SL 2
+-//#define INTERLACE_ADD 9
+-//#define INTERLACE_AND 0xf
+-/* END DEPRECATED */
+-
+-#define BUFFPOINTNB 16
+-#define BUFFPOINTNBF 16.0f
+-#define BUFFPOINTMASK 0xffff
+-
+-#define sqrtperte 16
+-/* faire : a % sqrtperte <=> a & pertemask */
+-#define PERTEMASK 0xf
+-/* faire : a / sqrtperte <=> a >> PERTEDEC */
+-#define PERTEDEC 4
+-
+-/* pure c version of the zoom filter */
+-static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, int buffratio, int precalCoef[BUFFPOINTNB][BUFFPOINTNB]);
+-
+-/* simple wrapper to give it the same proto than the others */
+-void zoom_filter_c (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]) {
+- c_zoom(src, dest, sizeX, sizeY, brutS, brutD, buffratio, precalCoef);
+-}
+-
+-static void generatePrecalCoef (int precalCoef[BUFFPOINTNB][BUFFPOINTNB]);
+-
+-
+-typedef struct _ZOOM_FILTER_FX_WRAPPER_DATA {
+-
+- PluginParam enabled_bp;
+- PluginParameters params;
+-
+- unsigned int *coeffs, *freecoeffs;
+-
+- signed int *brutS, *freebrutS; /* source */
+- signed int *brutD, *freebrutD; /* dest */
+- signed int *brutT, *freebrutT; /* temp (en cours de generation) */
+-
+- guint32 zoom_width;
+-
+- unsigned int prevX, prevY;
+-
+- float general_speed;
+- int reverse; /* reverse the speed */
+- char theMode;
+- int waveEffect;
+- int hypercosEffect;
+- int vPlaneEffect;
+- int hPlaneEffect;
+- char noisify;
+- int middleX, middleY;
+-
+- int mustInitBuffers;
+- int interlace_start;
+-
+- /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */
+- int buffratio;
+- int *firedec;
+-
+- /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */
+- int precalCoef[BUFFPOINTNB][BUFFPOINTNB];
+-
+- /** calculatePXandPY statics */
+- int wave;
+- int wavesp;
+-
+-} ZoomFilterFXWrapperData;
+-
+-
+-
+-
+-static inline v2g zoomVector(ZoomFilterFXWrapperData *data, float X, float Y)
+-{
+- v2g vecteur;
+- float vx, vy;
+- float sq_dist = X*X + Y*Y;
+-
+- /* sx = (X < 0.0f) ? -1.0f : 1.0f;
+- sy = (Y < 0.0f) ? -1.0f : 1.0f;
+- */
+- float coefVitesse = (1.0f+ data->general_speed) / 50.0f;
+-
+- // Effects
+-
+- /* Centralized FX */
+-
+- switch (data->theMode) {
+- case CRYSTAL_BALL_MODE:
+- coefVitesse -= (sq_dist-0.3f)/15.0f;
+- break;
+- case AMULETTE_MODE:
+- coefVitesse += sq_dist * 3.5f;
+- break;
+- case WAVE_MODE:
+- coefVitesse += sin(sq_dist*20.0f) / 100.0f;
+- break;
+- case SCRUNCH_MODE:
+- coefVitesse += sq_dist / 10.0f;
+- break;
+- //case HYPERCOS1_MODE:
+- break;
+- //case HYPERCOS2_MODE:
+- break;
+- //case YONLY_MODE:
+- break;
+- case SPEEDWAY_MODE:
+- coefVitesse *= 4.0f * Y;
+- break;
+- default:
+- break;
+- }
+-
+- if (coefVitesse < -2.01f)
+- coefVitesse = -2.01f;
+- if (coefVitesse > 2.01f)
+- coefVitesse = 2.01f;
+-
+- vx = coefVitesse * X;
+- vy = coefVitesse * Y;
+-
+- /* Amulette 2 */
+- // vx = X * tan(dist);
+- // vy = Y * tan(dist);
+-
+- /* Rotate */
+- //vx = (X+Y)*0.1;
+- //vy = (Y-X)*0.1;
+-
+-
+- // Effects adds-on
+-
+- /* Noise */
+- if (data->noisify)
+- {
+- vx += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f;
+- vy += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f;
+- }
+-
+- /* Hypercos */
+- if (data->hypercosEffect)
+- {
+- vx += sin(Y*10.0f)/120.0f;
+- vy += sin(X*10.0f)/120.0f;
+- }
+-
+- /* H Plane */
+- if (data->hPlaneEffect) vx += Y * 0.0025f * data->hPlaneEffect;
+-
+- /* V Plane */
+- if (data->vPlaneEffect) vy += X * 0.0025f * data->vPlaneEffect;
+-
+- /* TODO : Water Mode */
+- // if (data->waveEffect)
+-
+- vecteur.x = vx;
+- vecteur.y = vy;
+-
+- return vecteur;
+-}
+-
+-
+-/*
+- * Makes a stripe of a transform buffer (brutT)
+- *
+- * The transform is (in order) :
+- * Translation (-data->middleX, -data->middleY)
+- * Homothetie (Center : 0,0 Coeff : 2/data->prevX)
+- */
+-static void makeZoomBufferStripe(ZoomFilterFXWrapperData * data, int INTERLACE_INCR)
+-{
+- // Position of the pixel to compute in pixmap coordinates
+- Uint x, y;
+- // Where (verticaly) to stop generating the buffer stripe
+- int maxEnd = (data->interlace_start + INTERLACE_INCR);
+- // Ratio from pixmap to normalized coordinates
+- float ratio = 2.0f/((float)data->prevX);
+- // Ratio from normalized to virtual pixmap coordinates
+- float inv_ratio = BUFFPOINTNBF/ratio;
+- float min = ratio/BUFFPOINTNBF;
+- // Y position of the pixel to compute in normalized coordinates
+- float Y = ((float)(data->interlace_start - data->middleY)) * ratio;
+-
+- maxEnd = data->prevY;
+- if (maxEnd > (data->interlace_start + INTERLACE_INCR))
+- maxEnd = (data->interlace_start + INTERLACE_INCR);
+-
+- for (y = data->interlace_start; (y < data->prevY) && ((signed int)y<maxEnd); y++) {
+- Uint premul_y_prevX = y * data->prevX * 2;
+- float X = - ((float)data->middleX) * ratio;
+- for (x = 0; x < data->prevX; x++)
+- {
+- v2g vector = zoomVector (data, X, Y);
+-
+- /* Finish and avoid null displacement */
+- if (fabs(vector.x) < min) vector.x = (vector.x < 0.0f) ? -min : min;
+- if (fabs(vector.y) < min) vector.y = (vector.y < 0.0f) ? -min : min;
+-
+- data->brutT[premul_y_prevX] = ((int)((X-vector.x)*inv_ratio)+((int)(data->middleX*BUFFPOINTNB)));
+- data->brutT[premul_y_prevX+1] = ((int)((Y-vector.y)*inv_ratio)+((int)(data->middleY*BUFFPOINTNB)));
+- premul_y_prevX += 2;
+- X += ratio;
+- }
+- Y += ratio;
+- }
+- data->interlace_start += INTERLACE_INCR;
+- if (y >= data->prevY-1) data->interlace_start = -1;
+-}
+-
+-
+-/*
+- * calculer px et py en fonction de x,y,middleX,middleY et theMode
+- * px et py indique la nouvelle position (en sqrtperte ieme de pixel)
+- * (valeur * 16)
+-
+- inline void calculatePXandPY (PluginInfo *goomInfo, ZoomFilterFXWrapperData *data, int x, int y, int *px, int *py)
+- {
+- if (data->theMode == WATER_MODE) {
+- int yy;
+-
+- yy = y + goom_irand(goomInfo->gRandom, 4) - goom_irand(goomInfo->gRandom, 4) + data->wave / 10;
+- if (yy < 0)
+- yy = 0;
+- if (yy >= (signed int)goomInfo->screen.height)
+- yy = goomInfo->screen.height - 1;
+-
+- *px = (x << 4) + data->firedec[yy] + (data->wave / 10);
+- *py = (y << 4) + 132 - ((data->vitesse < 131) ? data->vitesse : 130);
+-
+- data->wavesp += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3);
+- if (data->wave < -10)
+- data->wavesp += 2;
+- if (data->wave > 10)
+- data->wavesp -= 2;
+- data->wave += (data->wavesp / 10) + goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3);
+- if (data->wavesp > 100)
+- data->wavesp = (data->wavesp * 9) / 10;
+- }
+- else {
+- int dist = 0, vx9, vy9;
+- int vx, vy;
+- int ppx, ppy;
+- int fvitesse = data->vitesse << 4;
+-
+- if (data->noisify) {
+- x += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify);
+- y += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify);
+- }
+- vx = (x - data->middleX) << 9;
+- vy = (y - data->middleY) << 9;
+-
+- if (data->hPlaneEffect)
+- vx += data->hPlaneEffect * (y - data->middleY);
+-
+- if (data->vPlaneEffect)
+- vy += data->vPlaneEffect * (x - data->middleX);
+-
+- if (data->waveEffect) {
+- fvitesse *=
+- 1024 +
+- ShiftRight (goomInfo->sintable
+- [(unsigned short) (dist * 0xffff + EFFECT_DISTORS)], 6);
+- fvitesse /= 1024;
+- }
+-
+- if (data->hypercosEffect) {
+- vx += ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1);
+- vy += ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1);
+- }
+-
+- vx9 = ShiftRight (vx, 9);
+- vy9 = ShiftRight (vy, 9);
+- dist = vx9 * vx9 + vy9 * vy9;
+-
+- switch (data->theMode) {
+- case WAVE_MODE:
+- fvitesse *=
+- 1024 +
+- ShiftRight (goomInfo->sintable
+- [(unsigned short) (dist * 0xffff * EFFECT_DISTORS)], 6);
+- fvitesse>>=10;
+- break;
+- case CRYSTAL_BALL_MODE:
+- fvitesse += (dist >> (10-EFFECT_DISTORS_SL));
+- break;
+- case AMULETTE_MODE:
+- fvitesse -= (dist >> (4 - EFFECT_DISTORS_SL));
+- break;
+- case SCRUNCH_MODE:
+- fvitesse -= (dist >> (10 - EFFECT_DISTORS_SL));
+- break;
+- case HYPERCOS1_MODE:
+- vx = vx + ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1);
+- vy = vy + ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1);
+- break;
+- case HYPERCOS2_MODE:
+- vx =
+- vx + ShiftRight (goomInfo->sintable[(-ShiftRight (vy, 1) + dist) & 0xffff], 0);
+- vy =
+- vy + ShiftRight (goomInfo->sintable[(ShiftRight (vx, 1) + dist) & 0xffff], 0);
+- fvitesse = 128 << 4;
+- break;
+- case YONLY_MODE:
+- fvitesse *= 1024 + ShiftRight (goomInfo->sintable[vy & 0xffff], 6);
+- fvitesse >>= 10;
+- break;
+- case SPEEDWAY_MODE:
+- fvitesse -= (ShiftRight(vy,10-EFFECT_DISTORS_SL));
+- break;
+- }
+-
+- if (fvitesse < -3024)
+- fvitesse = -3024;
+-
+- if (vx < 0) // pb avec decalage sur nb negatif
+- ppx = -(-(vx * fvitesse) >> 16);
+- // 16 = 9 + 7 (7 = nb chiffre virgule de vitesse * (v = 128 => immobile)
+- // * * * * * 9 = nb chiffre virgule de vx)
+- else
+- ppx = ((vx * fvitesse) >> 16);
+-
+- if (vy < 0)
+- ppy = -(-(vy * fvitesse) >> 16);
+- else
+- ppy = ((vy * fvitesse) >> 16);
+-
+- *px = (data->middleX << 4) + ppx;
+- *py = (data->middleY << 4) + ppy;
+- }
+- }
+- */
+-
+-
+-
+-static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD,
+- int buffratio, int precalCoef[16][16])
+-{
+- int myPos, myPos2;
+- Color couleur;
+-
+- unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC;
+-
+- int bufsize = prevX * prevY * 2;
+- int bufwidth = prevX;
+-
+- expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0;
+-
+- for (myPos = 0; myPos < bufsize; myPos += 2) {
+- Color col1, col2, col3, col4;
+- int c1, c2, c3, c4, px, py;
+- int pos;
+- int coeffs;
+-
+- int brutSmypos = brutS[myPos];
+-
+- myPos2 = myPos + 1;
+-
+- px = brutSmypos + (((brutD[myPos] - brutSmypos) * buffratio) >> BUFFPOINTNB);
+- brutSmypos = brutS[myPos2];
+- py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB);
+-
+- if ((py >= ay) || (px >= ax)) {
+- pos = coeffs = 0;
+- } else {
+- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC));
+- /* coef en modulo 15 */
+- coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK];
+- }
+- getPixelRGB_ (expix1, pos, &col1);
+- getPixelRGB_ (expix1, pos + 1, &col2);
+- getPixelRGB_ (expix1, pos + bufwidth, &col3);
+- getPixelRGB_ (expix1, pos + bufwidth + 1, &col4);
+-
+- c1 = coeffs;
+- c2 = (c1 >> 8) & 0xFF;
+- c3 = (c1 >> 16) & 0xFF;
+- c4 = (c1 >> 24) & 0xFF;
+- c1 = c1 & 0xff;
+-
+- couleur.r = col1.r * c1 + col2.r * c2 + col3.r * c3 + col4.r * c4;
+- if (couleur.r > 5)
+- couleur.r -= 5;
+- couleur.r >>= 8;
+-
+- couleur.v = col1.v * c1 + col2.v * c2 + col3.v * c3 + col4.v * c4;
+- if (couleur.v > 5)
+- couleur.v -= 5;
+- couleur.v >>= 8;
+-
+- couleur.b = col1.b * c1 + col2.b * c2 + col3.b * c3 + col4.b * c4;
+- if (couleur.b > 5)
+- couleur.b -= 5;
+- couleur.b >>= 8;
+-
+- setPixelRGB_ (expix2, myPos >> 1, couleur);
+- }
+-}
+-
+-/** generate the water fx horizontal direction buffer */
+-static void generateTheWaterFXHorizontalDirectionBuffer(PluginInfo *goomInfo, ZoomFilterFXWrapperData *data) {
+-
+- int loopv;
+- int decc = goom_irand(goomInfo->gRandom, 8) - 4;
+- int spdc = goom_irand(goomInfo->gRandom, 8) - 4;
+- int accel = goom_irand(goomInfo->gRandom, 8) - 4;
+-
+- for (loopv = data->prevY; loopv != 0;) {
+-
+- loopv--;
+- data->firedec[loopv] = decc;
+- decc += spdc / 10;
+- spdc += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3);
+-
+- if (decc > 4)
+- spdc -= 1;
+- if (decc < -4)
+- spdc += 1;
+-
+- if (spdc > 30)
+- spdc = spdc - goom_irand(goomInfo->gRandom, 3) + accel / 10;
+- if (spdc < -30)
+- spdc = spdc + goom_irand(goomInfo->gRandom, 3) + accel / 10;
+-
+- if (decc > 8 && spdc > 1)
+- spdc -= goom_irand(goomInfo->gRandom, 3) - 2;
+-
+- if (decc < -8 && spdc < -1)
+- spdc += goom_irand(goomInfo->gRandom, 3) + 2;
+-
+- if (decc > 8 || decc < -8)
+- decc = decc * 8 / 9;
+-
+- accel += goom_irand(goomInfo->gRandom, 2) - goom_irand(goomInfo->gRandom, 2);
+- if (accel > 20)
+- accel -= 2;
+- if (accel < -20)
+- accel += 2;
+- }
+-}
+-
+-
+-
+-/**
+-* Main work for the dynamic displacement map.
+- *
+- * Reads data from pix1, write to pix2.
+- *
+- * Useful datas for this FX are stored in ZoomFilterData.
+- *
+- * If you think that this is a strange function name, let me say that a long time ago,
+- * there has been a slow version and a gray-level only one. Then came these function,
+- * fast and workin in RGB colorspace ! nice but it only was applying a zoom to the image.
+- * So that is why you have this name, for the nostalgy of the first days of goom
+- * when it was just a tiny program writen in Turbo Pascal on my i486...
+- */
+-void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, Uint resx, Uint resy, int switchIncr, float switchMult)
+-{
+- Uint x, y;
+-
+- ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)goomInfo->zoomFilter_fx.fx_data;
+-
+- if (!BVAL(data->enabled_bp)) return;
+-
+- /** changement de taille **/
+- if ((data->prevX != resx) || (data->prevY != resy)) {
+- data->prevX = resx;
+- data->prevY = resy;
+-
+- if (data->brutS) free (data->freebrutS);
+- data->brutS = 0;
+- if (data->brutD) free (data->freebrutD);
+- data->brutD = 0;
+- if (data->brutT) free (data->freebrutT);
+- data->brutT = 0;
+-
+- data->middleX = resx / 2;
+- data->middleY = resy / 2;
+- data->mustInitBuffers = 1;
+- if (data->firedec) free (data->firedec);
+- data->firedec = 0;
+- }
+-
+- if (data->interlace_start != -2)
+- zf = NULL;
+-
+- /** changement de config **/
+- if (zf) {
+- data->reverse = zf->reverse;
+- data->general_speed = (float)(zf->vitesse-128)/128.0f;
+- if (data->reverse) data->general_speed = -data->general_speed;
+- data->middleX = zf->middleX;
+- data->middleY = zf->middleY;
+- data->theMode = zf->mode;
+- data->hPlaneEffect = zf->hPlaneEffect;
+- data->vPlaneEffect = zf->vPlaneEffect;
+- data->waveEffect = zf->waveEffect;
+- data->hypercosEffect = zf->hypercosEffect;
+- data->noisify = zf->noisify;
+- data->interlace_start = 0;
+- }
+-
+-
+- if (data->mustInitBuffers) {
+-
+- data->mustInitBuffers = 0;
+- data->freebrutS = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int));
+- data->brutS = (gint32 *) ((1 + ((uintptr_t) (data->freebrutS)) / 128) * 128);
+-
+- data->freebrutD = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int));
+- data->brutD = (gint32 *) ((1 + ((uintptr_t) (data->freebrutD)) / 128) * 128);
+-
+- data->freebrutT = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int));
+- data->brutT = (gint32 *) ((1 + ((uintptr_t) (data->freebrutT)) / 128) * 128);
+-
+- data->buffratio = 0;
+-
+- data->firedec = (int *) malloc (data->prevY * sizeof (int));
+- generateTheWaterFXHorizontalDirectionBuffer(goomInfo, data);
+-
+- data->interlace_start = 0;
+- makeZoomBufferStripe(data,resy);
+-
+- /* Copy the data from temp to dest and source */
+- memcpy(data->brutS,data->brutT,resx * resy * 2 * sizeof(int));
+- memcpy(data->brutD,data->brutT,resx * resy * 2 * sizeof(int));
+- }
+-
+- /* generation du buffer de trans */
+- if (data->interlace_start == -1) {
+-
+- /* sauvegarde de l'etat actuel dans la nouvelle source
+- * TODO: write that in MMX (has been done in previous version, but did not follow some new fonctionnalities) */
+- y = data->prevX * data->prevY * 2;
+- for (x = 0; x < y; x += 2) {
+- int brutSmypos = data->brutS[x];
+- int x2 = x + 1;
+-
+- data->brutS[x] = brutSmypos + (((data->brutD[x] - brutSmypos) * data->buffratio) >> BUFFPOINTNB);
+- brutSmypos = data->brutS[x2];
+- data->brutS[x2] = brutSmypos + (((data->brutD[x2] - brutSmypos) * data->buffratio) >> BUFFPOINTNB);
+- }
+- data->buffratio = 0;
+- }
+-
+- if (data->interlace_start == -1) {
+- signed int * tmp;
+- tmp = data->brutD;
+- data->brutD=data->brutT;
+- data->brutT=tmp;
+- tmp = data->freebrutD;
+- data->freebrutD=data->freebrutT;
+- data->freebrutT=tmp;
+- data->interlace_start = -2;
+- }
+-
+- if (data->interlace_start>=0)
+- {
+- /* creation de la nouvelle destination */
+- makeZoomBufferStripe(data,resy/16);
+- }
+-
+- if (switchIncr != 0) {
+- data->buffratio += switchIncr;
+- if (data->buffratio > BUFFPOINTMASK)
+- data->buffratio = BUFFPOINTMASK;
+- }
+-
+- if (switchMult != 1.0f) {
+- data->buffratio = (int) ((float) BUFFPOINTMASK * (1.0f - switchMult) +
+- (float) data->buffratio * switchMult);
+- }
+-
+- data->zoom_width = data->prevX;
+-
+- goomInfo->methods.zoom_filter (data->prevX, data->prevY, pix1, pix2,
+- data->brutS, data->brutD, data->buffratio, data->precalCoef);
+-}
+-
+-static void generatePrecalCoef (int precalCoef[16][16])
+-{
+- int coefh, coefv;
+-
+- for (coefh = 0; coefh < 16; coefh++) {
+- for (coefv = 0; coefv < 16; coefv++) {
+-
+- int i;
+- int diffcoeffh;
+- int diffcoeffv;
+-
+- diffcoeffh = sqrtperte - coefh;
+- diffcoeffv = sqrtperte - coefv;
+-
+- if (!(coefh || coefv)) {
+- i = 255;
+- }
+- else {
+- int i1, i2, i3, i4;
+-
+- i1 = diffcoeffh * diffcoeffv;
+- i2 = coefh * diffcoeffv;
+- i3 = diffcoeffh * coefv;
+- i4 = coefh * coefv;
+-
+- // TODO: faire mieux...
+- if (i1) i1--;
+- if (i2) i2--;
+- if (i3) i3--;
+- if (i4) i4--;
+-
+- i = (i1) | (i2 << 8) | (i3 << 16) | (i4 << 24);
+- }
+- precalCoef[coefh][coefv] = i;
+- }
+- }
+-}
+-
+-/* VisualFX Wrapper */
+-
+-static void zoomFilterVisualFXWrapper_init (struct _VISUAL_FX *_this, PluginInfo *info)
+-{
+- ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)malloc(sizeof(ZoomFilterFXWrapperData));
+-
+- data->coeffs = 0;
+- data->freecoeffs = 0;
+- data->brutS = 0;
+- data->freebrutS = 0;
+- data->brutD = 0;
+- data->freebrutD = 0;
+- data->brutT = 0;
+- data->freebrutT = 0;
+- data->prevX = 0;
+- data->prevY = 0;
+-
+- data->mustInitBuffers = 1;
+- data->interlace_start = -2;
+-
+- data->general_speed = 0.0f;
+- data->reverse = 0;
+- data->theMode = AMULETTE_MODE;
+- data->waveEffect = 0;
+- data->hypercosEffect = 0;
+- data->vPlaneEffect = 0;
+- data->hPlaneEffect = 0;
+- data->noisify = 2;
+-
+- /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */
+- data->buffratio = 0;
+- data->firedec = 0;
+-
+- data->wave = data->wavesp = 0;
+-
+- data->enabled_bp = secure_b_param("Enabled", 1);
+-
+- data->params = plugin_parameters ("Zoom Filter", 1);
+- data->params.params[0] = &data->enabled_bp;
+-
+- _this->params = &data->params;
+- _this->fx_data = (void*)data;
+-
+- /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */
+- generatePrecalCoef(data->precalCoef);
+-}
+-
+-static void zoomFilterVisualFXWrapper_free (struct _VISUAL_FX *_this)
+-{
+- free(_this->fx_data);
+-}
+-
+-static void zoomFilterVisualFXWrapper_apply (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info)
+-{
+-}
+-
+-VisualFX zoomFilterVisualFXWrapper_create(void)
+-{
+- VisualFX fx;
+- fx.init = zoomFilterVisualFXWrapper_init;
+- fx.free = zoomFilterVisualFXWrapper_free;
+- fx.apply = zoomFilterVisualFXWrapper_apply;
+- return fx;
+-}
+-
+-
+-/* TODO : MOVE THIS AWAY */
+-
+-void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, float t1, float t2, float t3, float t4, Uint cycle)
+-{
+- Uint x = (Uint) ((int) (goomInfo->screen.width / 2)
+- + (int) (t1 * cos ((float) cycle / t3)));
+- Uint y = (Uint) ((int) (goomInfo->screen.height/2)
+- + (int) (t2 * sin ((float) cycle / t4)));
+-
+- if ((x > 1) && (y > 1) && (x < goomInfo->screen.width - 2) && (y < goomInfo->screen.height - 2)) {
+- setPixelRGB (goomInfo, pix1, x + 1, y, c);
+- setPixelRGB (goomInfo, pix1, x, y + 1, c);
+- setPixelRGB (goomInfo, pix1, x + 1, y + 1, WHITE);
+- setPixelRGB (goomInfo, pix1, x + 2, y + 1, c);
+- setPixelRGB (goomInfo, pix1, x + 1, y + 2, c);
+- }
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/filters.c.rej /src/filters.c.rej
+--- /home/d4rk/goom2k4-0/src/filters.c.rej 2005-02-07 06:46:41.000000000 -0700
++++ /src/filters.c.rej 1969-12-31 17:00:00.000000000 -0700
+@@ -1,31 +0,0 @@
+-***************
+-*** 427,439 ****
+- brutSmypos = brutS[myPos2];
+- py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB);
+-
+- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC));
+- /* coef en modulo 15 */
+- coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK];
+--
+-- if ((py >= (signed int)ay) || (px >= (signed int)ax)) {
+-- pos = coeffs = 0;
+-- }
+-
+- getPixelRGB_ (expix1, pos, &col1);
+- getPixelRGB_ (expix1, pos + 1, &col2);
+---- 427,441 ----
+- brutSmypos = brutS[myPos2];
+- py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB);
+-
+-+
+-+ if ((py >= ay) || (px >= ax)) {
+-+ pos = coeffs = 0;
+-+ } else {
+- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC));
+- /* coef en modulo 15 */
+- coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK];
+-+ }
+-+
+-
+- getPixelRGB_ (expix1, pos, &col1);
+- getPixelRGB_ (expix1, pos + 1, &col2);
+diff -Naur /home/d4rk/goom2k4-0/src/filters_mmx.s /src/filters_mmx.s
+--- /home/d4rk/goom2k4-0/src/filters_mmx.s 2005-02-07 06:46:41.000000000 -0700
++++ /src/filters_mmx.s 1969-12-31 17:00:00.000000000 -0700
+@@ -1,200 +0,0 @@
+-;// file : mmx_zoom.s
+-;// author : JC Hoelt <jeko@free.fr>
+-;//
+-;// history
+-;// 07/01/2001 : Changing FEMMS to EMMS : slower... but run on intel machines
+-;// 03/01/2001 : WIDTH and HEIGHT are now variable
+-;// 28/12/2000 : adding comments to the code, suppress some useless lines
+-;// 27/12/2000 : reducing memory access... improving performance by 20%
+-;// coefficients are now on 1 byte
+-;// 22/12/2000 : Changing data structure
+-;// 16/12/2000 : AT&T version
+-;// 14/12/2000 : unrolling loop
+-;// 12/12/2000 : 64 bits memory access
+-
+-
+-.data
+-
+-chaine:
+- .string "pos = %d\n\0"
+- .long 0x0
+-
+-thezero:
+- .long 0x00000000
+- .long 0x00000000
+-
+-.text
+-
+-.globl mmx_zoom ;// name of the function to call by C program
+-/* .extern coeffs ;// the transformation buffer */
+-.extern expix1,expix2 ;// the source and destination buffer
+-.extern mmx_zoom_size, zoom_width ;// size of the buffers
+-
+-.extern brutS,brutD,buffratio,precalCoef,prevX,prevY
+-
+-#define PERTEMASK 15
+-/* faire : a / sqrtperte <=> a >> PERTEDEC*/
+-#define PERTEDEC 4
+-
+-.align 16
+-mmx_zoom:
+-
+- pushl %ebp
+- movl %esp,%ebp
+- subl $12,%esp
+-
+- movl prevX,%eax
+- decl %eax
+- sarl $4,%eax
+- movl %eax,-4(%ebp)
+-
+- movl prevY,%eax
+- decl %eax
+- sarl $4,%eax
+- movl %eax,-8(%ebp)
+-
+-;// initialisation du mm7 à zero
+- movq (thezero), %mm7
+-
+-movl mmx_zoom_size, %ecx
+-decl %ecx
+-
+-.while:
+- ;// esi <- nouvelle position
+- movl brutS, %eax
+- leal (%eax, %ecx, 8),%eax
+-
+- movl (%eax),%edx /* = brutS.px (brutSmypos) */
+- movl 4(%eax),%eax /* = brutS.py */
+-
+- movl brutD,%ebx
+- leal (%ebx, %ecx, 8),%ebx
+- movl (%ebx),%esi
+- subl %edx, %esi
+- imull buffratio,%esi
+- sarl $16,%esi
+- addl %edx,%esi /* esi = px */
+-
+- /* eax contient deja brutS.py = le nouveau brutSmypos*/
+- /* ebx pointe sur brutD[myPos] */
+- movl 4(%ebx),%edi
+- subl %eax,%edi
+- imull buffratio,%edi
+- sarl $16,%edi
+- addl %eax,%edi /* edi = py */
+-
+-/* pushl %eax
+- pushl %ebx*/
+-/* popl %ebx
+- popl %eax*/
+-
+- movl %esi,%eax
+- andl $15,%eax /* eax = coefh */
+- movl %edi,%ebx
+- andl $15,%ebx /* ebx = coefv */
+-
+- leal 0(,%ebx,4),%ebx
+- sall $6,%eax
+- addl %ebx,%eax
+- movl $precalCoef,%ebx
+-/* movd (%eax,%ebx),%mm6*/ /* mm6 = coeffs */
+-
+- cmpl -8(%ebp),%edi
+- jge .then1
+- cmpl -4(%ebp),%esi
+- jge .then1
+-
+- sarl $4,%esi
+- sarl $4,%edi
+- imull zoom_width,%edi
+- leal (%esi,%edi),%esi
+- jmp .finsi1
+-
+-.then1:
+- movl $0,%esi
+-.finsi1:
+-
+- /** apres ce calcul, %esi = pos, %mm6 = coeffs **/
+-/* pushl %esi
+- pushl $chaine
+- call printf
+- addl $8,%esp*/
+-
+- movl expix1,%eax
+-
+- ;// recuperation des deux premiers pixels dans mm0 et mm1
+-/* movq (%eax,%esi,4), %mm0 /* b1-v1-r1-a1-b2-v2-r2-a2 */
+- movq %mm0, %mm1 /* b1-v1-r1-a1-b2-v2-r2-a2 */
+-
+- ;// depackage du premier pixel
+- punpcklbw %mm7, %mm0 /* 00-b2-00-v2-00-r2-00-a2 */
+-
+- movq %mm6, %mm5 /* ??-??-??-??-c4-c3-c2-c1 */
+- ;// depackage du 2ieme pixel
+- punpckhbw %mm7, %mm1 /* 00-b1-00-v1-00-r1-00-a1 */
+-
+- ;// extraction des coefficients...
+- punpcklbw %mm5, %mm6 /* c4-c4-c3-c3-c2-c2-c1-c1 */
+- movq %mm6, %mm4 /* c4-c4-c3-c3-c2-c2-c1-c1 */
+- movq %mm6, %mm5 /* c4-c4-c3-c3-c2-c2-c1-c1 */
+-
+- punpcklbw %mm5, %mm6 /* c2-c2-c2-c2-c1-c1-c1-c1 */
+- punpckhbw %mm5, %mm4 /* c4-c4-c4-c4-c3-c3-c3-c3 */
+-
+- movq %mm6, %mm3 /* c2-c2-c2-c2-c1-c1-c1-c1 */
+- punpcklbw %mm7, %mm6 /* 00-c1-00-c1-00-c1-00-c1 */
+- punpckhbw %mm7, %mm3 /* 00-c2-00-c2-00-c2-00-c2 */
+-
+- ;// multiplication des pixels par les coefficients
+- pmullw %mm6, %mm0 /* c1*b2-c1*v2-c1*r2-c1*a2 */
+- pmullw %mm3, %mm1 /* c2*b1-c2*v1-c2*r1-c2*a1 */
+- paddw %mm1, %mm0
+-
+- ;// ...extraction des 2 derniers coefficients
+- movq %mm4, %mm5 /* c4-c4-c4-c4-c3-c3-c3-c3 */
+- punpcklbw %mm7, %mm4 /* 00-c3-00-c3-00-c3-00-c3 */
+- punpckhbw %mm7, %mm5 /* 00-c4-00-c4-00-c4-00-c4 */
+-
+- /* ajouter la longueur de ligne a esi */
+- addl prevX,%esi
+-
+- ;// recuperation des 2 derniers pixels
+-/* movq (%eax,%esi,4), %mm1*/
+- movq %mm1, %mm2
+-
+- ;// depackage des pixels
+- punpcklbw %mm7, %mm1
+- punpckhbw %mm7, %mm2
+-
+- ;// multiplication pas les coeffs
+- pmullw %mm4, %mm1
+- pmullw %mm5, %mm2
+-
+- ;// ajout des valeurs obtenues à la valeur finale
+- paddw %mm1, %mm0
+- paddw %mm2, %mm0
+-
+- ;// division par 256 = 16+16+16+16, puis repackage du pixel final
+- psrlw $8, %mm0
+- packuswb %mm7, %mm0
+-
+- ;// passage au suivant
+-
+- ;// enregistrement du resultat
+- movl expix2,%eax
+-/* movd %mm0,(%eax,%ecx,4)*/
+-
+- decl %ecx
+- ;// test de fin du tantque
+- cmpl $0, %ecx ;// 400x300
+-
+- jz .fin_while
+- jmp .while
+-
+-.fin_while:
+- emms
+-
+- movl %ebp,%esp
+- popl %ebp
+-
+- ret ;//The End
+diff -Naur /home/d4rk/goom2k4-0/src/filter_test/mmx.h /src/filter_test/mmx.h
+--- /home/d4rk/goom2k4-0/src/filter_test/mmx.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/filter_test/mmx.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,705 +0,0 @@
+-/* mmx.h
+-
+- MultiMedia eXtensions GCC interface library for IA32.
+-
+- To use this library, simply include this header file
+- and compile with GCC. You MUST have inlining enabled
+- in order for mmx_ok() to work; this can be done by
+- simply using -O on the GCC command line.
+-
+- Compiling with -DMMX_TRACE will cause detailed trace
+- output to be sent to stderr for each mmx operation.
+- This adds lots of code, and obviously slows execution to
+- a crawl, but can be very useful for debugging.
+-
+- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
+- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
+- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+- AND FITNESS FOR ANY PARTICULAR PURPOSE.
+-
+- 1997-99 by H. Dietz and R. Fisher
+-
+- Notes:
+- It appears that the latest gas has the pand problem fixed, therefore
+- I'll undefine BROKEN_PAND by default.
+-*/
+-
+-#ifndef _MMX_H
+-#define _MMX_H
+-
+-/* Warning: at this writing, the version of GAS packaged
+- with most Linux distributions does not handle the
+- parallel AND operation mnemonic correctly. If the
+- symbol BROKEN_PAND is defined, a slower alternative
+- coding will be used. If execution of mmxtest results
+- in an illegal instruction fault, define this symbol.
+-*/
+-#undef BROKEN_PAND
+-
+-
+-/* The type of an value that fits in an MMX register
+- (note that long long constant values MUST be suffixed
+- by LL and unsigned long long values by ULL, lest
+- they be truncated by the compiler)
+-*/
+-typedef union {
+- long long q; /* Quadword (64-bit) value */
+- unsigned long long uq; /* Unsigned Quadword */
+- int d[2]; /* 2 Doubleword (32-bit) values */
+- unsigned int ud[2]; /* 2 Unsigned Doubleword */
+- short w[4]; /* 4 Word (16-bit) values */
+- unsigned short uw[4]; /* 4 Unsigned Word */
+- char b[8]; /* 8 Byte (8-bit) values */
+- unsigned char ub[8]; /* 8 Unsigned Byte */
+- float s[2]; /* Single-precision (32-bit) value */
+-} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */
+-
+-
+-
+-/* Function to test if multimedia instructions are supported...
+-*/
+-inline extern int
+-mm_support(void)
+-{
+- /* Returns 1 if MMX instructions are supported,
+- 3 if Cyrix MMX and Extended MMX instructions are supported
+- 5 if AMD MMX and 3DNow! instructions are supported
+- 0 if hardware does not support any of these
+- */
+- register int rval = 0;
+-
+- __asm__ __volatile__ (
+- /* See if CPUID instruction is supported ... */
+- /* ... Get copies of EFLAGS into eax and ecx */
+- "pushf\n\t"
+- "popl %%eax\n\t"
+- "movl %%eax, %%ecx\n\t"
+-
+- /* ... Toggle the ID bit in one copy and store */
+- /* to the EFLAGS reg */
+- "xorl $0x200000, %%eax\n\t"
+- "push %%eax\n\t"
+- "popf\n\t"
+-
+- /* ... Get the (hopefully modified) EFLAGS */
+- "pushf\n\t"
+- "popl %%eax\n\t"
+-
+- /* ... Compare and test result */
+- "xorl %%eax, %%ecx\n\t"
+- "testl $0x200000, %%ecx\n\t"
+- "jz NotSupported1\n\t" /* CPUID not supported */
+-
+-
+- /* Get standard CPUID information, and
+- go to a specific vendor section */
+- "movl $0, %%eax\n\t"
+- "cpuid\n\t"
+-
+- /* Check for Intel */
+- "cmpl $0x756e6547, %%ebx\n\t"
+- "jne TryAMD\n\t"
+- "cmpl $0x49656e69, %%edx\n\t"
+- "jne TryAMD\n\t"
+- "cmpl $0x6c65746e, %%ecx\n"
+- "jne TryAMD\n\t"
+- "jmp Intel\n\t"
+-
+- /* Check for AMD */
+- "\nTryAMD:\n\t"
+- "cmpl $0x68747541, %%ebx\n\t"
+- "jne TryCyrix\n\t"
+- "cmpl $0x69746e65, %%edx\n\t"
+- "jne TryCyrix\n\t"
+- "cmpl $0x444d4163, %%ecx\n"
+- "jne TryCyrix\n\t"
+- "jmp AMD\n\t"
+-
+- /* Check for Cyrix */
+- "\nTryCyrix:\n\t"
+- "cmpl $0x69727943, %%ebx\n\t"
+- "jne NotSupported2\n\t"
+- "cmpl $0x736e4978, %%edx\n\t"
+- "jne NotSupported3\n\t"
+- "cmpl $0x64616574, %%ecx\n\t"
+- "jne NotSupported4\n\t"
+- /* Drop through to Cyrix... */
+-
+-
+- /* Cyrix Section */
+- /* See if extended CPUID level 80000001 is supported */
+- /* The value of CPUID/80000001 for the 6x86MX is undefined
+- according to the Cyrix CPU Detection Guide (Preliminary
+- Rev. 1.01 table 1), so we'll check the value of eax for
+- CPUID/0 to see if standard CPUID level 2 is supported.
+- According to the table, the only CPU which supports level
+- 2 is also the only one which supports extended CPUID levels.
+- */
+- "cmpl $0x2, %%eax\n\t"
+- "jne MMXtest\n\t" /* Use standard CPUID instead */
+-
+- /* Extended CPUID supported (in theory), so get extended
+- features */
+- "movl $0x80000001, %%eax\n\t"
+- "cpuid\n\t"
+- "testl $0x00800000, %%eax\n\t" /* Test for MMX */
+- "jz NotSupported5\n\t" /* MMX not supported */
+- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */
+- "jnz EMMXSupported\n\t"
+- "movl $1, %0:\n\n\t" /* MMX Supported */
+- "jmp Return\n\n"
+- "EMMXSupported:\n\t"
+- "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */
+- "jmp Return\n\t"
+-
+-
+- /* AMD Section */
+- "AMD:\n\t"
+-
+- /* See if extended CPUID is supported */
+- "movl $0x80000000, %%eax\n\t"
+- "cpuid\n\t"
+- "cmpl $0x80000000, %%eax\n\t"
+- "jl MMXtest\n\t" /* Use standard CPUID instead */
+-
+- /* Extended CPUID supported, so get extended features */
+- "movl $0x80000001, %%eax\n\t"
+- "cpuid\n\t"
+- "testl $0x00800000, %%edx\n\t" /* Test for MMX */
+- "jz NotSupported6\n\t" /* MMX not supported */
+- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */
+- "jnz ThreeDNowSupported\n\t"
+- "movl $1, %0:\n\n\t" /* MMX Supported */
+- "jmp Return\n\n"
+- "ThreeDNowSupported:\n\t"
+- "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */
+- "jmp Return\n\t"
+-
+-
+- /* Intel Section */
+- "Intel:\n\t"
+-
+- /* Check for MMX */
+- "MMXtest:\n\t"
+- "movl $1, %%eax\n\t"
+- "cpuid\n\t"
+- "testl $0x00800000, %%edx\n\t" /* Test for MMX */
+- "jz NotSupported7\n\t" /* MMX Not supported */
+- "movl $1, %0:\n\n\t" /* MMX Supported */
+- "jmp Return\n\t"
+-
+- /* Nothing supported */
+- "\nNotSupported1:\n\t"
+- "#movl $101, %0:\n\n\t"
+- "\nNotSupported2:\n\t"
+- "#movl $102, %0:\n\n\t"
+- "\nNotSupported3:\n\t"
+- "#movl $103, %0:\n\n\t"
+- "\nNotSupported4:\n\t"
+- "#movl $104, %0:\n\n\t"
+- "\nNotSupported5:\n\t"
+- "#movl $105, %0:\n\n\t"
+- "\nNotSupported6:\n\t"
+- "#movl $106, %0:\n\n\t"
+- "\nNotSupported7:\n\t"
+- "#movl $107, %0:\n\n\t"
+- "movl $0, %0:\n\n\t"
+-
+- "Return:\n\t"
+- : "=a" (rval)
+- : /* no input */
+- : "eax", "ebx", "ecx", "edx"
+- );
+-
+- /* Return */
+- return(rval);
+-}
+-
+-/* Function to test if mmx instructions are supported...
+-*/
+-inline extern int
+-mmx_ok(void)
+-{
+- /* Returns 1 if MMX instructions are supported, 0 otherwise */
+- return ( mm_support() & 0x1 );
+-}
+-
+-
+-/* Helper functions for the instruction macros that follow...
+- (note that memory-to-register, m2r, instructions are nearly
+- as efficient as register-to-register, r2r, instructions;
+- however, memory-to-memory instructions are really simulated
+- as a convenience, and are only 1/3 as efficient)
+-*/
+-#ifdef MMX_TRACE
+-
+-/* Include the stuff for printing a trace to stderr...
+-*/
+-
+-#include <stdio.h>
+-
+-#define mmx_i2r(op, imm, reg) \
+- { \
+- mmx_t mmx_trace; \
+- mmx_trace.uq = (imm); \
+- printf(#op "_i2r(" #imm "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#reg "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ (#op " %0, %%" #reg \
+- : /* nothing */ \
+- : "X" (imm)); \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#reg "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#define mmx_m2r(op, mem, reg) \
+- { \
+- mmx_t mmx_trace; \
+- mmx_trace = (mem); \
+- printf(#op "_m2r(" #mem "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#reg "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ (#op " %0, %%" #reg \
+- : /* nothing */ \
+- : "X" (mem)); \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#reg "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#define mmx_r2m(op, reg, mem) \
+- { \
+- mmx_t mmx_trace; \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#op "_r2m(" #reg "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- mmx_trace = (mem); \
+- printf(#mem "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ (#op " %%" #reg ", %0" \
+- : "=X" (mem) \
+- : /* nothing */ ); \
+- mmx_trace = (mem); \
+- printf(#mem "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#define mmx_r2r(op, regs, regd) \
+- { \
+- mmx_t mmx_trace; \
+- __asm__ __volatile__ ("movq %%" #regs ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#op "_r2r(" #regs "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ ("movq %%" #regd ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#regd "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \
+- __asm__ __volatile__ ("movq %%" #regd ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#regd "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#define mmx_m2m(op, mems, memd) \
+- { \
+- mmx_t mmx_trace; \
+- mmx_trace = (mems); \
+- printf(#op "_m2m(" #mems "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- mmx_trace = (memd); \
+- printf(#memd "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+- #op " %1, %%mm0\n\t" \
+- "movq %%mm0, %0" \
+- : "=X" (memd) \
+- : "X" (mems)); \
+- mmx_trace = (memd); \
+- printf(#memd "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#else
+-
+-/* These macros are a lot simpler without the tracing...
+-*/
+-
+-#define mmx_i2r(op, imm, reg) \
+- __asm__ __volatile__ (#op " %0, %%" #reg \
+- : /* nothing */ \
+- : "X" (imm) )
+-
+-#define mmx_m2r(op, mem, reg) \
+- __asm__ __volatile__ (#op " %0, %%" #reg \
+- : /* nothing */ \
+- : "X" (mem))
+-
+-#define mmx_r2m(op, reg, mem) \
+- __asm__ __volatile__ (#op " %%" #reg ", %0" \
+- : "=X" (mem) \
+- : /* nothing */ )
+-
+-#define mmx_r2r(op, regs, regd) \
+- __asm__ __volatile__ (#op " %" #regs ", %" #regd)
+-
+-#define mmx_m2m(op, mems, memd) \
+- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+- #op " %1, %%mm0\n\t" \
+- "movq %%mm0, %0" \
+- : "=X" (memd) \
+- : "X" (mems))
+-
+-#endif
+-
+-
+-/* 1x64 MOVe Quadword
+- (this is both a load and a store...
+- in fact, it is the only way to store)
+-*/
+-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg)
+-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var)
+-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd)
+-#define movq(vars, vard) \
+- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \
+- "movq %%mm0, %0" \
+- : "=X" (vard) \
+- : "X" (vars))
+-
+-
+-/* 1x32 MOVe Doubleword
+- (like movq, this is both load and store...
+- but is most useful for moving things between
+- mmx registers and ordinary registers)
+-*/
+-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg)
+-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var)
+-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd)
+-#define movd(vars, vard) \
+- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \
+- "movd %%mm0, %0" \
+- : "=X" (vard) \
+- : "X" (vars))
+-
+-
+-/* 2x32, 4x16, and 8x8 Parallel ADDs
+-*/
+-#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg)
+-#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd)
+-#define paddd(vars, vard) mmx_m2m(paddd, vars, vard)
+-
+-#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg)
+-#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd)
+-#define paddw(vars, vard) mmx_m2m(paddw, vars, vard)
+-
+-#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg)
+-#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd)
+-#define paddb(vars, vard) mmx_m2m(paddb, vars, vard)
+-
+-
+-/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic
+-*/
+-#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg)
+-#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd)
+-#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard)
+-
+-#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg)
+-#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd)
+-#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard)
+-
+-
+-/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic
+-*/
+-#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg)
+-#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd)
+-#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard)
+-
+-#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg)
+-#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd)
+-#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard)
+-
+-
+-/* 2x32, 4x16, and 8x8 Parallel SUBs
+-*/
+-#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg)
+-#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd)
+-#define psubd(vars, vard) mmx_m2m(psubd, vars, vard)
+-
+-#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg)
+-#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd)
+-#define psubw(vars, vard) mmx_m2m(psubw, vars, vard)
+-
+-#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg)
+-#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd)
+-#define psubb(vars, vard) mmx_m2m(psubb, vars, vard)
+-
+-
+-/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic
+-*/
+-#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg)
+-#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd)
+-#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard)
+-
+-#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg)
+-#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd)
+-#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard)
+-
+-
+-/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic
+-*/
+-#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg)
+-#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd)
+-#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard)
+-
+-#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg)
+-#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd)
+-#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard)
+-
+-
+-/* 4x16 Parallel MULs giving Low 4x16 portions of results
+-*/
+-#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg)
+-#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd)
+-#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard)
+-
+-
+-/* 4x16 Parallel MULs giving High 4x16 portions of results
+-*/
+-#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg)
+-#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd)
+-#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard)
+-
+-
+-/* 4x16->2x32 Parallel Mul-ADD
+- (muls like pmullw, then adds adjacent 16-bit fields
+- in the multiply result to make the final 2x32 result)
+-*/
+-#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg)
+-#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd)
+-#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard)
+-
+-
+-/* 1x64 bitwise AND
+-*/
+-#ifdef BROKEN_PAND
+-#define pand_m2r(var, reg) \
+- { \
+- mmx_m2r(pandn, (mmx_t) -1LL, reg); \
+- mmx_m2r(pandn, var, reg); \
+- }
+-#define pand_r2r(regs, regd) \
+- { \
+- mmx_m2r(pandn, (mmx_t) -1LL, regd); \
+- mmx_r2r(pandn, regs, regd) \
+- }
+-#define pand(vars, vard) \
+- { \
+- movq_m2r(vard, mm0); \
+- mmx_m2r(pandn, (mmx_t) -1LL, mm0); \
+- mmx_m2r(pandn, vars, mm0); \
+- movq_r2m(mm0, vard); \
+- }
+-#else
+-#define pand_m2r(var, reg) mmx_m2r(pand, var, reg)
+-#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd)
+-#define pand(vars, vard) mmx_m2m(pand, vars, vard)
+-#endif
+-
+-
+-/* 1x64 bitwise AND with Not the destination
+-*/
+-#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg)
+-#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd)
+-#define pandn(vars, vard) mmx_m2m(pandn, vars, vard)
+-
+-
+-/* 1x64 bitwise OR
+-*/
+-#define por_m2r(var, reg) mmx_m2r(por, var, reg)
+-#define por_r2r(regs, regd) mmx_r2r(por, regs, regd)
+-#define por(vars, vard) mmx_m2m(por, vars, vard)
+-
+-
+-/* 1x64 bitwise eXclusive OR
+-*/
+-#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg)
+-#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd)
+-#define pxor(vars, vard) mmx_m2m(pxor, vars, vard)
+-
+-
+-/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality
+- (resulting fields are either 0 or -1)
+-*/
+-#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg)
+-#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd)
+-#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard)
+-
+-#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg)
+-#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd)
+-#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard)
+-
+-#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg)
+-#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd)
+-#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard)
+-
+-
+-/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than
+- (resulting fields are either 0 or -1)
+-*/
+-#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg)
+-#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd)
+-#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard)
+-
+-#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg)
+-#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd)
+-#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard)
+-
+-#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg)
+-#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd)
+-#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard)
+-
+-
+-/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical
+-*/
+-#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg)
+-#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg)
+-#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd)
+-#define psllq(vars, vard) mmx_m2m(psllq, vars, vard)
+-
+-#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg)
+-#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg)
+-#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd)
+-#define pslld(vars, vard) mmx_m2m(pslld, vars, vard)
+-
+-#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg)
+-#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg)
+-#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd)
+-#define psllw(vars, vard) mmx_m2m(psllw, vars, vard)
+-
+-
+-/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical
+-*/
+-#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg)
+-#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg)
+-#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd)
+-#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard)
+-
+-#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg)
+-#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg)
+-#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd)
+-#define psrld(vars, vard) mmx_m2m(psrld, vars, vard)
+-
+-#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg)
+-#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg)
+-#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd)
+-#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard)
+-
+-
+-/* 2x32 and 4x16 Parallel Shift Right Arithmetic
+-*/
+-#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg)
+-#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg)
+-#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd)
+-#define psrad(vars, vard) mmx_m2m(psrad, vars, vard)
+-
+-#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg)
+-#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg)
+-#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd)
+-#define psraw(vars, vard) mmx_m2m(psraw, vars, vard)
+-
+-
+-/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate
+- (packs source and dest fields into dest in that order)
+-*/
+-#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg)
+-#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd)
+-#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard)
+-
+-#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg)
+-#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd)
+-#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard)
+-
+-
+-/* 4x16->8x8 PACK and Unsigned Saturate
+- (packs source and dest fields into dest in that order)
+-*/
+-#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg)
+-#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd)
+-#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard)
+-
+-
+-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low
+- (interleaves low half of dest with low half of source
+- as padding in each result field)
+-*/
+-#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg)
+-#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd)
+-#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard)
+-
+-#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg)
+-#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd)
+-#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard)
+-
+-#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg)
+-#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd)
+-#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard)
+-
+-
+-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High
+- (interleaves high half of dest with high half of source
+- as padding in each result field)
+-*/
+-#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg)
+-#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd)
+-#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard)
+-
+-#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg)
+-#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd)
+-#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard)
+-
+-#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg)
+-#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd)
+-#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard)
+-
+-
+-/* Empty MMx State
+- (used to clean-up when going from mmx to float use
+- of the registers that are shared by both; note that
+- there is no float-to-mmx operation needed, because
+- only the float tag word info is corruptible)
+-*/
+-#ifdef MMX_TRACE
+-
+-#define emms() \
+- { \
+- printf("emms()\n"); \
+- __asm__ __volatile__ ("emms"); \
+- }
+-
+-#else
+-
+-#define emms() __asm__ __volatile__ ("emms")
+-
+-#endif
+-
+-#endif
+-
+diff -Naur /home/d4rk/goom2k4-0/src/filter_test/px_py_calc.c /src/filter_test/px_py_calc.c
+--- /home/d4rk/goom2k4-0/src/filter_test/px_py_calc.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/filter_test/px_py_calc.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,94 +0,0 @@
+-#include "mmx.h"
+-
+-int testD [] = {0x1200, 0x2011, 0, 0x12, 0x5331, 0x8000};
+-int testS [] = {0x1205, 0x11, 0x4210, 0x412, 0x121, 0x1211};
+-
+-int ratios [] = {0x8000, 0x4000, 0x1234, 0x6141, 0xffff, 0};
+-
+-int main () {
+- int nbERROR = 0;
+- int i,j;
+- volatile mmx_t ratiox;
+-
+- volatile mmx_t sortie;
+-
+- /* creation des variables de test */
+- volatile int buffratio = 0x8000;
+- volatile int loop = 0;
+- volatile int *buffS;
+- volatile int *buffD;
+- buffS = malloc (256);
+- buffD = malloc (256);
+-
+- buffS = buffS + (unsigned)buffS % 64;
+- buffD = buffD + (unsigned)buffD % 64;
+-
+- for (j=0;j<6;j++)
+- for (i=0;i<3;i++) {
+-
+- buffratio = ratios[j];
+-
+- buffS[0] = testS[i<<1];
+- buffS[1] = testS[(i<<1)+1];
+-
+- buffD[0] = testD[i*2];
+- buffD[1] = testD[i*2+1];
+-
+- /* code */
+-
+- ratiox.d[0] = buffratio;
+- ratiox.d[1] = buffratio;
+- movq_m2r (ratiox, mm6);
+- pslld_i2r (16,mm6);
+-
+- /* |0hhhhhhh|llllvvvv|
+- x |00000000|bbbbbbbb|
+- =================
+- |.bl.high|..bl.low|
+- + |..bh.low|00000000|
+- =================
+- result1
+- */
+-
+- /*
+- * pre : mm6 = [buffratio<<16|buffratio<<16]
+- */
+-
+- movq_m2r (buffS[loop],mm0); /* mm0 = S */
+- movq_m2r (buffD[loop],mm1); /* mm1 = D */
+- psubd_r2r (mm0,mm1); /* mm1 = D - S */
+- movq_r2r (mm1, mm2); /* mm2 = D - S */
+-
+- pslld_i2r (16,mm1);
+- mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */
+- pmullw_r2r (mm6, mm2);
+-
+- paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */
+- pslld_i2r (16,mm0);
+-
+- paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */
+- psrld_i2r (16, mm0);
+- movq_r2m (mm0, sortie);
+-
+- /*
+- * post : mm0 = S + ((D-S)*buffratio)>>16
+- * modified = mm0,mm1,mm2
+- */
+-
+- if (
+- (buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16) != sortie.d[0])
+- | (buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16) != sortie.d[1]))
+- {
+- nbERROR++;
+- printf ("\ns : (0x%08x,0x%08x)\n", buffS[0], buffS[1]);
+- printf ("d : (0x%08x,0x%08x)\n", buffD[0], buffD[1]);
+- printf ("ratio : (0x%08x,0x%08x)\n", buffratio, buffratio);
+-
+- printf ("en mmx : (0x%08x,0x%08x)\n", sortie.d[0], sortie.d[1]);
+- printf ("en c : (0x%08x,0x%08x)\n",
+- buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16),
+- buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16));
+- }
+- }
+- printf ("%d errors\n",nbERROR);
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx.c /src/filter_test/zoom_filter_mmx.c
+--- /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/filter_test/zoom_filter_mmx.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,186 +0,0 @@
+-
+-#define BUFFPOINTNB 16
+-#define BUFFPOINTMASK 0xffff
+-#define BUFFINCR 0xff
+-
+-#define sqrtperte 16
+-// faire : a % sqrtperte <=> a & pertemask
+-#define PERTEMASK 0xf
+-// faire : a / sqrtperte <=> a >> PERTEDEC
+-#define PERTEDEC 4
+-
+-//#define MMX_TRACE
+-#include "mmx.h"
+-
+-void zoom_filter_mmx (int prevX, int prevY,
+- unsigned int *expix1, unsigned int *expix2,
+- int *lbruS, int *lbruD, int buffratio,
+- int precalCoef[16][16])
+-{
+- int bufsize = prevX * prevY; /* taille du buffer */
+- volatile int loop; /* variable de boucle */
+-
+- mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */
+- mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */
+-
+- int pos;
+-
+- volatile mmx_t prevXY;
+- volatile mmx_t ratiox;
+- volatile mmx_t interpix;
+-
+- volatile mmx_t mask; /* masque des nombres a virgules */
+- mask.ud[0] = BUFFPOINTMASK;
+- mask.ud[1] = BUFFPOINTMASK;
+-
+- prevXY.ud[0] = (prevX-1)<<PERTEDEC;
+- prevXY.ud[1] = (prevY-1)<<PERTEDEC;
+-
+- pxor_r2r (mm7,mm7);
+-
+- ratiox.d[0] = buffratio;
+- ratiox.d[1] = buffratio;
+- movq_m2r (ratiox, mm6);
+- pslld_i2r (16,mm6);
+-
+- for (loop=0; loop<bufsize; loop++)
+- {
+- /*
+- * pre : mm6 = [buffratio<<16|buffratio<<16]
+- * post : mm0 = S + ((D-S)*buffratio)>>16 format [X|Y]
+- * modified = mm0,mm1,mm2
+- */
+-
+- movq_m2r (brutS[loop],mm0); /* mm0 = S */
+- movq_m2r (brutD[loop],mm1); /* mm1 = D */
+- psubd_r2r (mm0,mm1); /* mm1 = D - S */
+- movq_r2r (mm1, mm2); /* mm2 = D - S */
+-
+- pslld_i2r (16,mm1);
+- mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */
+- pmullw_r2r (mm6, mm2);
+-
+- paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */
+- pslld_i2r (16,mm0);
+-
+- paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */
+- psrld_i2r (16, mm0);
+-
+- /*
+- * pre : mm0 : position vector on screen
+- * prevXY : coordinate of the lower-right point on screen
+- * post : clipped mm0
+- * modified : mm0,mm1
+- */
+- movq_m2r (prevXY,mm1);
+- pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient :
+- 1111 si prevXY > px
+- 0000 si prevXY <= px
+- (idem pour y) */
+- pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */
+-
+-
+- /*
+- * pre : mm0 : clipped position on screen
+- * post : mm6 : coefs for this position
+- * mm1 : X vector [0|X]
+- * modif : eax,ebx
+- */
+- __asm__ __volatile__ (
+- "movq %%mm0,%%mm1\n"
+- "movd %%mm0,%%eax\n"
+- "psrlq $32,%%mm1\n"
+- "movd %%mm1,%%ebx\n"
+- "and $15,%%eax\n"
+- "and $15,%%ebx\n"
+- "add %0,%%eax\n"
+- "movd (%%eax,%%ebx,$16),%%mm6\n"
+- ::"X"(precalCoef):"eax","ebx");
+-
+- /*
+- * pre : mm0 : Y pos [*|Y]
+- * mm1 : X pos [*|X]
+- * post : eax : absolute position of the source pixel.
+- * modif : ebx
+- */
+- psrld_i2r (PERTEDEC,mm0);
+- psrld_i2r (PERTEDEC,mm1);
+- __asm__ __volatile__ (
+- "movd %%mm1,%%eax\n"
+-// "movl %1,%%ebx\n"
+- "mull %1\n"
+- "movd %%mm0,%%ebx\n"
+- "addl %%ebx,%%eax\n"
+- "movl %%eax,%0\n"
+- :"=X"(pos):"X"(prevX):"eax","ebx"
+- );
+-
+- expix2[loop] = expix1[pos];
+- /*
+- * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK];
+- * coef en modulo 15 *
+- * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK));
+- */
+-// precal + eax + ebx * 16
+-
+-// movd_m2r (precalCoef[interpix.d[0]][interpix.d[1]],mm6);
+-
+- /* recuperation des deux premiers pixels dans mm0 et mm1 */
+-// movq_m2r (/*expix1[pos]*/a, mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */
+-// movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */
+-
+- /* depackage du premier pixel */
+-// punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */
+-
+-// movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */
+- /* depackage du 2ieme pixel */
+-// punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */
+-
+- /* extraction des coefficients... */
+-// punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */
+-// movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */
+-// movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */
+-
+-// punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */
+-// punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */
+-
+-// movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */
+-// punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */
+-// punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */
+-
+- /* multiplication des pixels par les coefficients */
+-// pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */
+-// pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */
+-// paddw_r2r (mm1, mm0);
+-
+- /* ...extraction des 2 derniers coefficients */
+-// movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */
+-// punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */
+-// punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */
+-
+- /* recuperation des 2 derniers pixels */
+-// movq_m2r (a/*expix1[pos+largeur]*/, mm1);
+-// movq_r2r (mm1, mm2);
+-
+- /* depackage des pixels */
+-// punpcklbw_r2r (mm7, mm1);
+-// punpckhbw_r2r (mm7, mm2);
+-
+- /* multiplication pas les coeffs */
+-// pmullw_r2r (mm4, mm1);
+-// pmullw_r2r (mm5, mm2);
+-
+- /* ajout des valeurs obtenues à la valeur finale */
+-// paddw_r2r (mm1, mm0);
+-// paddw_r2r (mm2, mm0);
+-
+- /* division par 256 = 16+16+16+16, puis repackage du pixel final */
+-// psrlw_i2r (8, mm0);
+-// packuswb_r2r (mm7, mm0);
+-
+-// movd_r2m (mm0,expix2[loop]);
+-
+- // expix2[loop] = couleur;
+- }
+- emms(); /* __asm__ __volatile__ ("emms"); */
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c /src/filter_test/zoom_filter_mmx-v0.c
+--- /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/filter_test/zoom_filter_mmx-v0.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,202 +0,0 @@
+-
+-#define BUFFPOINTNB 16
+-#define BUFFPOINTMASK 0xffff
+-#define BUFFINCR 0xff
+-
+-#define sqrtperte 16
+-// faire : a % sqrtperte <=> a & pertemask
+-#define PERTEMASK 0xf
+-// faire : a / sqrtperte <=> a >> PERTEDEC
+-#define PERTEDEC 4
+-
+-//#define MMX_TRACE
+-#include "mmx.h"
+-
+-void zoom_filter_mmx (int prevX, int prevY,
+- unsigned int *expix1, unsigned int *expix2,
+- int *lbruS, int *lbruD, int buffratio,
+- int precalCoef[16][16])
+-{
+- int bufsize = prevX * prevY; /* taille du buffer */
+- volatile int loop; /* variable de boucle */
+-
+- mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */
+- mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */
+-
+- volatile mmx_t prevXY;
+- volatile mmx_t ratiox;
+- volatile mmx_t interpix;
+-
+- volatile mmx_t mask; /* masque des nombres a virgules */
+- mask.ud[0] = BUFFPOINTMASK;
+- mask.ud[1] = BUFFPOINTMASK;
+-
+- prevXY.ud[0] = (prevX-1)<<PERTEDEC;
+- prevXY.ud[1] = (prevY-1)<<PERTEDEC;
+-
+- pxor_r2r (mm7,mm7);
+-
+- ratiox.d[0] = buffratio;
+- ratiox.d[1] = buffratio;
+- movq_m2r (ratiox, mm6);
+- pslld_i2r (16,mm6);
+-
+- loop=0;
+- while (loop<bufsize)
+- {
+- movq_m2r (ratiox, mm6);
+- pslld_i2r (16,mm6);
+-
+- /*
+- * pre : mm6 = [buffratio<<16|buffratio<<16]
+- * post : mm0 = S + ((D-S)*buffratio)>>16 format [X|Y]
+- * modified = mm0,mm1,mm2
+- */
+-
+- __asm__ __volatile__ (
+- "movq %0,%%mm0\n"
+- "movq %1,%%mm1\n"
+- : :"X"(brutS[loop]),"X"(brutD[loop])
+- ); /* mm0 = S */
+-
+- psubd_r2r (mm0,mm1); /* mm1 = D - S */
+- movq_r2r (mm1, mm2); /* mm2 = D - S */
+-
+- pslld_i2r (16,mm1);
+- mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */
+- pmullw_r2r (mm6, mm2);
+-
+- paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */
+- pslld_i2r (16,mm0);
+-
+- paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */
+- psrld_i2r (16, mm0);
+-
+- /*
+- * pre : mm0 : position vector on screen
+- * prevXY : coordinate of the lower-right point on screen
+- * post : clipped mm0
+- * modified : mm0,mm1,mm2
+- */
+- movq_m2r (prevXY,mm1);
+- pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient :
+- 1111 si prevXY > px
+- 0000 si prevXY <= px
+- (idem pour y) */
+- movq_r2r (mm1,mm2);
+- punpckldq_r2r (mm1,mm1);
+- punpckhdq_r2r (mm2,mm2);
+- pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */
+- pand_r2r (mm2, mm0); /* on met a zero la partie qui deborde */
+-
+- /*
+- * pre : mm0 : clipped position on screen
+- * post : mm6 : coefs for this position
+- * mm1 : X vector [0|X]
+- * modif : eax,ebx
+- */
+- __asm__ __volatile__ (
+- "movq %%mm0,%%mm1\n"
+- "movd %%mm0,%%ebx\n"
+- "psrlq $32,%%mm1\n"
+- "movd %%mm1,%%eax\n"
+- "andl $15,%%eax\n"
+- "andl $15,%%ebx\n"
+-
+- "shll $2,%%eax\n"
+- "shll $3,%%ebx\n"
+-
+- "addl %0,%%eax\n"
+-
+- "movd (%%eax,%%ebx,8),%%mm6\n"
+- ::"X"(precalCoef):"eax","ebx");
+-
+- /*
+- * pre : mm0 : Y pos [*|Y]
+- * mm1 : X pos [*|X]
+- * post : eax : absolute position of the source pixel.
+- * modif : ebx
+- */
+- psrld_i2r (PERTEDEC,mm0);
+- psrld_i2r (PERTEDEC,mm1);
+- __asm__ __volatile__ (
+- "movd %%mm1,%%eax\n"
+- "mull %1\n"
+- "movd %%mm0,%%ebx\n"
+- "addl %%ebx,%%eax\n"
+- "movl %0,%%ebx\n"
+- "movq (%%ebx,%%eax,4),%%mm0\n"
+- "addl %1,%%eax\n"
+- "movq (%%ebx,%%eax,4),%%mm2\n"
+-
+- : : "X"(expix1), "X"(prevX):"eax","ebx"
+- );
+-
+- /*
+- * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK];
+- * coef en modulo 15 *
+- * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK));
+- */
+-
+- /* recuperation des deux premiers pixels dans mm0 et mm1 */
+-// movq_m2r (expix1[pos], mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */
+- movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */
+-
+- /* recuperation des 2 derniers pixels */
+-// movq_m2r (expix1[pos+prevX], mm2);
+-
+- /* depackage du premier pixel */
+- punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */
+-
+- movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */
+- /* depackage du 2ieme pixel */
+- punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */
+-
+- /* extraction des coefficients... */
+- punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */
+- movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */
+- movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */
+-
+- punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */
+- punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */
+-
+- movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */
+- punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */
+- punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */
+-
+- /* multiplication des pixels par les coefficients */
+- pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */
+- pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */
+- paddw_r2r (mm1, mm0);
+-
+- /* ...extraction des 2 derniers coefficients */
+- movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */
+- punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */
+- punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */
+-
+- /* recuperation des 2 derniers pixels */
+- movq_r2r (mm2, mm1);
+-
+- /* depackage des pixels */
+- punpcklbw_r2r (mm7, mm1);
+- punpckhbw_r2r (mm7, mm2);
+-
+- /* multiplication pas les coeffs */
+- pmullw_r2r (mm4, mm1);
+- pmullw_r2r (mm5, mm2);
+-
+- /* ajout des valeurs obtenues à la valeur finale */
+- paddw_r2r (mm1, mm0);
+- paddw_r2r (mm2, mm0);
+-
+- /* division par 256 = 16+16+16+16, puis repackage du pixel final */
+- psrlw_i2r (8, mm0);
+- packuswb_r2r (mm7, mm0);
+-
+- movd_r2m (mm0,expix2[loop]);
+-
+- // expix2[loop] = couleur;
+- ++loop;
+- }
+- emms(); /* __asm__ __volatile__ ("emms"); */
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/flying_stars_fx.c /src/flying_stars_fx.c
+--- /home/d4rk/goom2k4-0/src/flying_stars_fx.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/flying_stars_fx.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,314 +0,0 @@
+-#include "goom_fx.h"
+-#include "goom_plugin_info.h"
+-#include "goom_tools.h"
+-
+-#include "mathtools.h"
+-
+-/* TODO:-- FAIRE PROPREMENT... BOAH... */
+-#define NCOL 15
+-
+-/*static const int colval[] = {
+-0xfdf6f5,
+-0xfae4e4,
+-0xf7d1d1,
+-0xf3b6b5,
+-0xefa2a2,
+-0xec9190,
+-0xea8282,
+-0xe87575,
+-0xe46060,
+-0xe14b4c,
+-0xde3b3b,
+-0xdc2d2f,
+-0xd92726,
+-0xd81619,
+-0xd50c09,
+-0
+-};
+-*/
+-static const int colval[] = {
+- 0x1416181a,
+- 0x1419181a,
+- 0x141f181a,
+- 0x1426181a,
+- 0x142a181a,
+- 0x142f181a,
+- 0x1436181a,
+- 0x142f1819,
+- 0x14261615,
+- 0x13201411,
+- 0x111a100a,
+- 0x0c180508,
+- 0x08100304,
+- 0x00050101,
+- 0x0
+-};
+-
+-
+-/* The different modes of the visual FX.
+- * Put this values on fx_mode */
+-#define FIREWORKS_FX 0
+-#define RAIN_FX 1
+-#define FOUNTAIN_FX 2
+-#define LAST_FX 3
+-
+-typedef struct _FS_STAR {
+- float x,y;
+- float vx,vy;
+- float ax,ay;
+- float age,vage;
+-} Star;
+-
+-typedef struct _FS_DATA{
+-
+- int fx_mode;
+- int nbStars;
+-
+- int maxStars;
+- Star *stars;
+-
+- float min_age;
+- float max_age;
+-
+- PluginParam min_age_p;
+- PluginParam max_age_p;
+- PluginParam nbStars_p;
+- PluginParam nbStars_limit_p;
+- PluginParam fx_mode_p;
+-
+- PluginParameters params;
+-} FSData;
+-
+-static void fs_init(VisualFX *_this, PluginInfo *info) {
+-
+- FSData *data;
+- data = (FSData*)malloc(sizeof(FSData));
+-
+- data->fx_mode = FIREWORKS_FX;
+- data->maxStars = 4096;
+- data->stars = (Star*)malloc(data->maxStars * sizeof(Star));
+- data->nbStars = 0;
+-
+- data->max_age_p = secure_i_param ("Fireworks Smallest Bombs");
+- IVAL(data->max_age_p) = 80;
+- IMIN(data->max_age_p) = 0;
+- IMAX(data->max_age_p) = 100;
+- ISTEP(data->max_age_p) = 1;
+-
+- data->min_age_p = secure_i_param ("Fireworks Largest Bombs");
+- IVAL(data->min_age_p) = 99;
+- IMIN(data->min_age_p) = 0;
+- IMAX(data->min_age_p) = 100;
+- ISTEP(data->min_age_p) = 1;
+-
+- data->nbStars_limit_p = secure_i_param ("Max Number of Particules");
+- IVAL(data->nbStars_limit_p) = 512;
+- IMIN(data->nbStars_limit_p) = 0;
+- IMAX(data->nbStars_limit_p) = data->maxStars;
+- ISTEP(data->nbStars_limit_p) = 64;
+-
+- data->fx_mode_p = secure_i_param ("FX Mode");
+- IVAL(data->fx_mode_p) = data->fx_mode;
+- IMIN(data->fx_mode_p) = 1;
+- IMAX(data->fx_mode_p) = 3;
+- ISTEP(data->fx_mode_p) = 1;
+-
+- data->nbStars_p = secure_f_feedback ("Number of Particules (% of Max)");
+-
+- data->params = plugin_parameters ("Particule System", 7);
+- data->params.params[0] = &data->fx_mode_p;
+- data->params.params[1] = &data->nbStars_limit_p;
+- data->params.params[2] = 0;
+- data->params.params[3] = &data->min_age_p;
+- data->params.params[4] = &data->max_age_p;
+- data->params.params[5] = 0;
+- data->params.params[6] = &data->nbStars_p;
+-
+- _this->params = &data->params;
+- _this->fx_data = (void*)data;
+-}
+-
+-static void fs_free(VisualFX *_this) {
+- free (_this->fx_data);
+-}
+-
+-
+-/**
+- * Cree une nouvelle 'bombe', c'est a dire une particule appartenant a une fusee d'artifice.
+- */
+-static void addABomb (FSData *fs, int mx, int my, float radius, float vage, float gravity, PluginInfo *info) {
+-
+- int i = fs->nbStars;
+- float ro;
+- int theta;
+-
+- if (fs->nbStars >= fs->maxStars)
+- return;
+- fs->nbStars++;
+-
+- fs->stars[i].x = mx;
+- fs->stars[i].y = my;
+-
+- ro = radius * (float)goom_irand(info->gRandom,100) / 100.0f;
+- ro *= (float)goom_irand(info->gRandom,100)/100.0f + 1.0f;
+- theta = goom_irand(info->gRandom,256);
+-
+- fs->stars[i].vx = ro * cos256[theta];
+- fs->stars[i].vy = -0.2f + ro * sin256[theta];
+-
+- fs->stars[i].ax = 0;
+- fs->stars[i].ay = gravity;
+-
+- fs->stars[i].age = 0;
+- if (vage < fs->min_age)
+- vage=fs->min_age;
+- fs->stars[i].vage = vage;
+-}
+-
+-
+-/**
+- * Met a jour la position et vitesse d'une particule.
+- */
+-static void updateStar (Star *s) {
+- s->x+=s->vx;
+- s->y+=s->vy;
+- s->vx+=s->ax;
+- s->vy+=s->ay;
+- s->age+=s->vage;
+-}
+-
+-
+-/**
+- * Ajoute de nouvelles particules au moment d'un evenement sonore.
+- */
+-static void fs_sound_event_occured(VisualFX *_this, PluginInfo *info) {
+-
+- FSData *data = (FSData*)_this->fx_data;
+- int i;
+-
+- int max = (int)((1.0f+info->sound.goomPower)*goom_irand(info->gRandom,150)) + 100;
+- float radius = (1.0f+info->sound.goomPower) * (float)(goom_irand(info->gRandom,150)+50)/300;
+- int mx;
+- int my;
+- float vage, gravity = 0.02f;
+-
+- switch (data->fx_mode) {
+- case FIREWORKS_FX:
+- {
+- double dx,dy;
+- do {
+- mx = goom_irand(info->gRandom,info->screen.width);
+- my = goom_irand(info->gRandom,info->screen.height);
+- dx = (mx - info->screen.width/2);
+- dy = (my - info->screen.height/2);
+- } while (dx*dx + dy*dy < (info->screen.height/2)*(info->screen.height/2));
+- vage = data->max_age * (1.0f - info->sound.goomPower);
+- }
+- break;
+- case RAIN_FX:
+- mx = goom_irand(info->gRandom,info->screen.width);
+- if (mx > info->screen.width/2)
+- mx = info->screen.width;
+- else
+- mx = 0;
+- my = -(info->screen.height/3)-goom_irand(info->gRandom,info->screen.width/3);
+- radius *= 1.5;
+- vage = 0.002f;
+- break;
+- case FOUNTAIN_FX:
+- my = info->screen.height+2;
+- vage = 0.001f;
+- radius += 1.0f;
+- mx = info->screen.width / 2;
+- gravity = 0.04f;
+- break;
+- default:
+- return;
+- /* my = i R A N D (info->screen.height); vage = 0.01f; */
+- }
+-
+- radius *= info->screen.height / 200.0f; /* why 200 ? because the FX was developped on 320x200 */
+- max *= info->screen.height / 200.0f;
+-
+- if (info->sound.timeSinceLastBigGoom < 1) {
+- radius *= 1.5;
+- max *= 2;
+- }
+- for (i=0;i<max;++i)
+- addABomb (data,mx,my,radius,vage,gravity,info);
+-}
+-
+-
+-/**
+- * Main methode of the FX.
+- */
+-static void fs_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) {
+-
+- int i;
+- int col;
+- FSData *data = (FSData*)_this->fx_data;
+-
+- /* Get the new parameters values */
+- data->min_age = 1.0f - (float)IVAL(data->min_age_p)/100.0f;
+- data->max_age = 1.0f - (float)IVAL(data->max_age_p)/100.0f;
+- FVAL(data->nbStars_p) = (float)data->nbStars / (float)data->maxStars;
+- data->nbStars_p.change_listener(&data->nbStars_p);
+- data->maxStars = IVAL(data->nbStars_limit_p);
+- data->fx_mode = IVAL(data->fx_mode_p);
+-
+- /* look for events */
+- if (info->sound.timeSinceLastGoom < 1) {
+- fs_sound_event_occured(_this, info);
+- if (goom_irand(info->gRandom,20)==1) {
+- IVAL(data->fx_mode_p) = goom_irand(info->gRandom,(LAST_FX*3));
+- data->fx_mode_p.change_listener(&data->fx_mode_p);
+- }
+- }
+-
+- /* update particules */
+- for (i=0;i<data->nbStars;++i) {
+- updateStar(&data->stars[i]);
+-
+- /* dead particule */
+- if (data->stars[i].age>=NCOL)
+- continue;
+-
+- /* choose the color of the particule */
+- col = colval[(int)data->stars[i].age];
+-
+- /* draws the particule */
+- info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y,
+- (int)(data->stars[i].x-data->stars[i].vx*6),
+- (int)(data->stars[i].y-data->stars[i].vy*6),
+- col,
+- (int)info->screen.width, (int)info->screen.height);
+- info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y,
+- (int)(data->stars[i].x-data->stars[i].vx*2),
+- (int)(data->stars[i].y-data->stars[i].vy*2),
+- col,
+- (int)info->screen.width, (int)info->screen.height);
+- }
+-
+- /* look for dead particules */
+- for (i=0;i<data->nbStars;) {
+-
+- if ((data->stars[i].x > info->screen.width + 64)
+- ||((data->stars[i].vy>=0)&&(data->stars[i].y - 16*data->stars[i].vy > info->screen.height))
+- ||(data->stars[i].x < -64)
+- ||(data->stars[i].age>=NCOL)) {
+- data->stars[i] = data->stars[data->nbStars-1];
+- data->nbStars--;
+- }
+- else ++i;
+- }
+-}
+-
+-VisualFX flying_star_create(void) {
+- VisualFX vfx = {
+- init: fs_init,
+- free: fs_free,
+- apply: fs_apply,
+- fx_data: 0
+- };
+- return vfx;
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/gfontlib.c /src/gfontlib.c
+--- /home/d4rk/goom2k4-0/src/gfontlib.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/gfontlib.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,229 +0,0 @@
+-#include "goom_config.h"
+-#include "gfontrle.h"
+-#include "gfontlib.h"
+-#include <string.h>
+-#include <stdlib.h>
+-
+-static Pixel ***font_chars;
+-static int *font_width;
+-static int *font_height;
+-static Pixel ***small_font_chars;
+-static int *small_font_width;
+-static int *small_font_height;
+-
+-void gfont_load (void) {
+- unsigned char *gfont;
+- unsigned int i = 0, j = 0;
+- unsigned int nba = 0;
+- unsigned int current = 32;
+- int *font_pos;
+- /* decompress le rle */
+-
+-
+-
+- gfont = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel);
+- while (i<the_font.rle_size) {
+- unsigned char c = the_font.rle_pixel [i++];
+- if (c == 0) {
+- unsigned int nb = the_font.rle_pixel [i++];
+- while (nb--)
+- gfont[j++] = 0;
+- }
+- else
+- gfont [j++] = c;
+- }
+-
+- /* determiner les positions de chaque lettre. */
+-
+- font_height = calloc (256,sizeof(int));
+- small_font_height = calloc (256,sizeof(int));
+- font_width = calloc (256,sizeof(int));
+- small_font_width = calloc (256,sizeof(int));
+- font_chars = calloc (256,sizeof(int**));
+- small_font_chars = calloc (256,sizeof(int**));
+- font_pos = calloc (256,sizeof(int));
+-
+- for (i=0;i<the_font.width;i++) {
+- unsigned char a = gfont [i*4 + 3];
+- if (a)
+- nba ++;
+- else
+- nba = 0;
+- if (nba == 2) {
+- font_width [current] = i - font_pos [current];
+- small_font_width [current] = font_width [current]/2;
+- font_pos [++current] = i;
+- font_height [current] = the_font.height - 2;
+- small_font_height [current] = font_height [current]/2;
+- }
+- }
+- font_pos [current] = 0;
+- font_height [current] = 0;
+- small_font_height [current] = 0;
+-
+- /* charger les lettres et convertir au format de la machine */
+-
+- for (i=33;i<current;i++) {
+- int x; int y;
+- font_chars [i] = malloc (font_height[i]*sizeof(int *));
+- small_font_chars [i] = malloc (font_height[i]*sizeof(int *)/2);
+- for (y = 0; y < font_height[i]; y++) {
+- font_chars [i][y] = malloc (font_width[i]*sizeof(int));
+- for (x = 0; x < font_width[i]; x++) {
+- unsigned int r,g,b,a;
+- r = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4)];
+- g = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+1)];
+- b = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+2)];
+- a = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+3)];
+- font_chars [i][y][x].val =
+- (r<<(ROUGE*8))|(g<<(VERT*8))|(b<<(BLEU*8))|(a<<(ALPHA*8));
+- }
+- }
+- for (y = 0; y < font_height[i]/2; y++) {
+- small_font_chars [i][y] = malloc (font_width[i]*sizeof(int)/2);
+- for (x = 0; x < font_width[i]/2; x++) {
+- unsigned int r1,g1,b1,a1,r2,g2,b2,a2,r3,g3,b3,a3,r4,g4,b4,a4;
+- r1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4)];
+- g1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+1)];
+- b1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+2)];
+- a1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+3)];
+- r2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+4)];
+- g2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+5)];
+- b2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+6)];
+- a2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+7)];
+- r3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4)];
+- g3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+1)];
+- b3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+2)];
+- a3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+3)];
+- r4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+4)];
+- g4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+5)];
+- b4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+6)];
+- a4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+7)];
+- small_font_chars [i][y][x].val =
+- (((r1 + r2 + r3 + r4)>>2)<<(ROUGE*8))|
+- (((g1 + g2 + g3 + g4)>>2)<<(VERT*8))|
+- (((b1 + b2 + b3 + b4)>>2)<<(BLEU*8))|
+- (((a1 + a2 + a3 + a4)>>2)<<(ALPHA*8));
+- }
+- }
+- }
+-
+- /* definir les lettres restantes */
+-
+- for (i=0;i<256;i++) {
+- if (font_chars[i]==0) {
+- font_chars[i]=font_chars[42];
+- small_font_chars[i]=small_font_chars[42];
+- font_width[i]=font_width[42];
+- font_pos[i]=font_pos[42];
+- font_height[i]=font_height[42];
+- small_font_width[i]=small_font_width[42];
+- small_font_height[i]=small_font_height[42];
+- }
+- }
+-
+- font_width [32] = (the_font.height / 2) - 1;
+- small_font_width [32] = font_width [32]/2;
+- font_chars [32] = 0;
+- small_font_chars [32] = 0;
+-}
+-
+-void goom_draw_text (Pixel * buf,int resolx,int resoly,
+- int x, int y,
+- const char *str, float charspace, int center) {
+- float fx = (float) x;
+- int fin = 0;
+-
+- Pixel ***cur_font_chars;
+- int *cur_font_width;
+- int *cur_font_height;
+-
+- if (resolx>320)
+- {
+- /* printf("use big\n"); */
+- cur_font_chars = font_chars;
+- cur_font_width = font_width;
+- cur_font_height = font_height;
+- }
+- else
+- {
+- /* printf ("use small\n"); */
+- cur_font_chars = small_font_chars;
+- cur_font_width = small_font_width;
+- cur_font_height = small_font_height;
+- }
+-
+- if (cur_font_chars == NULL)
+- return ;
+-
+- if (center) {
+- unsigned char *tmp = (unsigned char*)str;
+- float lg = -charspace;
+-
+- while (*tmp != '\0')
+- lg += cur_font_width[*(tmp++)] + charspace;
+-
+- fx -= lg / 2;
+- }
+-
+- while (!fin) {
+- unsigned char c = *str;
+-
+- x = (int) fx;
+-
+- if (c == '\0')
+- fin = 1;
+- else if (cur_font_chars[c]==0) {
+- fx += cur_font_width[c] + charspace;
+- }
+- else {
+- int xx, yy;
+- int xmin = x;
+- int xmax = x + cur_font_width[c];
+- int ymin = y - cur_font_height[c];
+- int ymax = y;
+-
+- yy = ymin;
+-
+- if (xmin < 0)
+- xmin = 0;
+-
+- if (xmin >= resolx - 1)
+- return;
+-
+- if (xmax >= (int) resolx)
+- xmax = resolx - 1;
+-
+- if (yy < 0)
+- yy = 0;
+-
+- if (yy <= (int) resoly - 1) {
+- if (ymax >= (int) resoly - 1)
+- ymax = resoly - 1;
+-
+- for (; yy < ymax; yy++)
+- for (xx = xmin; xx < xmax; xx++)
+- {
+- Pixel color = cur_font_chars[c][yy - ymin][xx - x];
+- Pixel transparency;
+- transparency.val = color.val & A_CHANNEL;
+- if (transparency.val)
+- {
+- if (transparency.val==A_CHANNEL) buf[yy * resolx + xx] = color;
+- else
+- {
+- Pixel back = buf[yy * resolx + xx];
+- unsigned int a1 = color.channels.a;
+- unsigned int a2 = 255 - a1;
+- buf[yy * resolx + xx].channels.r = (unsigned char)((((unsigned int)color.channels.r * a1) + ((unsigned int)back.channels.r * a2)) >> 8);
+- buf[yy * resolx + xx].channels.g = (unsigned char)((((unsigned int)color.channels.g * a1) + ((unsigned int)back.channels.g * a2)) >> 8);
+- buf[yy * resolx + xx].channels.b = (unsigned char)((((unsigned int)color.channels.b * a1) + ((unsigned int)back.channels.b * a2)) >> 8);
+- }
+- }
+- }
+- }
+- fx += cur_font_width[c] + charspace;
+- }
+- str++;
+- }
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/gfontlib.h /src/gfontlib.h
+--- /home/d4rk/goom2k4-0/src/gfontlib.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/gfontlib.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,10 +0,0 @@
+-#ifndef _GFONTLIB_H
+-#define _GFONTLIB_H
+-
+-#include "goom_graphic.h"
+-
+-void gfont_load (void);
+-void goom_draw_text (Pixel * buf,int resolx,int resoly, int x, int y,
+- const char *str, float chspace, int center);
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/gfontrle.c /src/gfontrle.c
+--- /home/d4rk/goom2k4-0/src/gfontrle.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/gfontrle.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,2500 +0,0 @@
+-/* RGBA C-Source image dump (with zRLE compression) */
+-
+-const struct {
+- unsigned int width;
+- unsigned int height;
+- unsigned int bytes_per_pixel;
+- unsigned int rle_size;
+- unsigned char rle_pixel [49725];
+-} the_font = {
+-1277, 21, 4, 49725, {
+-121,17,164,255,121,17,164,255,121,17,164,255,121,17,164,255,0,8,121,17,
+-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,
+-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,
+-1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,
+-121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,
+-17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,
+-164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,
+-255,121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255,
+-121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255,121,
+-17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164,255,121,17,
+-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,
+-255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,
+-121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,
+-17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,
+-164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,
+-255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,
+-0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,
+-44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,
+-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,
+-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,
+-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,
+-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,
+-1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,
+-121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,
+-17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,
+-164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,
+-255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,
+-121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,
+-17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,
+-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,
+-255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,
+-121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,
+-17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,
+-164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,
+-255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,
+-0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,
+-36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,
+-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,
+-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,
+-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,
+-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,
+-1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,
+-121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,
+-17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,
+-164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,
+-255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,
+-121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,
+-17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,
+-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,
+-255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,
+-121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,
+-17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,
+-164,255,0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,
+-255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,
+-0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,
+-44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20,
+-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,
+-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20,121,17,
+-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,
+-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,
+-1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,
+-121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,
+-17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,
+-164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,
+-255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,
+-121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,
+-17,164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,
+-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,
+-255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,
+-121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,
+-17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,
+-164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,
+-255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,
+-0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,
+-44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,
+-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,
+-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,
+-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,
+-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,
+-1,121,17,164,255,121,17,164,255,121,17,164,255,0,28,121,17,164,0,1,
+-121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,
+-17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,
+-164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164,
+-255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,
+-121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,
+-17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,
+-164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,
+-255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,
+-121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121,
+-17,164,255,121,17,164,255,121,17,164,255,0,56,121,17,164,0,1,121,17,
+-164,255,121,17,164,255,13,4,17,0,1,13,4,17,0,1,13,4,17,0,
+-1,16,5,22,0,13,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,25,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,33,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,33,16,5,22,0,
+-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,
+-1,16,5,22,0,33,16,5,22,0,1,14,4,19,0,1,13,4,17,0,
+-1,13,4,17,0,1,16,5,22,0,61,16,5,22,0,1,14,4,19,0,
+-255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,
+-255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,
+-25,8,6,3,57,10,8,5,85,9,7,4,76,0,12,8,6,3,54,9,
+-8,4,96,9,7,4,85,0,12,8,6,3,57,9,8,4,96,9,7,4,
+-85,0,24,8,6,3,57,11,8,4,85,9,7,4,79,0,12,8,6,3,
+-51,10,8,5,85,8,6,3,85,0,40,8,6,3,57,11,8,4,85,8,
+-6,3,85,0,32,8,6,3,57,10,8,5,85,9,7,4,85,0,28,5,
+-4,2,14,8,6,3,85,9,7,4,85,0,24,8,6,3,74,9,7,4,
+-113,8,6,3,167,8,6,3,139,9,7,4,85,5,4,2,14,0,36,8,
+-6,3,57,9,8,4,110,9,7,4,85,0,24,5,4,2,20,9,7,4,
+-85,9,8,4,85,0,16,9,8,4,57,9,8,4,85,6,5,3,48,0,
+-255,0,29,5,4,2,17,8,6,3,85,9,7,4,82,0,20,5,4,2,
+-3,8,6,3,85,9,7,4,93,8,6,3,153,8,6,3,161,8,6,3,
+-110,9,8,4,85,8,6,3,85,6,5,3,31,0,32,5,4,2,3,8,
+-6,3,85,10,8,5,85,10,7,5,85,0,36,5,4,2,57,8,6,3,
+-85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,
+-108,8,6,3,85,6,5,3,71,0,24,5,4,2,42,8,6,3,85,9,
+-7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,108,8,
+-6,3,85,6,5,3,71,0,48,5,4,2,3,8,6,3,85,9,8,4,
+-85,9,7,4,74,0,16,8,6,3,42,9,7,4,85,8,6,3,85,9,
+-7,4,85,8,6,3,125,8,6,3,170,7,6,4,170,9,7,4,170,12,
+-9,7,170,19,14,10,170,19,13,10,142,8,6,5,28,0,16,5,4,2,
+-51,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,
+-164,8,6,3,108,8,6,3,85,6,5,3,71,0,20,10,8,5,57,9,
+-7,4,170,8,6,3,170,8,6,3,170,8,6,3,161,8,6,3,142,9,
+-7,4,96,9,7,4,85,8,6,3,85,9,7,4,85,9,7,4,74,0,
+-20,5,4,2,42,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3,
+-170,8,6,3,164,8,6,3,108,8,6,3,85,6,5,3,76,0,24,8,
+-6,5,82,10,8,7,133,12,9,7,170,15,11,8,170,15,11,8,170,15,
+-11,8,170,13,10,8,170,10,8,7,161,10,8,7,85,6,5,5,28,0,
+-96,8,6,3,74,9,8,4,85,8,6,3,57,0,68,7,6,4,28,9,
+-7,4,85,9,7,4,85,5,4,2,17,0,40,5,4,2,42,8,6,3,
+-85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,
+-108,8,6,3,85,6,5,3,85,0,24,8,6,5,85,10,8,7,133,12,
+-9,7,170,15,10,8,170,15,11,8,170,15,11,8,170,13,10,8,170,10,
+-8,7,150,8,6,5,62,0,24,8,6,5,82,10,8,7,133,12,9,7,
+-170,15,10,8,170,14,10,7,170,9,7,4,170,8,6,5,147,10,8,5,
+-85,7,6,4,85,5,4,4,3,0,16,12,9,7,57,11,8,6,161,9,
+-7,6,170,10,8,7,170,13,10,8,170,14,10,7,170,13,10,8,170,12,
+-9,7,170,10,8,7,156,10,8,7,85,6,5,5,25,0,20,6,5,3,
+-57,8,7,5,85,9,7,4,110,9,7,4,170,10,8,5,170,10,8,5,
+-170,11,8,6,170,10,8,7,150,10,8,7,85,6,5,5,25,0,16,15,
+-11,8,57,11,8,6,170,9,7,6,170,10,8,7,170,13,10,8,170,15,
+-11,8,170,15,11,8,170,13,10,8,170,10,8,7,159,10,8,7,85,6,
+-5,5,25,0,16,15,11,8,59,11,9,6,170,9,7,4,125,10,8,5,
+-85,8,6,3,133,8,6,3,167,8,6,3,170,8,6,3,170,9,8,4,
+-113,0,16,8,6,3,42,10,8,5,85,10,7,5,85,9,7,4,125,10,
+-8,5,170,12,10,7,170,14,11,7,170,19,14,10,170,19,14,10,142,8,
+-6,5,28,0,16,8,6,5,82,10,8,7,133,12,9,7,170,15,11,8,
+-170,15,11,8,170,15,11,8,170,13,10,8,170,10,8,7,161,10,8,7,
+-85,6,5,5,25,0,16,12,10,7,74,14,10,7,170,12,9,7,139,7,
+-6,4,28,0,16,10,8,7,110,14,10,7,170,13,10,8,125,0,16,13,
+-10,8,71,15,11,8,170,13,10,8,130,5,5,4,8,0,44,11,8,6,
+-85,9,7,4,170,10,8,5,93,0,16,12,9,7,57,10,8,5,167,11,
+-8,6,110,6,5,3,8,0,16,11,8,6,57,10,7,5,159,11,8,6,
+-102,0,16,8,6,3,51,10,8,5,85,9,7,4,85,0,40,10,7,5,
+-57,11,9,6,85,7,6,4,57,0,28,7,5,4,28,10,8,5,85,11,
+-8,6,85,0,16,8,6,3,48,10,8,5,85,8,6,3,85,0,20,8,
+-6,3,57,11,8,4,85,9,7,4,79,0,20,5,4,2,45,8,6,3,
+-85,9,7,4,85,9,7,4,88,9,7,4,108,9,8,4,93,9,7,4,
+-85,8,6,3,85,6,5,3,74,0,20,8,6,3,45,9,7,4,85,8,
+-6,3,85,9,7,4,85,8,6,3,125,8,6,3,170,8,6,3,164,8,
+-6,3,108,8,6,3,85,6,5,3,74,0,24,6,5,3,57,8,7,5,
+-85,10,8,5,85,9,7,4,119,8,6,3,142,9,7,4,130,10,8,5,
+-91,10,7,5,85,6,5,3,85,0,20,9,7,4,57,10,8,5,85,10,
+-7,5,85,10,8,5,85,8,6,3,144,8,6,3,170,8,6,3,164,8,
+-6,3,108,8,6,3,85,6,5,3,71,0,24,5,4,2,45,8,6,3,
+-85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,9,7,4,
+-105,8,6,3,85,6,5,3,74,0,20,11,8,4,59,9,7,4,170,8,
+-6,3,164,9,7,4,91,8,6,3,85,8,6,3,85,8,6,3,85,9,
+-7,4,85,8,6,3,142,9,6,4,170,9,8,4,116,0,16,8,6,3,
+-48,10,8,5,85,9,7,4,85,0,20,8,6,3,57,11,8,4,85,9,
+-7,4,76,0,16,8,6,3,48,10,8,5,85,9,7,4,85,0,20,8,
+-6,3,57,11,8,4,85,9,7,4,76,0,16,8,6,3,48,10,8,5,
+-85,9,7,4,85,0,28,8,6,3,57,11,8,4,85,9,7,4,76,0,
+-16,8,6,3,54,9,8,4,96,9,7,4,85,0,20,8,6,3,57,9,
+-8,4,96,9,7,4,85,0,16,10,8,5,57,10,7,5,153,10,8,5,
+-93,0,20,10,8,7,93,14,11,7,170,13,10,8,136,0,16,11,8,6,
+-91,11,8,6,170,9,7,4,170,9,7,4,170,8,6,5,170,8,6,3,
+-119,9,7,4,85,8,6,3,85,8,6,3,85,9,7,4,85,9,7,4,
+-76,0,16,8,6,3,42,9,7,4,85,8,6,3,85,8,6,3,122,9,
+-8,4,102,0,16,8,6,3,51,9,7,4,85,6,5,3,45,0,40,12,
+-8,5,57,8,6,3,156,10,7,5,93,11,8,6,85,11,8,6,85,0,
+-28,6,5,5,14,13,10,8,85,8,7,5,45,0,80,10,8,5,57,10,
+-7,5,156,10,8,5,96,0,76,9,7,4,57,10,8,5,93,10,8,5,
+-85,0,140,10,8,7,110,13,10,8,170,12,9,7,133,5,5,4,6,0,
+-84,8,6,5,79,10,8,7,127,13,10,8,170,16,12,9,142,8,7,5,
+-28,0,72,8,6,3,57,10,8,5,85,9,6,4,85,0,48,15,11,8,
+-113,25,18,12,170,20,15,11,142,8,7,5,28,0,28,15,11,8,130,22,
+-16,11,170,20,15,11,142,7,6,6,23,0,12,13,10,8,68,12,9,7,
+-170,11,8,6,116,6,5,3,8,0,44,12,9,7,82,15,10,8,170,13,
+-10,8,130,5,5,4,8,0,255,0,197,6,5,3,57,8,6,3,85,0,
+-255,0,149,5,4,2,6,8,6,3,85,8,6,3,156,9,8,4,113,0,
+-16,8,6,3,48,9,8,4,91,9,7,4,76,0,16,10,8,5,57,9,
+-6,4,170,8,6,3,99,5,4,2,34,0,36,8,6,3,71,9,8,4,
+-93,9,8,4,96,8,6,3,85,6,5,3,45,0,12,8,6,3,76,0,
+-44,8,6,3,57,58,31,9,255,93,50,12,255,88,45,11,255,12,10,5,
+-113,0,4,7,6,4,28,54,29,9,255,93,46,12,255,88,45,11,255,12,
+-9,5,122,0,4,7,5,4,37,54,29,9,255,93,46,12,255,88,45,11,
+-255,14,10,5,142,0,16,8,6,3,85,58,31,9,255,93,50,12,255,88,
+-44,11,255,9,7,4,170,0,4,5,4,2,85,52,28,9,255,93,48,12,
+-255,88,44,11,255,12,10,5,170,0,32,7,6,4,85,58,31,9,255,93,
+-50,12,255,88,45,11,255,12,9,5,170,0,24,8,6,3,57,58,31,9,
+-255,93,50,12,255,88,45,11,255,14,10,5,142,0,20,6,5,3,28,19,
+-12,6,227,76,37,11,255,88,45,11,255,14,10,5,139,0,16,9,8,4,
+-170,69,35,10,255,92,47,11,255,92,47,11,255,88,45,11,255,88,45,11,
+-255,16,11,5,227,7,5,4,28,0,28,8,6,3,57,58,31,9,255,93,
+-46,12,255,88,45,11,255,14,10,5,142,0,16,6,5,3,28,19,12,6,
+-227,82,39,11,255,92,47,11,255,14,10,5,105,0,8,7,5,4,20,54,
+-29,9,255,100,50,13,255,30,19,7,255,8,6,3,85,0,255,0,21,6,
+-5,3,28,19,12,6,227,76,37,11,255,88,45,11,255,14,10,5,130,0,
+-12,7,6,4,65,17,11,6,227,71,37,10,255,88,45,11,255,92,47,11,
+-255,92,47,11,255,88,45,11,255,88,44,11,255,88,44,11,255,25,16,6,
+-255,8,6,3,142,0,24,7,5,4,85,17,12,6,229,77,39,12,255,107,
+-51,14,255,113,55,16,255,20,14,9,178,0,28,14,11,7,170,29,18,8,
+-255,74,39,11,255,88,45,11,255,88,45,11,255,92,47,11,255,92,47,11,
+-255,88,45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,5,4,
+-23,0,12,9,7,4,170,26,17,6,255,74,39,11,255,88,45,11,255,88,
+-45,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88,44,11,255,41,
+-24,8,255,12,9,5,227,6,5,3,28,0,36,6,5,3,85,16,11,5,
+-227,71,37,10,255,88,45,11,255,88,44,11,255,12,10,5,113,0,8,8,
+-6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,88,45,11,255,92,
+-46,13,255,100,52,13,255,109,53,16,255,121,63,20,255,158,74,23,255,180,
+-88,27,255,183,90,28,255,26,17,11,142,0,12,10,7,5,170,26,17,6,
+-255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11,255,92,47,11,
+-255,88,45,11,255,88,45,11,255,41,24,8,255,12,9,5,227,6,5,3,
+-28,0,8,7,6,4,8,61,32,10,255,102,51,13,255,92,46,13,255,92,
+-46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,90,45,11,255,84,
+-44,11,255,88,45,11,255,88,44,11,255,14,10,5,119,0,12,9,7,4,
+-153,26,17,6,255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11,
+-255,92,47,11,255,88,45,11,255,88,44,11,255,45,25,8,255,13,10,6,
+-227,7,6,4,28,0,12,17,13,10,170,64,39,21,255,155,78,26,255,169,
+-83,26,255,165,80,24,255,161,79,24,255,145,71,22,255,136,70,21,255,134,
+-69,21,255,88,50,23,255,22,17,11,232,9,8,6,31,0,84,4,4,3,
+-23,12,9,5,173,71,34,10,255,92,43,13,255,33,20,8,255,10,8,5,
+-57,0,64,20,14,7,227,83,42,12,255,92,46,13,255,19,13,6,227,6,
+-5,3,34,0,32,10,8,5,170,26,17,6,255,76,37,11,255,90,46,11,
+-255,92,46,13,255,92,46,13,255,90,45,11,255,90,45,11,255,88,44,11,
+-255,46,26,9,255,18,13,9,227,8,7,5,28,0,12,15,12,8,170,58,
+-35,19,255,134,73,23,255,153,76,24,255,142,69,21,255,131,64,20,255,121,
+-59,18,255,121,59,18,255,121,62,18,255,43,27,12,255,11,9,6,170,0,
+-16,17,13,10,170,64,39,21,255,164,85,27,255,177,86,26,255,154,75,23,
+-255,121,62,18,255,115,56,16,255,119,61,18,255,123,61,20,255,80,45,19,
+-255,22,16,11,227,8,7,5,28,0,8,13,10,8,57,96,48,19,255,165,
+-80,24,255,159,78,24,255,159,78,24,255,165,80,24,255,165,80,24,255,165,
+-80,24,255,159,78,24,255,164,81,25,255,91,52,24,255,22,17,11,227,8,
+-7,5,28,0,12,13,10,8,170,38,24,11,255,99,47,16,255,116,59,17,
+-255,126,65,21,255,142,69,21,255,153,76,24,255,157,74,24,255,155,76,24,
+-255,91,52,24,255,23,18,12,227,8,7,5,28,0,8,13,10,8,57,104,
+-52,21,255,171,84,26,255,155,76,24,255,164,81,25,255,173,81,26,255,180,
+-88,27,255,180,88,27,255,177,86,26,255,169,80,26,255,92,55,25,255,22,
+-17,11,227,8,7,5,28,0,8,13,10,8,57,114,63,25,255,177,86,26,
+-255,114,56,17,255,92,46,13,255,92,47,11,255,93,46,12,255,92,46,13,
+-255,96,48,13,255,92,46,13,255,18,12,5,91,0,8,8,6,3,40,55,
+-29,10,255,108,50,15,255,114,56,17,255,130,67,21,255,153,76,24,255,161,
+-82,24,255,171,84,26,255,179,84,26,255,179,84,26,255,25,17,10,142,0,
+-12,15,12,8,170,64,39,21,255,162,84,27,255,179,88,28,255,183,90,28,
+-255,181,89,28,255,181,89,28,255,172,88,27,255,156,77,25,255,88,50,23,
+-255,22,17,11,227,8,7,5,28,0,8,13,9,6,57,96,48,19,255,153,
+-71,22,255,134,69,21,255,20,14,9,193,0,12,11,8,6,113,124,62,25,
+-255,185,91,28,255,169,80,26,255,22,15,9,142,0,8,11,8,6,57,111,
+-61,24,255,184,90,27,255,177,86,26,255,23,16,10,173,0,40,11,8,6,
+-113,114,59,23,255,144,73,21,255,126,63,21,255,20,14,9,142,0,8,11,
+-9,6,57,97,51,20,255,152,71,23,255,134,69,21,255,20,14,9,187,0,
+-12,12,9,7,96,97,48,18,255,140,71,21,255,138,71,21,255,20,15,9,
+-142,0,8,8,6,3,40,52,28,9,255,93,50,12,255,88,45,11,255,14,
+-10,5,142,0,32,13,10,8,82,91,48,16,255,132,71,21,255,63,36,18,
+-255,10,8,7,136,0,20,7,6,6,62,31,21,12,244,124,66,23,255,134,
+-69,21,255,20,15,9,142,0,8,8,6,3,28,54,29,9,255,93,46,12,
+-255,80,39,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,
+-50,12,255,88,44,11,255,14,10,5,116,0,12,9,7,4,153,26,17,6,
+-255,74,39,11,255,88,45,11,255,88,45,11,255,88,45,11,255,88,45,11,
+-255,88,44,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,4,4,
+-17,0,8,8,6,3,34,54,29,9,255,92,43,11,255,88,44,11,255,88,
+-45,11,255,92,43,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88,
+-44,11,255,45,25,8,255,12,10,5,227,6,5,3,28,0,12,13,10,6,
+-170,40,24,11,255,97,48,16,255,113,55,16,255,115,56,16,255,116,57,17,
+-255,116,57,17,255,113,55,16,255,113,55,16,255,60,33,13,255,18,14,9,
+-227,8,6,5,28,0,8,12,9,7,57,77,38,14,255,118,57,17,255,116,
+-59,17,255,118,60,17,255,109,53,16,255,98,47,13,255,92,47,11,255,88,
+-45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,6,5,3,28,0,
+-12,10,8,5,170,28,18,7,255,76,37,11,255,90,45,11,255,92,46,13,
+-255,94,45,13,255,94,45,13,255,92,46,13,255,92,46,13,255,46,26,9,
+-255,13,10,6,227,6,5,5,28,0,8,7,6,4,8,61,32,10,255,100,
+-50,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92,
+-46,13,255,92,46,13,255,94,47,13,255,98,49,13,255,94,47,13,255,18,
+-12,5,93,0,8,8,6,3,42,60,32,9,255,96,48,13,255,88,45,11,
+-255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,50,12,255,88,
+-44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9,255,93,50,12,
+-255,88,44,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,
+-50,12,255,88,44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9,
+-255,93,50,12,255,88,44,11,255,14,10,5,142,0,20,8,6,3,57,58,
+-31,9,255,93,50,12,255,88,44,11,255,12,10,5,113,0,8,7,6,4,
+-28,54,29,9,255,93,50,12,255,88,45,11,255,14,10,5,142,0,12,8,
+-7,3,57,60,31,9,255,96,48,13,255,92,46,13,255,14,10,5,127,0,
+-8,10,8,5,57,82,42,15,255,135,66,20,255,121,60,20,255,20,15,9,
+-176,0,12,11,9,6,108,107,56,22,255,172,84,25,255,158,74,23,255,22,
+-15,9,142,0,8,11,8,6,54,98,51,19,255,142,72,21,255,136,70,21,
+-255,138,71,21,255,121,59,18,255,100,52,13,255,90,46,11,255,88,44,11,
+-255,88,44,11,255,88,44,11,255,88,45,11,255,12,10,5,113,0,8,8,
+-6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,92,47,11,255,92,
+-47,11,255,18,12,5,85,0,8,7,6,4,45,54,30,9,255,94,47,13,
+-255,31,20,8,255,9,7,4,85,0,32,8,6,3,48,65,33,10,255,114,
+-55,15,255,119,58,18,255,126,63,21,255,128,66,21,255,22,15,9,164,0,
+-20,5,5,4,28,19,14,10,227,141,72,26,255,43,27,16,255,7,6,6,
+-85,0,72,14,10,7,71,96,49,17,255,138,71,21,255,130,67,21,255,22,
+-15,9,164,0,68,12,9,7,76,77,39,14,255,118,57,17,255,109,53,16,
+-255,22,15,9,153,0,132,11,8,6,96,103,53,20,255,144,73,21,255,121,
+-60,20,255,24,16,9,153,0,80,15,12,8,184,61,36,20,255,141,68,24,
+-255,168,82,25,255,171,84,26,255,26,18,11,159,0,68,9,7,4,57,60,
+-32,9,255,96,48,13,255,92,46,13,255,19,12,6,142,0,40,14,10,7,
+-76,129,67,26,255,190,97,29,255,180,88,27,255,26,17,11,161,0,24,14,
+-10,7,85,129,67,26,255,190,97,29,255,180,88,27,255,25,17,10,125,0,
+-8,11,8,6,57,109,60,24,255,175,86,26,255,142,73,23,255,20,14,9,
+-187,0,40,12,9,7,93,121,65,24,255,183,89,26,255,168,82,25,255,21,
+-15,10,178,0,255,0,193,10,8,5,170,39,23,8,255,78,41,11,255,16,
+-11,5,142,0,255,0,141,6,5,3,85,16,11,5,227,71,37,10,255,92,
+-47,11,255,92,47,11,255,18,12,5,85,0,8,8,6,3,28,54,29,9,
+-255,93,46,12,255,88,45,11,255,12,10,5,113,0,12,58,31,9,255,93,
+-50,12,255,88,45,11,255,25,17,6,255,8,6,3,142,0,24,4,4,3,
+-25,10,8,5,173,65,33,10,255,92,46,13,255,92,46,13,255,67,34,10,
+-255,27,18,8,255,9,7,4,156,3,3,2,85,10,8,5,184,69,35,10,
+-255,19,13,6,147,0,40,9,7,4,113,112,55,13,255,141,69,16,255,141,
+-75,16,255,18,13,5,170,0,4,8,6,3,85,110,54,13,255,143,76,16,
+-255,139,68,16,255,19,13,6,170,0,4,8,6,3,85,110,54,13,255,143,
+-76,16,255,141,72,16,255,23,15,6,170,0,12,10,9,5,110,35,21,8,
+-255,129,63,14,255,141,69,16,255,139,68,16,255,52,27,9,255,9,7,4,
+-255,27,17,8,255,135,66,16,255,154,75,17,255,155,79,18,255,91,50,16,
+-255,20,15,9,207,10,9,7,28,0,16,5,4,4,20,8,6,3,127,31,
+-20,8,255,130,66,15,255,143,76,16,255,143,76,16,255,67,34,10,255,10,
+-8,5,215,10,8,5,170,13,10,6,142,7,5,4,23,0,8,12,9,5,
+-85,115,59,14,255,149,72,16,255,143,76,16,255,18,12,5,235,0,16,7,
+-6,4,28,14,10,5,227,92,46,13,255,143,73,16,255,143,70,16,255,18,
+-13,5,170,0,12,14,10,5,170,53,28,10,255,114,56,13,255,56,29,9,
+-255,16,11,5,255,34,20,7,255,112,55,13,255,87,42,12,255,19,13,6,
+-235,8,7,5,40,0,24,10,8,5,85,114,56,13,255,143,70,16,255,141,
+-72,16,255,23,15,6,170,0,12,7,6,4,28,14,10,5,227,90,44,13,
+-255,112,57,13,255,47,26,8,255,11,8,4,57,0,12,25,16,6,227,96,
+-48,13,255,112,57,13,255,26,16,7,255,8,6,5,85,0,24,13,10,6,
+-85,8,7,5,57,0,20,6,5,3,28,15,11,6,85,9,7,4,28,0,
+-36,9,7,4,105,10,8,5,170,10,8,5,130,6,5,3,23,0,156,8,
+-6,3,136,77,39,12,255,143,73,16,255,139,74,16,255,18,12,5,170,0,
+-12,21,14,6,227,112,57,13,255,141,69,16,255,80,40,11,255,16,11,5,
+-255,14,10,5,227,18,13,5,255,72,35,11,255,136,69,15,255,130,66,15,
+-255,46,26,9,255,8,6,3,105,0,16,8,7,5,57,42,27,13,255,150,
+-79,21,255,184,94,21,255,195,99,22,255,199,106,24,255,26,18,11,255,0,
+-24,10,8,7,99,83,45,18,255,144,74,17,255,143,70,16,255,94,47,13,
+-255,18,13,5,255,16,11,5,173,14,10,5,227,52,27,9,255,132,67,15,
+-255,139,68,16,255,75,39,12,255,10,7,5,116,0,8,6,5,3,57,52,
+-27,9,255,137,73,16,255,143,76,16,255,94,47,13,255,18,13,5,255,16,
+-11,5,173,14,10,5,227,52,27,9,255,132,67,15,255,139,74,16,255,75,
+-39,12,255,10,8,5,142,0,32,8,6,5,85,22,15,7,255,102,51,13,
+-255,137,67,16,255,140,71,15,255,141,75,16,255,20,13,5,170,0,8,9,
+-6,4,85,108,55,13,255,141,69,16,255,139,74,16,255,74,36,11,255,18,
+-12,7,255,20,13,7,181,22,15,9,207,20,13,9,238,18,13,9,252,23,
+-16,10,255,31,21,12,218,14,11,7,42,0,8,7,6,4,57,40,22,9,
+-255,130,66,15,255,141,75,16,255,84,42,11,255,18,12,5,255,16,12,5,
+-181,14,10,5,241,69,35,10,255,140,69,17,255,154,78,17,255,117,60,18,
+-255,17,13,8,142,0,12,21,14,8,190,28,18,9,255,23,15,8,255,21,
+-14,8,255,21,14,8,255,23,15,8,255,38,24,11,255,98,53,17,255,151,
+-74,18,255,150,76,17,255,141,75,16,255,21,15,6,170,0,8,5,4,2,
+-28,33,20,8,255,130,66,15,255,141,72,16,255,84,42,11,255,18,12,5,
+-255,18,12,5,176,14,10,5,235,57,29,10,255,140,72,17,255,165,85,20,
+-255,121,67,24,255,14,11,7,142,0,8,8,6,5,57,72,46,23,255,198,
+-113,29,255,200,102,23,255,131,68,22,255,33,21,12,255,17,13,8,255,21,
+-14,8,255,88,47,19,255,192,99,23,255,203,113,26,255,146,87,29,255,13,
+-11,8,164,0,12,10,8,5,85,13,10,6,170,11,9,6,142,7,6,4,
+-28,0,12,13,10,8,113,18,14,9,170,16,13,9,147,10,8,7,28,0,
+-24,10,8,7,28,20,15,11,227,104,62,21,255,184,94,21,255,117,62,22,
+-255,17,12,8,227,7,5,4,28,0,64,11,8,6,170,67,35,16,255,164,
+-85,21,255,115,58,16,255,20,14,7,252,8,6,5,85,0,24,9,7,4,
+-82,66,37,13,255,145,75,18,255,154,78,17,255,115,58,16,255,29,18,8,
+-255,14,10,7,255,16,11,7,255,65,34,12,255,150,74,19,255,189,97,22,
+-255,138,79,27,255,14,12,9,142,0,8,7,6,6,57,55,33,16,255,158,
+-81,19,255,162,80,19,255,102,53,17,255,24,15,7,255,19,12,6,170,14,
+-10,5,204,46,26,9,255,137,67,16,255,139,71,16,255,49,27,10,255,7,
+-6,4,105,0,8,7,6,6,62,72,46,23,255,199,115,32,255,205,111,28,
+-255,155,84,26,255,41,24,14,255,18,13,9,255,25,16,10,255,110,61,25,
+-255,199,100,28,255,205,112,30,255,146,87,29,255,13,11,8,142,0,8,10,
+-8,7,147,180,87,25,255,206,111,27,255,203,105,26,255,164,85,27,255,40,
+-24,15,255,20,14,9,255,26,17,11,255,121,64,26,255,201,101,28,255,205,
+-112,30,255,146,87,29,255,14,11,7,142,0,8,8,6,5,57,71,44,22,
+-255,192,108,25,255,198,101,23,255,150,78,25,255,41,24,14,255,32,21,13,
+-255,74,41,21,255,184,105,27,255,202,104,25,255,202,118,27,255,174,102,31,
+-255,17,14,10,142,0,8,11,9,6,136,182,92,25,255,206,112,29,255,205,
+-111,28,255,166,79,27,255,43,25,16,255,21,15,10,255,29,19,12,255,116,
+-67,27,255,202,107,31,255,206,113,31,255,146,87,29,255,12,10,7,142,0,
+-8,11,8,6,144,185,93,26,255,202,103,23,255,157,77,18,255,83,42,12,
+-255,19,13,6,255,13,10,6,255,20,13,7,255,27,17,8,255,28,18,9,
+-227,10,8,5,45,0,8,11,9,6,142,139,73,20,255,198,96,21,255,199,
+-106,24,255,155,78,26,255,41,25,14,255,21,15,10,255,28,18,11,255,38,
+-24,15,255,40,24,15,227,14,10,7,62,0,8,8,7,5,57,65,41,20,
+-255,197,108,28,255,205,111,28,255,170,88,27,255,43,27,16,255,19,14,10,
+-255,29,19,12,255,123,66,24,255,181,84,20,255,170,87,19,255,114,60,17,
+-255,11,10,6,142,0,8,11,9,6,85,119,60,15,255,154,75,17,255,154,
+-78,17,255,18,13,7,255,0,12,13,10,8,170,191,102,30,255,209,118,30,
+-255,207,113,30,255,28,19,11,201,0,8,13,10,8,105,166,87,23,255,198,
+-101,23,255,198,97,23,255,26,18,11,255,0,40,13,10,8,170,189,100,28,
+-255,206,111,27,255,204,102,27,255,28,20,11,201,0,8,12,10,7,116,184,
+-93,27,255,206,107,27,255,203,113,26,255,23,17,10,255,0,8,6,5,5,
+-28,25,18,12,244,192,105,27,255,206,112,29,255,207,117,30,255,32,22,13,
+-170,0,8,11,9,6,88,112,57,13,255,143,70,16,255,141,69,16,255,17,
+-12,6,227,0,32,14,11,9,170,184,92,25,255,206,111,27,255,192,111,31,
+-255,49,33,18,255,10,8,7,122,0,12,7,7,6,59,22,16,11,232,167,
+-100,28,255,205,112,30,255,205,116,30,255,26,18,11,210,0,8,8,7,3,
+-85,110,54,13,255,141,69,16,255,141,75,16,255,25,16,6,255,5,4,4,
+-40,0,8,10,8,5,85,112,55,13,255,141,75,16,255,141,75,16,255,20,
+-13,5,170,0,8,5,4,2,28,33,20,8,255,130,66,15,255,141,72,16,
+-255,112,55,13,255,45,25,8,255,26,17,6,255,33,20,8,255,94,47,13,
+-255,141,69,16,255,144,71,17,255,80,40,13,255,9,7,4,125,0,8,10,
+-8,5,85,112,57,13,255,148,79,17,255,141,75,16,255,87,42,12,255,19,
+-13,6,255,14,10,5,215,15,10,6,255,60,31,11,255,143,71,18,255,160,
+-82,19,255,96,54,17,255,12,9,7,142,0,8,8,6,5,57,71,44,22,
+-255,192,100,25,255,199,106,24,255,185,93,26,255,91,50,22,255,58,33,17,
+-255,72,41,19,255,158,81,25,255,199,106,24,255,199,106,24,255,138,79,27,
+-255,13,11,8,142,0,8,10,8,7,147,166,87,23,255,203,108,24,255,202,
+-108,25,255,153,77,26,255,38,22,13,255,15,11,6,255,14,10,5,255,52,
+-28,9,255,132,70,15,255,141,75,16,255,80,41,13,255,10,8,5,139,0,
+-8,7,6,6,57,48,29,13,255,154,79,19,255,160,85,19,255,108,56,17,
+-255,30,18,9,255,16,11,7,255,24,15,9,255,96,51,17,255,167,86,20,
+-255,181,88,20,255,140,75,23,255,18,14,9,144,0,12,22,14,7,193,22,
+-13,7,255,20,13,7,255,78,40,15,255,165,81,20,255,177,90,20,255,177,
+-90,20,255,115,58,20,255,32,20,11,255,24,15,9,255,30,19,9,227,11,
+-8,6,54,0,8,11,9,6,142,139,68,20,255,166,78,19,255,144,71,17,
+-255,19,12,6,215,0,12,9,7,4,136,114,56,13,255,143,70,16,255,139,
+-68,16,255,19,13,6,170,0,8,10,7,5,85,112,55,13,255,143,70,16,
+-255,139,74,16,255,17,11,6,221,0,12,9,7,4,136,114,56,13,255,143,
+-70,16,255,141,75,16,255,20,13,5,170,0,8,9,6,4,85,110,54,13,
+-255,141,69,16,255,141,72,16,255,17,11,6,221,0,20,9,7,4,136,114,
+-56,13,255,143,73,16,255,139,74,16,255,19,13,6,170,0,8,8,6,3,
+-85,110,54,13,255,143,76,16,255,141,69,16,255,18,12,5,252,0,12,11,
+-9,6,170,131,69,18,255,170,87,19,255,168,86,19,255,28,19,9,170,0,
+-8,11,8,6,85,145,74,26,255,204,102,27,255,203,105,26,255,52,33,17,
+-255,6,5,5,57,0,8,17,14,10,227,190,107,25,255,204,113,25,255,174,
+-86,27,255,18,13,9,170,0,12,28,18,11,198,37,23,14,255,32,21,13,
+-255,21,15,10,255,20,14,9,255,38,23,11,255,87,44,12,255,137,70,16,
+-255,141,72,16,255,143,70,16,255,141,72,16,255,18,12,5,170,0,8,9,
+-6,4,85,110,54,13,255,145,74,16,255,141,69,16,255,94,47,13,255,27,
+-17,8,227,12,8,5,28,0,8,14,10,7,85,121,62,18,255,172,87,19,
+-255,139,69,18,255,20,15,9,227,0,36,21,14,8,227,117,61,24,255,199,
+-100,28,255,205,106,26,255,204,110,27,255,26,18,11,255,0,16,8,7,5,
+-28,20,15,11,227,135,73,22,255,192,97,21,255,165,83,22,255,33,22,12,
+-255,10,9,7,85,0,68,11,9,6,170,184,97,27,255,206,112,29,255,204,
+-110,27,255,28,19,11,255,0,68,14,11,7,170,179,93,24,255,202,103,23,
+-255,198,97,23,255,22,15,9,255,0,132,9,7,6,170,125,63,18,255,158,
+-77,17,255,146,75,17,255,17,12,6,255,0,76,8,6,5,76,72,46,23,
+-255,197,108,28,255,201,107,24,255,164,85,27,255,37,22,14,227,13,9,6,
+-48,0,68,12,9,7,170,138,67,19,255,170,79,19,255,168,86,19,255,20,
+-14,9,255,0,40,8,7,5,20,21,15,10,184,26,17,11,255,26,17,11,
+-215,12,9,7,74,0,24,8,7,5,20,21,15,10,184,26,17,11,255,31,
+-21,12,207,18,13,9,28,0,8,11,9,8,156,184,93,27,255,208,105,29,
+-255,205,111,28,255,28,19,11,255,0,40,14,11,7,170,184,92,25,255,203,
+-104,24,255,200,98,23,255,26,18,11,255,0,255,0,189,8,7,5,57,51,
+-29,12,255,152,75,19,255,162,86,19,255,19,13,8,246,0,255,0,137,6,
+-5,3,28,19,13,6,249,92,46,13,255,123,63,14,255,78,39,11,255,21,
+-15,6,227,9,8,4,28,0,8,9,8,4,85,110,59,13,255,141,69,16,
+-255,141,75,16,255,21,14,6,170,0,12,16,11,5,170,52,28,9,255,115,
+-59,14,255,116,60,15,255,43,26,10,255,9,7,6,125,0,16,8,7,5,
+-28,21,17,10,227,109,59,18,255,160,82,19,255,121,64,18,255,62,34,13,
+-255,94,53,17,255,149,78,20,255,102,54,19,255,32,22,11,255,72,39,15,
+-255,121,62,18,255,24,17,9,187,0,40,8,6,3,167,128,66,15,255,161,
+-85,17,255,159,81,18,255,24,15,7,178,0,4,6,5,3,37,48,28,11,
+-255,173,92,20,255,181,96,20,255,21,15,8,221,0,4,6,5,3,28,40,
+-24,9,255,143,74,18,255,158,80,17,255,21,15,6,181,0,8,10,8,5,
+-54,107,51,14,255,157,83,18,255,164,84,19,255,176,89,19,255,189,92,20,
+-255,191,98,22,255,190,106,23,255,197,110,26,255,203,108,24,255,203,117,24,
+-255,205,119,26,255,207,122,30,255,199,118,32,255,32,23,13,170,0,12,7,
+-6,4,85,22,15,7,232,113,54,14,255,146,75,17,255,158,80,17,255,154,
+-78,17,255,158,80,17,255,148,76,17,255,139,71,16,255,135,66,16,255,135,
+-66,16,255,21,14,6,136,0,8,10,8,5,85,128,66,15,255,161,85,17,
+-255,158,80,17,255,25,16,6,204,0,12,7,6,4,28,25,16,8,227,102,
+-50,15,255,148,76,17,255,142,73,17,255,84,45,13,255,10,8,5,113,0,
+-8,9,7,4,82,107,53,14,255,146,75,17,255,84,41,13,255,8,7,5,
+-198,3,2,2,23,5,4,4,136,38,23,9,255,136,70,17,255,140,72,17,
+-255,21,15,6,178,0,24,7,6,4,57,45,26,10,255,143,74,18,255,158,
+-80,17,255,26,17,6,170,0,12,24,16,7,227,115,58,16,255,148,76,17,
+-255,46,26,9,255,7,6,4,156,0,16,5,4,4,71,19,13,6,255,139,
+-71,16,255,140,72,17,255,43,26,10,255,9,8,4,85,0,16,14,10,5,
+-85,109,52,14,255,38,23,9,255,6,5,3,85,0,12,4,4,3,28,15,
+-12,6,227,115,56,16,255,29,19,8,170,0,32,13,10,6,113,122,64,21,
+-255,164,85,21,255,138,71,17,255,21,15,6,161,0,156,13,10,6,227,137,
+-67,16,255,154,75,17,255,84,45,13,255,10,8,5,116,0,8,9,7,4,
+-85,111,55,14,255,158,87,17,255,158,80,17,255,19,13,6,255,4,4,3,
+-28,0,4,3,3,2,113,17,12,6,255,139,71,16,255,161,85,17,255,146,
+-75,17,255,20,14,7,210,0,16,16,13,9,110,184,105,27,255,209,123,30,
+-255,210,124,31,255,208,123,31,255,207,122,30,255,27,20,12,255,0,24,13,
+-11,8,147,143,75,20,255,161,85,17,255,158,80,17,255,27,18,8,227,5,
+-4,2,28,0,8,10,7,5,198,131,65,16,255,161,85,17,255,150,76,17,
+-255,21,14,6,170,0,8,10,8,5,85,123,61,16,255,163,83,18,255,158,
+-80,17,255,27,18,8,227,5,4,2,28,0,8,9,7,4,198,130,66,15,
+-255,163,83,18,255,148,76,17,255,21,14,6,193,0,28,7,6,4,85,22,
+-15,7,255,131,65,16,255,154,78,17,255,154,78,17,255,154,78,17,255,154,
+-78,17,255,21,15,6,170,0,8,10,8,5,85,129,64,16,255,163,86,18,
+-255,180,91,19,255,29,20,10,255,3,3,2,93,0,36,10,8,5,122,121,
+-60,16,255,161,85,17,255,159,81,18,255,24,15,7,255,4,4,3,34,0,
+-4,2,2,1,6,17,13,8,181,181,93,22,255,203,108,24,255,205,114,26,
+-255,32,23,13,210,0,36,5,4,4,161,30,22,13,255,198,116,29,255,206,
+-106,25,255,191,96,20,255,26,17,7,170,0,8,9,7,4,85,116,60,15,
+-255,161,85,17,255,158,80,17,255,21,14,6,255,5,4,2,28,0,4,2,
+-2,1,3,12,9,7,215,190,107,25,255,211,124,30,255,208,134,37,255,32,
+-22,13,178,0,8,13,11,8,96,187,112,32,255,209,123,30,255,191,96,20,
+-255,28,19,9,255,4,3,3,74,0,4,3,2,2,28,13,10,8,227,196,
+-120,31,255,211,124,30,255,199,106,24,255,27,19,10,170,0,8,13,10,6,
+-57,114,61,19,255,178,91,21,255,182,102,23,255,23,17,10,173,0,8,11,
+-9,6,91,146,85,25,255,198,113,29,255,196,120,31,255,27,20,12,207,0,
+-20,5,5,4,28,21,17,12,227,190,118,33,255,209,131,40,255,161,100,34,
+-255,17,14,10,227,5,5,4,28,0,72,9,8,6,170,91,59,28,255,189,
+-94,24,255,162,83,19,255,39,25,12,255,7,7,6,85,0,20,13,11,8,
+-142,183,103,24,255,203,112,24,255,203,112,24,255,42,26,13,249,5,4,4,
+-62,0,4,3,2,2,25,12,9,7,227,195,115,30,255,212,127,35,255,211,
+-132,38,255,32,22,13,181,0,8,12,10,7,85,124,65,17,255,161,85,17,
+-255,159,78,18,255,21,14,6,255,5,4,2,28,0,8,7,6,4,224,133,
+-68,16,255,159,81,18,255,146,72,17,255,22,14,7,170,0,8,13,11,8,
+-91,185,111,32,255,210,125,33,255,205,114,26,255,37,26,14,255,4,4,3,
+-85,0,4,4,4,4,28,13,10,8,227,193,105,26,255,206,111,27,255,202,
+-118,27,255,32,22,13,170,0,8,11,9,6,127,174,91,23,255,202,102,21,
+-255,200,105,21,255,36,23,13,255,4,4,3,85,0,4,3,3,2,28,13,
+-11,8,227,198,118,33,255,212,127,35,255,208,128,33,255,31,22,12,181,0,
+-8,13,11,8,91,185,114,30,255,211,124,30,255,208,122,29,255,34,24,13,
+-255,4,4,3,85,0,4,7,6,6,113,32,24,13,255,185,95,22,255,202,
+-98,21,255,198,97,23,255,33,22,12,170,0,8,10,8,7,156,190,108,27,
+-255,212,126,33,255,211,127,36,255,40,26,15,255,4,4,3,85,0,4,3,
+-3,2,28,13,11,8,227,198,118,33,255,214,129,37,255,211,132,38,255,32,
+-23,13,173,0,8,10,8,7,144,167,87,22,255,185,94,20,255,165,87,18,
+-255,25,17,8,255,3,3,2,57,0,28,13,11,8,170,195,112,30,255,210,
+-125,33,255,208,117,29,255,39,26,14,255,4,4,3,85,0,28,12,10,7,
+-150,184,108,27,255,211,124,30,255,211,127,36,255,40,27,15,255,4,4,3,
+-85,0,4,3,3,2,28,17,13,8,178,138,71,17,255,161,85,17,255,155,
+-79,18,255,21,14,6,170,0,8,10,8,5,85,124,61,15,255,169,89,18,
+-255,180,91,19,255,25,18,10,255,0,12,13,11,8,170,196,113,31,255,211,
+-124,30,255,205,119,26,255,26,18,11,204,0,8,11,9,6,88,134,70,19,
+-255,173,87,18,255,168,86,19,255,20,13,7,255,0,40,13,11,8,170,196,
+-113,31,255,210,125,33,255,207,122,30,255,24,18,11,212,0,8,11,9,6,
+-119,180,93,23,255,203,108,24,255,202,103,23,255,20,15,9,255,0,8,15,
+-13,10,195,101,63,26,255,202,117,25,255,206,128,35,255,160,106,35,255,15,
+-13,10,142,0,8,10,8,5,147,139,70,20,255,191,96,20,255,200,105,21,
+-255,25,18,10,255,0,32,13,10,8,170,189,99,26,255,206,115,27,255,205,
+-106,26,255,185,106,28,255,79,52,26,255,10,9,7,122,0,4,7,6,6,
+-42,36,27,17,244,172,106,35,255,207,128,34,255,211,126,34,255,211,127,36,
+-255,24,18,11,227,0,8,10,8,5,85,124,64,15,255,159,81,18,255,158,
+-80,17,255,76,40,13,255,11,8,6,210,0,8,12,9,5,85,129,64,16,
+-255,161,85,17,255,158,80,17,255,26,16,7,170,0,8,9,7,4,85,115,
+-56,16,255,161,85,17,255,159,81,18,255,49,27,10,255,7,6,4,170,5,
+-4,4,85,6,5,3,113,26,19,11,255,185,95,22,255,202,102,21,255,197,
+-104,22,255,28,20,11,173,0,8,13,10,6,102,167,87,22,255,200,101,21,
+-255,201,102,22,255,32,21,11,255,4,3,3,65,0,4,2,2,1,17,12,
+-10,7,221,190,98,23,255,208,116,27,255,204,110,27,255,30,21,11,181,0,
+-8,13,11,8,91,185,114,30,255,211,124,30,255,209,123,30,255,86,55,25,
+-255,9,8,6,187,6,6,5,85,7,6,6,130,32,24,15,255,200,122,31,
+-255,209,123,30,255,206,122,31,255,32,23,13,173,0,8,10,8,7,144,191,
+-113,30,255,212,127,35,255,210,126,35,255,40,27,15,255,4,4,3,85,0,
+-4,2,2,1,8,11,9,6,212,157,81,20,255,189,92,20,255,190,97,21,
+-255,27,19,10,178,0,8,12,10,7,96,183,105,28,255,209,123,30,255,205,
+-114,26,255,36,24,13,255,4,4,3,85,0,4,4,4,4,28,18,14,9,
+-187,195,115,30,255,211,124,30,255,210,130,35,255,35,26,14,210,0,20,3,
+-2,2,28,12,10,7,227,195,115,30,255,211,124,30,255,209,123,30,255,38,
+-25,15,255,4,4,3,85,0,20,13,11,8,170,194,115,31,255,209,122,28,
+-255,196,99,21,255,21,15,8,255,0,12,11,9,6,170,153,79,20,255,187,
+-91,20,255,181,96,20,255,30,20,9,178,0,8,13,10,6,96,151,79,20,
+-255,187,91,20,255,181,96,20,255,22,16,9,255,0,12,12,9,7,170,146,
+-76,19,255,167,88,18,255,158,77,17,255,23,15,6,170,0,8,10,8,5,
+-85,133,66,16,255,167,88,18,255,168,86,19,255,22,16,9,255,0,20,12,
+-9,7,170,155,80,20,255,185,94,20,255,181,96,20,255,22,16,9,221,0,
+-8,6,6,5,42,51,29,12,255,150,81,19,255,165,87,18,255,42,26,11,
+-255,5,5,4,108,0,4,5,5,4,28,18,15,11,255,195,114,28,255,207,
+-123,32,255,158,94,31,255,17,13,10,142,0,8,6,5,5,57,50,34,19,
+-255,191,111,32,255,208,117,29,255,113,73,30,255,10,10,9,227,6,6,5,
+-125,7,7,6,198,42,29,17,255,187,96,22,255,166,87,23,255,42,27,15,
+-255,8,6,5,110,0,32,5,5,4,184,21,16,8,255,106,54,15,255,154,
+-78,17,255,151,77,18,255,92,48,15,255,11,9,6,119,0,8,10,8,5,
+-93,131,69,18,255,189,92,20,255,200,105,21,255,33,22,12,255,5,4,4,
+-54,0,12,9,8,6,85,76,53,25,255,200,118,31,255,204,114,27,255,65,
+-43,22,255,6,6,5,113,0,32,4,3,3,17,14,11,9,227,195,111,28,
+-255,206,115,27,255,204,105,25,255,24,17,11,255,0,12,5,5,4,28,13,
+-10,6,227,125,66,18,255,165,84,18,255,161,85,17,255,161,85,17,255,155,
+-79,18,255,28,19,9,255,6,5,3,85,0,64,11,9,8,68,86,56,27,
+-255,204,126,33,255,210,125,33,255,30,21,13,255,0,68,13,11,8,170,195,
+-115,30,255,209,123,30,255,207,122,30,255,27,19,12,255,3,3,2,28,0,
+-128,7,6,4,184,131,65,16,255,161,85,17,255,154,78,17,255,15,11,6,
+-249,0,76,10,8,7,173,166,87,23,255,198,104,21,255,196,99,21,255,35,
+-23,12,255,3,3,2,85,0,72,13,11,8,170,194,115,31,255,211,124,30,
+-255,207,122,30,255,27,19,12,255,3,3,2,28,0,108,13,11,8,170,196,
+-113,31,255,213,132,36,255,211,127,36,255,30,21,13,255,0,40,11,9,6,
+-170,155,80,20,255,185,94,20,255,180,91,19,255,21,15,8,255,0,255,0,
+-189,10,8,7,184,183,100,26,255,208,116,27,255,204,114,27,255,26,18,11,
+-255,4,4,4,28,0,255,0,133,10,8,5,127,119,60,15,255,160,85,19,
+-255,91,48,16,255,10,8,5,227,4,4,3,28,0,12,9,7,4,161,131,
+-67,16,255,159,81,18,255,159,78,18,255,18,13,7,249,0,16,7,6,4,
+-170,57,34,14,255,176,90,21,255,195,95,22,255,26,19,11,232,0,16,17,
+-14,10,99,179,106,28,255,207,122,30,255,180,109,33,255,25,20,12,255,7,
+-6,6,170,20,17,11,255,196,114,27,255,208,117,29,255,203,124,30,255,172,
+-106,35,255,53,36,20,255,10,9,7,108,0,40,9,8,6,170,159,82,20,
+-255,202,103,23,255,206,111,27,255,22,17,11,255,0,8,10,9,7,139,115,
+-74,30,255,213,133,48,255,39,28,16,255,0,8,9,8,4,113,67,39,14,
+-255,181,92,20,255,24,18,9,255,0,12,28,19,9,227,139,79,26,255,206,
+-117,31,255,212,123,37,255,214,126,41,255,172,106,35,255,53,34,18,255,122,
+-78,31,255,211,127,44,255,217,136,50,255,216,135,49,255,190,122,41,255,65,
+-43,22,255,14,11,7,85,0,8,7,6,4,28,29,21,10,249,153,79,20,
+-255,174,85,19,255,103,53,16,255,17,12,6,244,19,13,6,170,21,14,6,
+-170,27,17,6,170,21,14,6,212,21,14,6,255,25,17,6,224,12,9,5,
+-45,0,12,24,16,7,153,22,15,7,255,26,16,7,210,12,9,5,40,0,
+-8,8,7,5,28,17,13,8,227,114,61,19,255,174,85,19,255,154,79,19,
+-255,60,33,13,255,11,9,6,170,0,12,10,8,5,170,146,79,19,255,180,
+-87,19,255,67,39,14,255,8,6,5,85,0,8,24,17,9,255,143,75,20,
+-255,162,80,19,255,22,15,7,215,0,28,8,7,5,110,60,33,13,255,166,
+-78,19,255,22,15,7,227,0,8,7,6,4,85,91,51,16,255,174,88,19,
+-255,169,78,18,255,25,17,8,255,3,3,2,8,0,20,11,9,6,178,143,
+-74,18,255,177,89,18,255,138,75,19,255,18,13,7,176,0,16,9,7,4,
+-28,29,19,8,232,41,25,10,255,17,13,8,255,9,8,6,116,0,4,7,
+-6,4,59,14,11,7,227,32,21,9,255,40,24,9,255,12,9,5,105,0,
+-32,14,11,9,170,199,124,36,255,213,119,36,255,202,102,21,255,20,14,7,
+-246,0,152,8,7,5,142,53,31,12,255,162,86,19,255,121,64,18,255,19,
+-14,8,252,6,5,3,28,0,8,10,8,5,125,142,74,19,255,180,91,19,
+-255,183,89,19,255,19,14,8,255,0,4,5,5,4,6,15,13,10,193,69,
+-42,18,255,171,91,20,255,189,88,20,255,200,101,21,255,31,21,12,255,0,
+-16,10,8,7,28,30,21,13,227,150,92,35,255,208,121,37,255,211,115,30,
+-255,208,117,29,255,28,21,13,255,0,24,10,8,7,28,22,15,7,198,26,
+-17,7,255,24,15,7,221,9,7,4,57,0,12,8,7,5,156,171,89,22,
+-255,202,107,23,255,202,103,23,255,23,18,10,249,0,12,26,18,9,198,29,
+-19,8,255,24,16,7,215,10,8,5,51,0,12,10,8,5,85,134,70,19,
+-255,175,88,18,255,173,87,18,255,20,14,7,255,0,24,10,8,5,85,26,
+-19,9,255,107,58,18,255,154,83,19,255,168,79,19,255,169,78,18,255,173,
+-87,18,255,172,80,19,255,26,17,7,170,0,8,11,10,8,136,189,99,26,
+-255,210,115,31,255,216,129,45,255,143,96,40,255,15,13,10,227,12,12,11,
+-170,15,13,12,170,13,12,10,170,13,12,10,136,9,8,8,85,0,16,11,
+-9,6,170,169,91,22,255,202,103,23,255,203,108,24,255,18,15,9,255,0,
+-12,6,5,5,23,28,19,11,156,31,22,12,255,34,24,13,227,14,11,7,
+-85,0,36,9,8,8,142,72,54,31,255,215,147,60,255,218,146,61,255,174,
+-100,35,255,14,11,7,142,0,8,11,8,6,102,142,74,19,255,185,86,20,
+-255,195,98,20,255,18,14,9,249,0,12,10,8,7,170,202,131,47,255,220,
+-152,63,255,220,151,61,255,22,19,13,252,0,8,11,9,8,167,203,135,46,
+-255,217,139,48,255,210,120,33,255,18,14,9,255,0,12,9,8,6,170,198,
+-117,37,255,211,115,30,255,202,102,21,255,34,22,11,176,0,8,13,11,8,
+-170,202,122,37,255,218,144,49,255,217,144,50,255,28,21,13,255,0,8,12,
+-11,9,170,204,122,41,255,217,135,46,255,215,136,42,255,46,33,19,255,0,
+-16,10,9,7,28,21,19,14,227,153,104,46,255,214,149,55,255,158,103,39,
+-255,16,14,11,221,7,6,6,28,0,20,20,18,13,142,31,26,18,170,25,
+-21,16,170,24,20,15,170,24,20,15,170,24,20,15,170,24,21,15,170,31,
+-26,18,170,25,21,16,170,14,12,9,31,0,20,10,9,7,167,75,51,26,
+-255,202,117,33,255,186,120,43,255,41,32,20,255,12,11,9,85,0,16,11,
+-9,8,28,31,22,12,215,49,33,18,255,41,27,16,227,12,10,7,85,0,
+-12,14,12,9,170,204,137,51,255,220,152,63,255,220,151,61,255,23,19,12,
+-252,0,8,11,10,6,85,136,70,17,255,175,88,18,255,169,78,18,255,15,
+-11,6,255,0,8,9,8,6,85,26,19,9,255,153,82,18,255,177,89,18,
+-255,180,84,19,255,24,17,9,218,0,8,11,9,8,147,196,115,35,255,215,
+-125,38,255,214,125,39,255,20,16,11,255,0,12,9,8,6,159,165,86,22,
+-255,197,99,20,255,195,90,20,255,32,21,11,170,0,8,12,10,7,85,145,
+-76,20,255,189,92,20,255,191,96,20,255,18,14,9,255,0,12,9,8,6,
+-170,199,126,39,255,217,133,50,255,217,144,50,255,23,18,12,252,0,8,11,
+-10,8,142,191,105,28,255,206,111,27,255,203,104,24,255,19,15,10,255,0,
+-12,9,8,6,57,21,15,8,198,28,19,9,255,32,21,11,227,11,9,6,
+-76,0,8,11,9,8,170,203,125,42,255,220,146,59,255,219,146,60,255,24,
+-19,13,255,0,12,11,10,8,170,204,136,47,255,220,146,59,255,218,147,55,
+-255,25,19,12,232,0,8,11,10,8,119,161,87,22,255,195,98,20,255,202,
+-103,23,255,18,15,9,255,0,32,14,12,9,170,200,125,37,255,214,124,37,
+-255,205,106,26,255,20,16,9,221,0,32,16,13,9,170,205,130,42,255,219,
+-144,56,255,219,146,60,255,24,19,13,255,0,12,6,5,3,23,21,14,6,
+-170,26,16,7,255,26,17,7,224,14,10,5,31,0,8,11,9,6,125,170,
+-89,23,255,211,115,30,255,214,126,41,255,23,19,12,255,0,12,11,10,8,
+-170,195,112,30,255,206,106,25,255,200,105,21,255,29,20,10,170,0,8,11,
+-9,6,85,134,70,19,255,177,85,18,255,172,80,19,255,18,13,7,255,0,
+-40,14,12,9,170,195,112,30,255,206,111,27,255,202,103,23,255,31,22,10,
+-170,0,8,13,10,6,85,151,79,20,255,189,92,20,255,183,89,19,255,17,
+-13,8,255,0,4,8,7,5,59,57,34,16,255,184,97,27,255,198,115,33,
+-255,114,77,33,255,16,14,11,210,6,5,5,8,0,8,12,10,7,170,195,
+-113,32,255,215,123,42,255,217,133,50,255,32,24,15,255,0,32,12,11,7,
+-170,175,90,22,255,198,104,21,255,189,92,20,255,192,97,21,255,189,97,22,
+-255,45,29,14,255,10,9,7,210,22,17,11,255,183,102,30,255,212,121,41,
+-255,216,135,49,255,217,137,52,255,214,125,39,255,29,21,12,204,0,8,11,
+-9,6,85,143,75,20,255,193,97,20,255,195,98,20,255,180,93,23,255,88,
+-54,23,255,11,10,8,113,0,4,14,12,7,85,170,89,23,255,202,103,23,
+-255,202,102,21,255,32,22,11,178,0,8,12,10,7,113,176,91,23,255,205,
+-105,24,255,209,117,28,255,39,28,16,255,5,5,5,28,0,8,15,14,10,
+-198,206,132,45,255,217,133,50,255,215,133,44,255,25,19,12,232,0,8,11,
+-10,8,125,198,118,39,255,218,145,51,255,218,146,53,255,20,17,11,255,0,
+-12,9,8,6,170,198,124,37,255,216,134,45,255,214,139,41,255,22,18,11,
+-255,0,8,11,10,8,136,191,105,28,255,206,111,27,255,206,106,25,255,36,
+-26,15,255,5,5,4,28,0,8,15,13,10,198,192,105,27,255,206,106,25,
+-255,204,105,25,255,23,17,10,232,0,8,12,10,7,125,196,119,37,255,218,
+-141,51,255,218,139,55,255,20,16,11,255,0,12,9,8,6,170,196,110,33,
+-255,215,126,40,255,214,125,39,255,23,18,12,252,0,8,11,9,8,167,201,
+-123,40,255,217,133,50,255,214,136,43,255,20,16,11,255,0,12,6,5,5,
+-23,29,21,12,153,32,22,13,255,35,25,14,227,15,12,8,85,0,24,12,
+-10,9,170,198,124,37,255,215,125,38,255,213,124,38,255,23,18,12,255,0,
+-24,14,12,9,170,204,132,47,255,219,144,56,255,211,127,36,255,28,21,13,
+-255,0,12,14,12,9,170,198,117,37,255,215,123,42,255,214,125,39,255,25,
+-20,12,215,0,8,11,10,8,130,198,119,35,255,215,126,40,255,212,123,37,
+-255,30,22,13,255,0,12,14,12,9,170,196,114,33,255,206,106,25,255,200,
+-105,21,255,30,21,11,184,0,8,13,11,8,99,184,100,25,255,209,117,28,
+-255,210,115,31,255,28,21,13,255,0,20,14,12,9,170,198,117,37,255,215,
+-126,40,255,214,126,41,255,25,19,12,255,0,12,10,9,7,125,61,42,22,
+-255,190,107,33,255,153,98,38,255,29,23,16,255,13,12,10,255,17,15,10,
+-255,108,74,37,255,210,144,59,255,153,98,38,255,16,14,11,224,6,6,5,
+-17,0,12,15,13,8,227,115,67,24,255,197,100,22,255,150,81,25,255,32,
+-24,13,255,15,13,8,255,19,15,10,255,85,48,18,255,178,95,21,255,115,
+-65,20,255,15,12,8,255,5,5,4,34,0,32,10,9,7,198,69,46,22,
+-255,186,103,29,255,195,111,28,255,92,58,25,255,15,12,8,198,0,12,10,
+-9,7,170,194,112,31,255,215,125,38,255,218,146,53,255,24,19,13,255,0,
+-20,15,14,10,227,159,103,42,255,212,127,43,255,177,118,48,255,19,17,12,
+-227,6,6,5,28,0,32,11,10,8,170,182,98,23,255,202,106,21,255,195,
+-98,20,255,24,17,9,212,0,12,18,14,9,227,102,54,19,255,157,83,18,
+-255,85,46,14,255,19,13,6,255,47,27,10,255,150,81,19,255,131,67,20,
+-255,39,26,14,255,12,11,9,85,0,64,10,9,7,170,118,75,33,255,215,
+-141,54,255,44,33,19,255,0,16,9,9,8,108,19,17,12,170,27,23,16,
+-170,23,21,16,170,23,21,16,170,24,20,15,170,20,18,13,170,15,14,10,
+-170,10,9,7,113,7,6,6,28,0,12,12,11,9,170,189,99,26,255,209,
+-110,30,255,211,118,36,255,141,88,36,255,19,17,12,227,20,18,13,170,24,
+-20,15,170,21,19,14,170,16,14,11,170,10,9,7,113,6,6,5,28,0,
+-20,8,7,5,65,11,10,8,142,16,14,11,170,24,21,15,170,25,22,16,
+-170,23,21,16,170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6,
+-28,0,20,8,7,5,62,10,9,5,136,12,10,7,170,14,11,7,170,13,
+-10,6,170,11,9,6,198,31,21,10,255,153,82,18,255,177,85,18,255,169,
+-78,18,255,22,15,7,204,0,16,8,7,5,57,11,10,6,142,19,17,12,
+-170,23,21,16,170,25,22,16,170,23,21,16,170,21,19,14,170,15,14,10,
+-170,10,10,9,113,7,6,6,28,0,16,12,10,7,153,55,32,14,255,175,
+-93,20,255,185,94,20,255,183,89,19,255,80,44,17,255,13,11,8,187,7,
+-6,6,25,0,16,8,7,5,62,11,10,6,142,16,14,11,170,23,19,14,
+-170,25,22,16,170,23,21,16,170,19,17,12,170,15,14,10,170,17,15,10,
+-170,19,17,12,142,9,8,8,28,0,8,12,10,9,170,204,137,49,255,220,
+-146,59,255,218,146,53,255,141,91,38,255,19,17,12,227,19,17,12,170,24,
+-20,15,170,21,19,14,170,15,14,10,170,10,10,9,113,7,6,6,28,0,
+-16,12,10,7,57,14,12,7,102,14,11,7,85,0,32,12,10,7,57,13,
+-11,8,105,15,13,8,85,0,12,12,11,9,170,204,136,47,255,220,146,59,
+-255,218,153,59,255,24,19,13,255,0,12,8,7,5,82,11,10,6,156,11,
+-9,6,170,10,9,7,91,0,12,10,8,5,127,144,78,19,255,180,87,19,
+-255,174,81,19,255,24,15,7,210,0,12,14,11,7,68,12,10,7,170,12,
+-10,7,170,17,15,10,170,24,20,15,170,19,17,12,170,15,14,10,170,18,
+-15,11,170,24,21,15,170,21,19,14,170,15,14,10,170,11,10,8,113,7,
+-7,6,28,0,16,15,13,10,119,17,15,12,170,15,13,10,170,16,14,11,
+-170,19,17,12,170,21,18,12,170,18,15,11,170,15,13,8,170,11,9,6,
+-170,10,8,7,88,6,5,5,23,0,20,10,9,7,85,14,12,9,170,19,
+-17,12,170,21,19,14,170,21,19,14,170,21,19,14,170,19,17,12,170,15,
+-14,10,170,11,10,8,116,7,7,6,28,0,16,15,14,10,119,18,15,11,
+-170,15,14,10,170,18,15,11,170,21,19,14,170,25,22,16,170,23,21,16,
+-170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6,28,0,20,10,
+-9,7,85,14,12,9,170,19,17,12,170,20,18,13,170,20,18,13,170,23,
+-19,14,170,19,17,12,170,15,14,10,170,17,14,10,170,19,17,12,142,10,
+-9,7,28,0,12,15,13,10,113,18,15,11,170,15,14,10,170,18,15,11,
+-170,21,19,14,170,25,22,16,170,23,21,16,170,20,18,13,170,16,14,11,
+-170,11,10,8,113,7,7,6,28,0,20,7,7,6,82,11,10,6,142,16,
+-13,9,170,19,17,12,170,21,19,14,170,24,21,15,170,25,22,16,170,25,
+-22,16,170,15,13,10,170,12,11,9,57,0,16,15,13,10,170,97,65,34,
+-255,209,132,42,255,214,136,43,255,214,127,43,255,159,103,42,255,21,19,14,
+-227,11,10,8,28,0,12,16,14,11,113,21,19,14,170,18,15,11,153,11,
+-10,8,28,0,16,15,14,10,125,21,19,14,170,19,17,12,142,10,9,7,
+-28,0,12,15,14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0,
+-16,15,13,10,125,21,19,14,170,19,17,12,142,10,9,7,28,0,12,15,
+-14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0,24,15,14,10,
+-125,21,19,14,170,19,17,12,142,9,9,8,28,0,12,17,14,10,130,27,
+-24,16,170,21,19,14,142,10,9,7,28,0,16,16,14,11,113,28,24,17,
+-170,24,21,15,161,12,11,9,28,0,12,16,14,11,113,21,19,14,170,18,
+-15,11,153,11,10,8,28,0,16,15,13,10,125,21,19,14,170,19,17,12,
+-142,9,8,6,28,0,12,18,15,11,136,19,16,10,170,16,13,9,170,16,
+-14,9,170,15,13,8,170,13,11,8,170,12,11,9,170,13,12,8,170,15,
+-14,10,170,14,13,11,170,11,11,10,113,0,20,13,11,8,170,190,98,23,
+-255,204,116,31,255,74,52,27,255,9,8,8,113,0,16,13,11,8,170,192,
+-106,29,255,208,112,27,255,208,117,29,255,27,21,12,255,0,16,5,5,4,
+-28,27,23,16,255,199,121,44,255,214,139,41,255,31,23,14,255,0,16,13,
+-11,8,28,32,24,13,227,36,26,15,255,19,16,12,198,8,8,7,51,0,
+-4,8,8,7,57,29,21,12,218,48,32,17,255,45,30,16,255,20,16,11,
+-218,10,9,7,105,0,44,14,12,9,170,204,130,51,255,224,153,77,255,225,
+-169,88,255,33,27,18,255,0,12,21,19,14,215,217,163,86,255,61,46,28,
+-255,0,12,19,16,12,201,203,121,40,255,51,38,22,255,0,12,4,4,3,
+-25,16,14,11,227,212,147,71,255,224,160,77,255,223,161,80,255,31,25,16,
+-255,4,4,4,102,10,10,9,215,206,133,55,255,223,156,70,255,224,164,85,
+-255,51,39,24,255,5,5,4,82,0,12,15,12,8,110,178,98,27,255,211,
+-115,30,255,211,121,34,255,36,26,15,255,3,3,2,85,0,60,8,8,5,
+-28,27,20,10,232,125,73,22,255,190,97,21,255,180,92,21,255,97,56,20,
+-255,14,11,7,170,0,16,12,10,7,142,165,89,22,255,198,104,21,255,84,
+-50,19,255,7,6,4,159,0,4,5,5,4,82,32,23,11,255,121,69,22,
+-255,97,56,20,255,15,13,8,142,0,32,14,12,7,198,172,92,21,255,28,
+-19,9,207,0,8,11,10,6,85,148,78,21,255,198,104,21,255,192,97,21,
+-255,21,15,8,255,0,24,10,9,5,170,167,90,22,255,202,93,21,255,202,
+-103,23,255,21,16,10,255,0,20,4,3,3,133,20,16,9,255,151,80,22,
+-255,75,42,16,255,10,8,7,255,32,22,11,255,164,86,23,255,60,39,17,
+-255,5,5,4,252,0,36,12,11,9,198,213,155,80,255,224,166,83,255,211,
+-121,34,255,20,16,9,255,3,3,2,28,0,144,6,6,5,51,27,20,10,
+-255,160,84,23,255,198,104,21,255,67,40,16,255,8,7,5,125,0,12,12,
+-10,9,170,195,112,30,255,215,125,38,255,217,133,50,255,49,35,22,255,5,
+-5,4,133,13,12,10,210,189,119,50,255,211,127,44,255,212,121,41,255,218,
+-135,53,255,220,148,63,255,34,27,17,255,0,20,4,4,4,17,13,12,10,
+-227,196,113,31,255,212,118,35,255,214,123,43,255,33,26,16,255,0,56,12,
+-11,9,187,208,134,55,255,223,146,70,255,221,152,70,255,34,26,17,255,0,
+-40,8,7,5,164,165,86,22,255,202,98,21,255,198,96,21,255,22,16,9,
+-255,0,20,8,8,5,85,32,22,11,255,167,87,22,255,160,84,23,255,93,
+-54,20,255,120,65,21,255,188,96,21,255,196,99,21,255,200,105,21,255,24,
+-19,11,207,0,8,15,14,10,110,208,152,71,255,227,174,98,255,228,179,103,
+-255,225,176,98,255,217,169,94,255,213,166,92,255,215,167,92,255,213,155,80,
+-255,204,136,55,255,138,89,37,255,25,22,16,227,9,9,8,28,0,8,11,
+-10,8,170,203,129,50,255,223,149,70,255,222,158,75,255,31,25,16,255,4,
+-4,4,28,0,60,8,8,7,57,49,40,26,255,206,152,83,255,224,169,91,
+-255,194,140,71,255,31,27,20,255,9,8,8,28,0,8,12,10,9,161,196,
+-110,33,255,218,130,51,255,222,158,75,255,31,25,16,255,4,4,4,28,0,
+-8,11,10,8,198,213,160,84,255,228,180,105,255,227,175,100,255,33,28,18,
+-207,0,8,12,11,9,130,210,155,77,255,228,169,99,255,226,172,95,255,30,
+-25,17,255,4,4,4,28,0,8,11,10,8,198,204,129,49,255,214,127,43,
+-255,213,125,40,255,23,19,12,232,0,8,14,13,9,125,208,152,71,255,223,
+-159,76,255,218,153,59,255,33,26,16,210,0,8,13,12,10,127,198,118,39,
+-255,215,127,42,255,213,126,42,255,41,31,18,227,0,12,6,6,5,28,25,
+-21,16,227,204,150,79,255,223,171,98,255,175,122,60,255,18,15,11,218,5,
+-4,4,17,0,20,20,18,13,85,177,101,34,255,204,123,37,255,199,117,36,
+-255,199,117,36,255,202,122,37,255,199,117,36,255,198,114,31,255,198,110,31,
+-255,202,118,35,255,46,33,21,170,0,24,10,9,7,153,110,78,37,255,213,
+-162,82,255,218,164,87,255,67,51,30,255,9,8,8,85,0,40,6,5,5,
+-28,21,19,14,255,217,166,92,255,227,175,100,255,224,169,91,255,31,25,16,
+-215,0,8,12,10,7,85,154,80,21,255,197,99,20,255,192,97,21,255,28,
+-20,9,255,4,3,3,110,11,9,6,170,117,63,20,255,184,94,21,255,198,
+-104,21,255,203,104,24,255,210,122,37,255,21,17,12,252,0,8,10,9,7,
+-161,203,129,50,255,224,160,77,255,225,169,88,255,30,25,17,255,4,4,4,
+-28,0,8,8,7,5,190,165,86,22,255,198,104,21,255,196,99,21,255,28,
+-19,9,170,0,8,13,11,8,85,176,91,23,255,208,112,27,255,210,121,35,
+-255,27,22,14,255,4,4,4,28,0,8,11,10,8,198,211,149,76,255,224,
+-168,87,255,224,162,81,255,32,26,17,210,0,8,12,10,7,113,176,91,23,
+-255,202,107,23,255,202,95,23,255,20,16,9,255,0,40,15,13,10,170,213,
+-160,84,255,228,180,105,255,227,174,98,255,33,26,18,255,0,12,15,13,10,
+-170,213,155,80,255,226,172,95,255,224,167,85,255,23,20,14,244,0,8,11,
+-10,8,127,189,104,28,255,214,127,43,255,221,148,70,255,31,25,16,255,4,
+-4,4,28,0,28,14,12,9,170,195,113,32,255,209,117,28,255,202,103,23,
+-255,20,15,9,252,3,3,3,14,0,28,15,14,10,170,213,155,80,255,226,
+-172,95,255,221,152,70,255,28,24,15,255,0,40,14,12,9,170,208,141,61,
+-255,225,162,88,255,227,174,98,255,33,26,18,255,4,4,4,28,0,8,10,
+-8,7,198,182,98,23,255,202,103,23,255,198,104,21,255,28,19,9,170,0,
+-8,11,10,6,85,154,80,21,255,202,98,21,255,202,103,23,255,25,20,12,
+-255,0,40,12,10,7,170,186,100,23,255,202,99,23,255,200,105,21,255,30,
+-21,9,170,0,8,12,9,7,85,154,80,21,255,198,104,21,255,196,99,21,
+-255,28,20,9,255,4,4,3,113,11,10,6,227,183,100,26,255,212,127,43,
+-255,167,117,52,255,17,15,12,215,5,5,5,14,0,12,15,13,10,170,211,
+-149,76,255,224,166,83,255,223,161,80,255,34,26,17,255,0,32,10,9,7,
+-170,167,87,22,255,198,92,21,255,196,99,21,255,196,95,21,255,198,92,21,
+-255,195,99,22,255,192,106,29,255,206,127,43,255,217,141,60,255,223,146,70,
+-255,224,165,81,255,220,148,63,255,212,124,39,255,25,19,12,215,0,8,12,
+-11,9,116,196,116,37,255,218,141,51,255,218,139,55,255,218,142,61,255,215,
+-143,58,255,24,19,13,212,0,4,10,9,7,156,203,129,50,255,221,150,66,
+-255,220,148,63,255,25,21,14,227,0,8,10,10,7,159,204,134,59,255,225,
+-160,84,255,225,169,88,255,36,29,19,255,0,12,15,14,10,170,204,130,51,
+-255,220,142,59,255,218,139,55,255,21,18,12,249,0,8,11,10,8,142,206,
+-145,67,255,226,172,95,255,227,174,98,255,32,26,17,255,4,4,4,28,0,
+-8,11,10,8,198,198,117,37,255,215,125,38,255,211,122,36,255,28,21,13,
+-215,0,8,13,11,8,96,174,91,23,255,202,107,23,255,202,103,23,255,22,
+-17,9,255,0,12,11,10,6,170,176,91,23,255,202,103,23,255,203,108,24,
+-255,21,15,10,238,0,8,11,10,8,142,206,145,67,255,226,170,91,255,224,
+-160,85,255,30,24,17,255,4,4,4,28,0,8,11,10,8,198,209,149,70,
+-255,224,160,77,255,222,158,75,255,31,25,16,212,0,8,12,11,9,127,198,
+-116,35,255,215,125,38,255,211,122,36,255,28,21,13,255,4,4,4,28,0,
+-52,13,12,8,170,195,112,30,255,209,110,30,255,207,105,30,255,25,20,12,
+-255,0,24,15,14,10,170,213,158,80,255,226,172,95,255,224,164,85,255,33,
+-27,18,255,0,12,15,14,10,170,210,143,65,255,224,168,87,255,224,165,81,
+-255,25,21,14,232,0,8,10,10,9,153,208,147,67,255,224,166,83,255,222,
+-158,75,255,34,26,17,255,0,12,15,14,10,170,211,149,76,255,223,149,70,
+-255,219,146,60,255,25,20,14,235,0,8,10,10,9,150,204,134,59,255,224,
+-156,83,255,224,165,81,255,33,27,18,255,0,20,15,14,10,170,211,150,70,
+-255,226,170,91,255,226,172,95,255,33,26,18,255,0,16,9,9,8,150,101,
+-74,38,255,198,145,77,255,206,157,87,255,202,151,79,255,197,141,74,255,200,
+-146,75,255,180,126,57,255,21,19,14,227,5,5,4,28,0,16,8,7,5,
+-113,43,28,14,255,187,96,22,255,181,93,22,255,98,55,21,255,68,42,17,
+-255,77,46,18,255,129,72,22,255,174,89,21,255,83,47,18,255,11,9,6,
+-221,0,28,6,6,5,28,16,14,11,195,108,76,35,255,210,141,59,255,218,
+-162,81,255,167,118,54,255,16,14,11,221,5,5,5,14,0,12,15,13,10,
+-170,211,149,76,255,224,168,87,255,223,154,80,255,31,25,16,255,0,20,6,
+-6,5,57,34,27,17,255,203,122,36,255,208,124,41,255,109,76,34,255,13,
+-12,10,142,0,32,13,11,8,170,176,91,23,255,202,93,21,255,196,99,21,
+-255,28,19,9,170,0,8,11,9,6,85,132,71,21,255,195,99,22,255,103,
+-59,20,255,11,10,6,170,3,3,2,25,6,6,5,110,55,35,16,255,198,
+-113,29,255,212,134,51,255,41,32,20,210,0,68,21,19,14,215,217,163,86,
+-255,49,38,24,255,0,12,11,10,8,82,54,43,27,255,200,135,59,255,210,
+-137,59,255,207,131,50,255,205,127,44,255,199,117,36,255,195,111,28,255,187,
+-101,24,255,93,54,22,255,19,15,10,227,7,6,6,28,0,8,10,9,7,
+-170,195,109,32,255,218,138,53,255,224,158,81,255,223,173,95,255,219,167,94,
+-255,217,169,94,255,218,171,97,255,217,166,92,255,208,136,59,255,110,68,27,
+-255,19,15,10,227,6,6,5,28,0,12,12,11,7,170,61,42,20,255,188,
+-106,33,255,208,134,55,255,215,163,82,255,217,166,92,255,216,167,88,255,216,
+-167,89,255,211,150,70,255,146,94,39,255,26,21,15,229,9,8,6,28,0,
+-12,12,10,7,170,51,32,14,255,151,80,22,255,169,91,22,255,173,86,22,
+-255,169,88,22,255,173,86,22,255,180,92,21,255,194,98,21,255,196,95,21,
+-255,192,97,21,255,31,21,10,170,0,12,12,10,7,170,57,37,18,255,189,
+-107,34,255,212,149,67,255,217,166,92,255,217,166,92,255,218,171,97,255,215,
+-163,82,255,205,126,48,255,116,72,29,255,20,16,11,227,6,6,5,28,0,
+-8,11,9,6,68,126,68,21,255,191,98,22,255,194,98,21,255,192,97,21,
+-255,192,97,21,255,191,98,22,255,177,91,22,255,26,19,9,142,0,12,12,
+-10,7,170,58,37,17,255,185,107,30,255,208,134,55,255,216,167,88,255,218,
+-171,97,255,217,166,92,255,213,148,72,255,204,130,51,255,209,141,60,255,211,
+-159,76,255,30,25,17,170,0,8,10,10,7,167,210,155,77,255,228,178,99,
+-255,224,165,81,255,221,165,86,255,217,166,92,255,218,169,93,255,217,166,92,
+-255,214,156,81,255,206,135,51,255,116,72,29,255,20,16,11,227,6,6,5,
+-28,0,8,13,10,6,57,115,62,20,255,169,91,22,255,165,86,22,255,24,
+-18,9,167,0,24,12,10,7,88,117,63,20,255,186,100,23,255,191,107,32,
+-255,35,27,16,144,0,8,10,10,7,170,210,155,77,255,228,178,99,255,221,
+-152,70,255,24,19,13,255,0,8,12,10,7,170,58,36,15,255,157,79,22,
+-255,151,80,22,255,58,35,15,255,11,9,6,57,0,8,12,10,7,85,157,
+-81,20,255,197,99,20,255,192,97,21,255,28,20,9,170,0,8,11,9,6,
+-57,115,62,20,255,189,94,24,255,198,117,37,255,213,157,76,255,218,171,97,
+-255,217,169,94,255,214,161,85,255,213,157,76,255,212,149,67,255,208,134,55,
+-255,205,126,48,255,143,96,40,255,28,26,19,229,8,8,7,28,0,8,13,
+-12,8,85,141,74,24,255,190,94,23,255,183,95,24,255,183,95,24,255,187,
+-93,24,255,189,97,22,255,181,93,22,255,177,91,22,255,169,88,22,255,89,
+-52,20,255,21,18,12,227,9,9,8,28,0,12,18,17,13,181,103,74,40,
+-255,207,146,74,255,214,156,81,255,210,144,67,255,208,138,55,255,207,129,52,
+-255,205,133,48,255,205,126,48,255,151,101,42,255,28,26,19,232,9,8,8,
+-28,0,8,13,12,10,110,186,127,63,255,214,156,81,255,213,158,80,255,213,
+-155,80,255,214,156,81,255,214,153,75,255,213,148,72,255,213,148,72,255,211,
+-150,70,255,159,111,54,255,28,25,19,241,9,8,8,31,0,12,18,17,13,
+-181,103,74,40,255,208,156,81,255,214,156,81,255,208,138,55,255,209,137,60,
+-255,213,158,80,255,213,155,80,255,213,160,84,255,215,160,88,255,213,163,84,
+-255,30,24,17,178,0,8,12,11,9,93,178,121,53,255,213,158,80,255,210,
+-143,65,255,211,146,62,255,213,148,72,255,215,163,82,255,213,158,80,255,212,
+-149,67,255,209,141,60,255,153,106,49,255,28,25,19,235,9,9,8,31,0,
+-12,18,15,11,173,66,43,21,255,187,101,32,255,207,132,52,255,210,144,67,
+-255,213,148,72,255,214,156,81,255,216,167,88,255,214,156,81,255,176,128,65,
+-255,46,39,27,255,0,12,15,14,10,85,181,111,42,255,215,136,52,255,213,
+-125,40,255,211,122,36,255,212,123,37,255,210,123,39,255,202,122,37,255,31,
+-24,14,170,0,8,12,11,9,88,164,89,29,255,203,122,36,255,199,117,36,
+-255,30,23,15,212,0,12,15,13,10,127,187,133,62,255,213,148,72,255,208,
+-138,55,255,31,24,16,170,0,8,13,12,10,85,172,104,37,255,209,134,54,
+-255,206,135,51,255,32,25,17,212,0,12,15,13,10,127,181,116,46,255,211,
+-143,62,255,210,153,71,255,29,24,16,178,0,8,13,12,10,91,178,121,53,
+-255,213,154,70,255,208,134,55,255,31,25,16,210,0,20,15,14,10,125,179,
+-110,42,255,210,135,55,255,208,139,65,255,26,21,15,184,0,8,14,13,9,
+-85,179,117,44,255,217,165,82,255,213,163,84,255,27,23,16,221,0,12,14,
+-12,9,136,174,103,39,255,206,127,43,255,199,117,36,255,31,24,14,170,0,
+-8,12,11,9,88,164,89,29,255,202,118,35,255,196,114,33,255,29,22,14,
+-210,0,12,14,12,9,125,169,95,30,255,202,119,37,255,199,119,39,255,24,
+-19,13,190,0,8,14,12,9,85,170,95,29,255,198,113,29,255,199,116,34,
+-255,204,128,47,255,206,135,51,255,204,129,49,255,204,129,49,255,208,134,55,
+-255,211,149,76,255,192,140,73,255,95,74,39,255,17,15,12,85,0,16,14,
+-12,9,198,211,150,70,255,206,152,81,255,31,26,20,255,7,7,6,48,0,
+-16,15,13,10,170,211,149,76,255,226,170,91,255,226,172,95,255,35,28,18,
+-255,0,20,15,14,12,218,171,120,60,255,219,154,70,255,41,31,20,255,4,
+-4,3,28,0,104,17,16,12,170,219,179,116,255,232,193,137,255,232,199,135,
+-255,40,33,23,255,0,12,10,10,9,76,62,50,31,255,20,18,13,167,0,
+-12,11,10,8,76,58,46,29,255,20,18,13,167,0,16,13,12,10,170,210,
+-150,71,255,223,147,72,255,221,150,66,255,26,21,15,210,0,4,11,10,8,
+-119,211,159,84,255,229,184,114,255,230,186,123,255,30,26,19,255,0,16,12,
+-11,9,93,137,90,40,255,223,167,94,255,228,180,111,255,167,133,80,255,17,
+-16,14,227,11,11,10,170,12,11,9,170,12,11,9,170,12,11,9,119,7,
+-7,6,57,0,36,7,7,6,62,21,18,12,227,157,92,28,255,203,105,26,
+-255,197,106,26,255,82,48,21,255,14,12,7,173,5,5,4,8,0,16,8,
+-7,5,28,26,19,11,227,103,68,25,255,158,96,29,255,57,41,22,255,13,
+-12,10,241,33,26,16,255,146,88,31,255,66,47,23,255,12,10,9,201,6,
+-5,5,14,0,32,8,7,5,57,30,22,11,255,15,12,8,96,0,8,10,
+-10,7,130,190,104,27,255,209,118,30,255,211,117,34,255,27,21,14,255,0,
+-24,13,12,10,170,199,122,39,255,218,130,51,255,223,146,70,255,30,24,17,
+-255,0,12,23,22,18,139,30,27,21,170,16,15,11,255,89,59,26,255,203,
+-110,28,255,196,113,31,255,122,81,33,255,186,117,43,255,216,129,51,255,184,
+-126,57,255,38,34,25,255,24,22,19,221,33,30,24,170,15,15,12,28,0,
+-12,24,22,19,142,32,31,25,170,21,20,16,198,90,71,45,255,223,179,110,
+-255,226,172,95,255,221,150,66,255,143,100,44,255,22,21,17,227,28,27,21,
+-170,29,28,22,170,13,13,12,42,0,36,8,8,8,11,25,24,20,142,39,
+-35,28,170,30,28,23,170,29,27,22,170,29,27,22,170,29,27,22,170,29,
+-27,22,170,29,27,20,170,23,21,16,170,14,13,11,34,0,52,13,12,10,
+-159,142,86,31,255,208,116,35,255,201,119,38,255,32,26,17,255,5,5,4,
+-28,0,12,14,13,11,170,216,167,97,255,231,184,124,255,231,193,128,255,181,
+-146,92,255,52,44,33,255,90,71,45,255,201,155,88,255,223,173,102,255,228,
+-179,115,255,230,183,123,255,230,184,119,255,39,32,22,255,0,24,12,12,11,
+-170,206,139,61,255,226,164,91,255,228,174,103,255,39,32,22,255,0,48,6,
+-6,5,28,9,9,8,142,56,46,31,255,222,180,113,255,230,187,119,255,222,
+-180,113,255,23,21,16,255,0,36,15,14,12,164,79,59,30,255,209,128,42,
+-255,211,127,44,255,171,117,46,255,18,15,11,170,0,16,9,9,8,116,33,
+-28,16,255,161,94,28,255,199,107,26,255,65,40,18,255,8,7,5,255,25,
+-20,12,255,198,113,29,255,210,120,33,255,217,133,50,255,27,23,16,255,0,
+-8,7,7,6,23,34,28,19,198,46,36,25,255,39,31,22,255,41,33,22,
+-255,59,46,28,255,51,40,26,255,61,47,28,255,180,133,71,255,227,175,100,
+-255,226,175,103,255,181,143,88,255,17,16,12,142,0,8,11,11,10,170,214,
+-166,97,255,229,179,114,255,228,185,111,255,161,121,68,255,23,21,16,227,23,
+-22,18,170,22,21,17,170,16,15,13,170,11,11,8,147,8,8,7,85,0,
+-40,14,13,11,170,181,143,88,255,228,185,123,255,218,168,97,255,70,54,35,
+-255,9,9,8,113,0,12,11,10,8,85,120,87,45,255,223,183,120,255,231,
+-190,132,255,167,135,80,255,24,22,19,227,19,18,16,170,19,18,16,198,95,
+-80,46,255,226,193,129,255,228,187,129,255,186,148,87,255,15,14,12,170,0,
+-8,10,10,9,85,155,113,64,255,229,196,132,255,232,191,133,255,179,142,90,
+-255,27,25,20,227,18,18,15,170,19,18,16,198,90,71,45,255,222,175,101,
+-255,227,174,98,255,228,185,111,255,28,25,19,255,0,8,7,7,6,23,34,
+-28,19,198,49,35,22,255,39,29,18,227,12,11,9,85,0,8,8,7,7,
+-28,33,26,16,198,52,39,23,255,47,35,22,227,13,12,8,85,0,8,8,
+-8,7,28,33,30,24,227,201,157,100,255,230,186,123,255,181,137,74,255,16,
+-15,11,207,6,6,5,23,0,24,11,10,8,28,27,21,12,193,26,19,11,
+-255,23,18,10,255,23,18,10,255,24,18,11,255,24,18,11,255,26,20,11,
+-255,35,27,16,255,42,31,19,241,17,14,10,85,0,28,9,9,8,144,91,
+-67,36,255,217,154,72,255,211,150,70,255,69,55,34,255,15,14,12,85,0,
+-28,6,6,5,11,11,11,10,142,24,22,19,255,167,135,80,255,225,172,104,
+-255,224,166,83,255,193,126,54,255,16,14,11,170,0,8,13,12,8,85,185,
+-97,26,255,207,112,28,255,204,110,27,255,71,46,22,255,8,8,7,255,28,
+-22,13,255,198,107,27,255,193,111,30,255,126,78,31,255,199,139,62,255,226,
+-184,111,255,27,24,18,255,0,8,11,10,8,170,214,166,97,255,230,187,119,
+-255,228,179,103,255,143,102,48,255,17,16,12,227,12,12,9,170,13,12,10,
+-198,46,33,17,255,199,112,28,255,206,111,27,255,204,110,27,255,32,23,13,
+-176,0,8,12,11,9,136,204,134,59,255,226,172,95,255,228,181,107,255,162,
+-125,73,255,24,22,19,227,19,18,16,170,19,18,16,198,95,80,46,255,224,
+-179,109,255,223,173,95,255,173,117,50,255,15,13,10,156,0,8,12,11,7,
+-99,185,97,26,255,208,112,27,255,204,110,27,255,22,18,11,255,0,40,16,
+-15,13,170,219,179,116,255,232,194,133,255,231,193,128,255,40,33,23,255,0,
+-12,16,15,13,170,219,177,112,255,230,187,119,255,224,159,83,255,24,21,15,
+-255,0,8,11,10,8,164,211,158,82,255,229,184,114,255,230,191,123,255,166,
+-127,77,255,22,21,17,227,22,21,17,170,20,19,13,170,14,13,11,28,0,
+-16,12,11,9,170,195,112,30,255,209,106,30,255,206,111,27,255,101,63,26,
+-255,16,14,11,227,23,21,16,170,29,27,22,170,13,13,12,42,0,16,16,
+-15,13,170,216,167,97,255,224,158,87,255,216,125,45,255,24,20,13,255,0,
+-40,17,16,12,170,219,177,112,255,232,195,137,255,231,189,128,255,162,125,73,
+-255,22,21,17,227,14,14,11,170,13,12,10,198,50,35,19,255,199,112,28,
+-255,206,111,27,255,204,110,27,255,32,24,13,170,0,8,13,12,8,93,194,
+-109,33,255,219,139,54,255,224,158,81,255,39,32,22,255,0,40,11,10,8,
+-170,190,104,27,255,208,112,27,255,204,110,27,255,32,24,13,170,0,8,13,
+-12,8,85,184,96,25,255,207,112,28,255,204,102,27,255,129,78,28,255,31,
+-26,16,255,127,84,34,255,219,147,70,255,173,122,62,255,15,14,12,212,6,
+-6,5,25,0,16,16,15,13,170,213,155,80,255,221,144,68,255,217,130,52,
+-255,31,25,16,255,0,32,10,9,7,170,189,99,26,255,208,112,27,255,204,
+-110,27,255,155,87,26,255,72,46,21,255,179,103,36,255,223,156,76,255,216,
+-170,97,255,134,96,47,255,174,127,71,255,221,167,90,255,223,147,72,255,222,
+-158,75,255,23,19,14,252,0,8,11,10,8,170,214,166,97,255,231,187,124,
+-255,230,191,123,255,228,182,117,255,222,175,101,255,64,50,33,255,7,7,6,
+-229,26,23,19,255,220,175,105,255,228,183,113,255,228,188,117,255,25,21,16,
+-255,0,8,11,10,8,170,217,176,112,255,232,197,137,255,232,199,135,255,37,
+-31,22,255,0,12,13,12,10,170,198,117,37,255,215,127,42,255,217,130,52,
+-255,21,19,14,255,0,8,11,10,8,167,215,172,104,255,232,191,133,255,231,
+-190,132,255,166,127,77,255,23,21,16,227,18,17,15,170,17,16,12,198,74,
+-52,27,255,204,117,33,255,211,111,30,255,173,93,28,255,15,12,8,164,0,
+-8,13,12,8,88,185,97,26,255,208,112,27,255,204,110,27,255,19,16,10,
+-255,0,12,10,9,7,170,190,104,27,255,212,118,35,255,216,136,51,255,21,
+-19,14,252,0,8,11,10,8,167,215,172,104,255,232,194,127,255,231,193,128,
+-255,166,129,77,255,23,21,16,227,19,18,16,170,19,18,14,198,81,59,34,
+-255,213,144,62,255,215,140,60,255,165,108,40,255,13,12,10,167,0,8,8,
+-8,7,85,101,63,26,255,206,114,33,255,212,121,33,255,155,92,36,255,23,
+-21,16,227,22,21,17,170,28,26,21,170,21,20,18,170,13,13,12,164,10,
+-10,9,85,6,6,6,6,0,28,12,11,9,170,194,112,31,255,212,119,37,
+-255,216,134,45,255,35,28,18,255,0,24,16,15,13,170,217,171,106,255,231,
+-187,124,255,228,181,107,255,39,32,22,255,0,12,16,15,11,170,208,134,55,
+-255,223,156,70,255,221,148,70,255,23,20,14,238,0,8,11,10,8,170,204,
+-136,55,255,223,156,70,255,222,158,75,255,34,28,19,255,0,12,14,13,11,
+-170,217,171,106,255,232,189,127,255,230,186,123,255,25,22,16,255,0,8,10,
+-10,9,167,210,155,77,255,226,172,95,255,224,165,81,255,31,26,18,255,0,
+-20,15,13,12,170,217,173,104,255,232,191,133,255,231,195,132,255,40,33,23,
+-255,0,20,10,9,9,133,73,58,36,255,225,184,120,255,231,193,128,255,228,
+-180,111,255,147,102,48,255,15,13,10,227,8,7,7,28,0,24,12,11,7,
+-198,100,59,23,255,169,93,26,255,156,91,27,255,174,96,27,255,180,99,27,
+-255,168,97,27,255,105,62,24,255,18,15,9,255,7,6,6,48,0,24,7,
+-7,7,28,15,15,12,227,144,114,67,255,219,177,112,255,223,176,102,255,153,
+-113,62,255,17,16,12,227,7,7,6,28,0,16,16,15,13,170,213,155,80,
+-255,223,146,70,255,217,129,50,255,27,22,14,255,0,24,12,10,9,195,161,
+-94,28,255,207,114,32,255,193,114,36,255,23,20,16,255,0,32,12,11,9,
+-170,191,105,28,255,207,100,28,255,204,110,27,255,26,20,11,204,0,8,6,
+-5,5,3,26,19,9,198,24,18,9,246,15,12,8,142,0,12,15,13,10,
+-91,31,24,16,244,51,39,24,255,21,19,14,91,0,68,10,10,9,76,61,
+-49,30,255,20,18,13,156,0,16,17,15,12,142,27,22,14,232,30,22,13,
+-255,25,20,12,255,22,18,11,238,21,16,10,255,99,58,22,255,203,113,26,
+-255,205,111,28,255,131,80,30,255,12,11,9,142,0,8,11,10,8,170,212,
+-160,85,255,232,191,127,255,231,195,132,255,196,155,91,255,81,59,34,255,41,
+-32,20,255,54,43,27,255,180,133,71,255,216,144,59,255,208,115,33,255,129,
+-78,28,255,12,11,7,142,0,8,8,7,7,57,72,52,29,255,215,155,78,
+-255,227,174,98,255,207,158,94,255,85,63,34,255,36,29,19,255,57,43,26,
+-255,189,130,66,255,219,149,66,255,212,121,41,255,172,105,33,255,17,15,10,
+-147,0,8,7,6,6,54,58,40,21,255,198,113,29,255,206,103,27,255,165,
+-87,24,255,42,28,13,255,21,16,8,255,27,20,10,255,95,60,22,255,202,
+-105,27,255,206,100,29,255,204,110,27,255,35,24,12,170,0,8,7,7,6,
+-54,70,50,27,255,212,145,65,255,227,174,98,255,201,155,88,255,59,44,28,
+-255,23,20,14,255,34,28,19,255,157,104,48,255,211,126,42,255,208,115,33,
+-255,132,82,29,255,13,11,8,142,0,12,24,18,9,221,108,61,23,255,201,
+-112,26,255,207,112,28,255,204,110,27,255,158,91,25,255,46,29,13,249,11,
+-10,6,57,0,8,8,8,7,57,70,50,27,255,212,142,59,255,226,172,95,
+-255,207,158,94,255,85,63,34,255,41,32,20,255,57,43,26,255,174,124,59,
+-255,224,170,93,255,229,184,114,255,231,196,128,255,28,25,19,255,0,8,10,
+-10,9,167,215,169,102,255,232,191,127,255,231,193,128,255,196,154,87,255,77,
+-59,34,255,41,31,20,255,54,43,27,255,168,113,49,255,212,121,41,255,206,
+-114,33,255,132,82,29,255,12,11,9,130,0,8,12,11,7,110,188,98,25,
+-255,206,111,27,255,206,106,25,255,26,19,11,255,0,24,14,12,9,170,199,
+-117,36,255,221,148,62,255,227,174,98,255,28,26,19,255,0,8,10,10,9,
+-167,212,161,89,255,224,166,83,255,217,129,50,255,32,24,15,255,5,5,4,
+-31,7,7,6,136,65,44,22,255,192,106,29,255,203,108,24,255,114,66,23,
+-255,17,13,8,221,0,12,10,9,7,139,185,97,26,255,208,112,27,255,208,
+-117,29,255,32,24,13,170,0,8,15,13,8,91,189,99,26,255,215,123,42,
+-255,226,172,95,255,198,152,87,255,81,58,34,255,176,133,71,255,224,168,95,
+-255,197,138,62,255,65,47,26,255,133,81,30,255,208,121,37,255,212,115,37,
+-255,152,98,35,255,12,11,9,142,0,8,10,9,7,147,190,107,25,255,206,
+-111,27,255,206,106,25,255,158,91,25,255,42,28,13,255,21,15,8,255,26,
+-19,9,255,114,66,23,255,204,113,25,255,208,115,33,255,173,122,62,255,16,
+-15,13,150,0,8,8,8,7,71,110,87,51,255,222,180,113,255,224,166,83,
+-255,209,137,60,255,133,84,32,255,77,50,24,255,89,59,26,255,181,109,32,
+-255,210,121,35,255,212,121,41,255,171,116,52,255,15,14,12,142,0,8,14,
+-13,11,170,219,177,112,255,231,187,124,255,228,180,111,255,205,158,90,255,79,
+-58,32,255,38,29,19,255,49,35,22,255,167,114,46,255,217,146,62,255,219,
+-154,70,255,169,117,56,255,15,13,12,156,0,8,8,8,7,71,104,80,45,
+-255,224,183,119,255,232,191,127,255,210,166,97,255,81,60,32,255,39,30,18,
+-255,52,40,25,255,175,128,66,255,225,173,98,255,228,180,105,255,226,175,95,
+-255,29,25,18,255,0,8,12,12,11,170,208,138,55,255,222,145,63,255,220,
+-139,59,255,193,121,50,255,68,50,29,255,38,28,19,255,48,35,23,255,175,
+-112,44,255,217,142,54,255,217,144,66,255,191,137,66,255,19,16,12,170,0,
+-8,9,8,8,74,111,82,40,255,216,155,75,255,226,172,95,255,200,151,81,
+-255,57,41,26,255,27,23,16,255,35,28,18,255,41,32,20,255,39,30,20,
+-255,25,22,16,227,15,14,10,142,0,12,10,9,7,28,33,24,14,227,135,
+-81,28,255,206,117,31,255,210,108,33,255,208,110,31,255,171,92,28,255,49,
+-33,16,252,13,11,8,68,0,8,11,10,8,170,195,108,30,255,212,118,35,
+-255,217,137,52,255,42,33,23,255,0,12,20,18,15,170,214,156,81,255,221,
+-148,62,255,214,127,43,255,23,19,12,238,0,8,10,10,7,159,196,109,31,
+-255,213,119,36,255,212,123,37,255,31,24,14,255,0,12,15,14,10,170,209,
+-137,60,255,228,172,99,255,230,189,119,255,28,26,19,255,0,8,12,12,11,
+-170,208,134,55,255,218,137,51,255,214,127,43,255,35,27,16,255,0,20,16,
+-14,11,170,199,116,34,255,217,132,48,255,224,166,83,255,32,26,19,255,0,
+-8,10,10,7,34,81,58,34,255,224,178,105,255,226,172,95,255,129,92,40,
+-255,9,9,8,170,6,6,6,85,6,6,5,113,35,27,16,255,204,117,33,
+-255,208,117,29,255,110,69,25,255,14,12,7,108,0,8,10,10,7,170,195,
+-112,30,255,211,115,30,255,211,115,30,255,30,23,13,255,0,12,14,12,9,
+-170,196,113,31,255,211,120,32,255,214,126,41,255,33,26,18,255,0,8,9,
+-8,6,28,44,33,19,212,60,42,23,255,46,35,21,255,74,53,31,255,156,
+-109,53,255,216,167,97,255,228,179,109,255,229,177,110,255,227,184,108,255,168,
+-123,69,255,23,21,16,227,9,8,8,28,0,12,17,16,14,170,134,98,51,
+-255,223,166,92,255,132,100,53,255,9,9,8,133,0,20,16,15,13,170,219,
+-177,112,255,232,191,133,255,231,195,132,255,40,33,23,255,0,20,6,6,5,
+-45,39,32,22,255,210,129,49,255,172,106,35,255,20,17,13,227,11,11,8,
+-28,0,100,17,17,14,170,221,189,132,255,235,205,154,255,234,205,155,255,42,
+-39,29,255,0,16,9,9,8,25,0,20,9,8,8,25,0,20,14,14,11,
+-170,208,141,61,255,224,168,87,255,228,174,103,255,31,26,20,221,0,4,13,
+-12,12,130,218,185,127,255,234,202,147,255,232,198,139,255,40,33,25,255,0,
+-20,17,17,14,176,140,115,71,255,230,202,147,255,232,202,149,255,218,170,101,
+-255,200,124,43,255,198,117,37,255,198,117,37,255,196,116,37,255,72,52,27,
+-255,12,11,9,170,0,28,8,8,7,85,37,31,20,255,174,110,41,255,210,
+-123,39,255,204,120,37,255,130,87,31,255,15,13,10,190,0,28,5,5,4,
+-113,28,26,19,255,210,143,65,255,220,163,81,255,217,166,92,255,222,173,97,
+-255,225,176,98,255,42,37,25,255,4,4,4,74,0,56,13,12,10,170,208,
+-141,61,255,226,172,95,255,228,183,111,255,40,34,25,255,0,24,17,16,14,
+-170,219,177,112,255,232,194,133,255,233,202,148,255,27,24,20,255,0,8,16,
+-15,13,85,199,161,102,255,220,166,89,255,211,143,62,255,217,154,72,255,223,
+-161,80,255,224,169,91,255,225,185,114,255,229,188,124,255,231,190,132,255,231,
+-200,143,255,227,195,140,255,227,196,138,255,225,195,136,255,44,37,27,170,0,
+-8,17,16,14,85,200,165,109,255,227,198,142,255,225,191,132,255,227,195,134,
+-255,231,199,136,255,231,197,132,255,231,194,124,255,229,191,130,255,225,195,136,
+-255,225,195,136,255,225,191,132,255,49,42,30,198,0,36,18,17,13,105,193,
+-135,66,255,221,175,102,255,222,186,123,255,223,190,132,255,224,192,135,255,223,
+-190,132,255,222,186,123,255,221,178,110,255,218,172,105,255,46,39,27,195,0,
+-48,6,6,6,28,27,26,20,255,216,170,97,255,225,178,104,255,176,136,83,
+-255,16,15,13,198,0,16,17,17,14,170,221,188,130,255,235,205,154,255,234,
+-205,155,255,232,204,149,255,228,199,143,255,171,144,96,255,64,57,41,255,154,
+-126,81,255,227,189,122,255,230,184,119,255,227,171,98,255,34,30,21,255,0,
+-24,17,16,14,170,221,186,126,255,234,202,147,255,232,192,135,255,44,39,27,
+-255,0,44,9,9,8,142,25,24,20,255,114,95,53,255,207,169,102,255,227,
+-187,118,255,226,188,123,255,178,148,95,255,19,18,16,170,0,32,24,22,19,
+-85,197,145,84,255,227,187,118,255,231,194,124,255,207,173,114,255,61,55,38,
+-255,8,8,8,136,0,12,10,10,9,108,45,36,21,255,195,116,38,255,207,
+-122,38,255,139,90,32,255,13,12,8,170,0,4,10,10,9,198,208,140,59,
+-255,226,170,91,255,231,193,128,255,40,35,27,255,0,36,4,4,3,28,18,
+-17,13,227,222,189,131,255,234,201,143,255,229,191,130,255,34,30,23,204,0,
+-8,11,11,10,170,211,158,82,255,226,170,91,255,224,165,81,255,219,154,70,
+-255,208,132,51,255,206,128,45,255,204,122,41,255,201,120,40,255,196,116,37,
+-255,111,74,30,255,20,18,13,227,8,8,7,28,0,28,6,6,6,28,28,
+-26,21,255,222,186,123,255,229,196,132,255,181,144,92,255,16,15,13,212,0,
+-16,6,6,6,85,25,24,20,255,180,149,101,255,231,205,154,255,232,204,149,
+-255,227,198,142,255,223,192,138,255,223,193,136,255,230,199,139,255,232,197,141,
+-255,211,176,122,255,64,57,41,255,8,8,7,113,0,8,6,6,5,14,33,
+-31,24,227,186,155,107,255,232,204,149,255,233,205,152,255,227,197,140,255,221,
+-189,132,255,224,192,135,255,228,198,141,255,232,201,141,255,232,192,135,255,231,
+-197,132,255,41,35,26,255,0,64,17,16,14,139,211,178,120,255,233,202,148,
+-255,233,202,148,255,56,48,33,255,4,4,4,85,0,104,11,11,10,255,216,
+-164,89,255,230,191,123,255,227,195,134,255,40,35,27,227,0,28,16,15,13,
+-227,126,105,69,255,217,176,112,255,225,175,104,255,223,159,76,255,189,124,49,
+-255,43,35,20,255,9,8,8,57,0,8,10,10,9,133,194,109,33,255,215,
+-125,38,255,212,124,39,255,144,93,33,255,29,24,16,255,68,53,29,255,186,
+-123,49,255,128,95,47,255,25,24,20,255,143,119,78,255,230,201,145,255,33,
+-30,24,255,0,8,11,11,10,170,217,176,112,255,228,182,109,255,222,158,75,
+-255,212,134,51,255,204,122,41,255,198,117,37,255,200,118,37,255,208,123,39,
+-255,212,123,37,255,214,121,39,255,217,133,50,255,24,21,15,244,0,8,11,
+-11,10,170,218,185,127,255,235,203,148,255,233,202,148,255,230,201,145,255,227,
+-197,140,255,221,187,128,255,221,184,120,255,224,178,105,255,224,164,85,255,189,
+-129,58,255,39,32,20,255,7,7,6,85,0,8,11,10,8,125,194,109,33,
+-255,215,125,38,255,213,125,40,255,29,24,16,255,0,40,17,17,14,170,221,
+-188,130,255,235,201,152,255,232,201,141,255,42,36,27,255,0,12,17,17,14,
+-170,219,179,116,255,231,187,124,255,228,183,111,255,24,22,17,255,0,8,11,
+-11,10,170,218,185,127,255,232,197,137,255,227,179,104,255,219,155,72,255,208,
+-132,51,255,204,122,41,255,202,120,39,255,38,31,19,170,0,16,12,11,9,
+-170,196,110,33,255,215,113,38,255,213,122,42,255,215,143,58,255,217,166,92,
+-255,222,186,123,255,225,195,136,255,52,44,33,198,0,16,17,16,14,170,211,
+-150,70,255,219,140,56,255,213,126,42,255,25,21,14,255,0,40,17,17,14,
+-170,221,187,128,255,232,199,141,255,228,180,111,255,219,155,72,255,207,128,44,
+-255,199,119,39,255,200,118,37,255,208,123,39,255,212,123,37,255,214,125,39,
+-255,212,124,39,255,34,26,15,181,0,8,11,10,10,161,215,172,104,255,234,
+-201,143,255,234,206,151,255,42,39,29,255,0,40,12,11,9,170,196,110,33,
+-255,215,125,38,255,212,124,39,255,36,28,17,170,0,8,15,14,10,85,194,
+-109,33,255,215,125,38,255,212,124,39,255,210,128,41,255,211,135,54,255,225,
+-176,98,255,231,197,132,255,56,48,33,255,4,4,4,85,0,20,17,16,14,
+-170,206,135,51,255,217,133,50,255,213,122,42,255,25,21,14,255,0,32,12,
+-11,9,170,196,110,33,255,215,125,38,255,213,122,42,255,67,51,28,255,6,
+-6,5,255,40,34,25,255,226,190,127,255,138,110,69,255,7,7,7,255,25,
+-24,20,255,221,179,112,255,232,191,127,255,232,201,141,255,26,23,19,255,0,
+-8,11,11,10,170,214,168,101,255,230,187,119,255,228,188,117,255,212,173,105,
+-255,150,118,67,255,102,86,47,255,111,90,50,255,185,145,88,255,227,187,118,
+-255,231,195,132,255,232,201,141,255,26,23,19,255,0,8,11,11,10,170,219,
+-184,128,255,235,205,154,255,234,206,151,255,42,36,27,255,0,12,15,15,12,
+-170,213,158,80,255,228,182,109,255,230,191,123,255,27,23,18,255,0,8,11,
+-11,10,170,219,189,132,255,235,205,154,255,232,197,141,255,225,185,114,255,215,
+-155,78,255,206,135,51,255,205,126,42,255,209,128,42,255,212,121,41,255,181,
+-111,36,255,39,30,18,255,8,8,7,57,0,8,10,10,9,136,194,109,33,
+-255,215,125,38,255,212,124,39,255,24,20,13,255,0,12,15,14,12,170,210,
+-146,71,255,229,183,110,255,231,197,132,255,26,23,19,255,0,8,11,11,10,
+-170,218,189,127,255,234,199,143,255,231,197,132,255,225,176,106,255,214,153,75,
+-255,208,138,55,255,205,133,48,255,210,127,45,255,214,134,49,255,179,119,42,
+-255,37,30,18,255,7,7,6,85,0,12,23,20,14,227,161,115,50,255,222,
+-167,89,255,227,186,114,255,225,190,130,255,223,198,136,255,227,198,142,255,224,
+-196,141,255,221,191,134,255,161,130,86,255,33,30,24,229,10,10,9,42,0,
+-24,15,15,12,170,211,149,76,255,228,182,109,255,231,189,128,255,44,39,27,
+-255,0,24,17,17,14,170,216,170,97,255,226,172,95,255,224,165,81,255,31,
+-26,18,255,0,12,13,12,10,170,201,120,40,255,217,133,50,255,216,125,45,
+-255,25,21,14,212,0,8,11,10,8,144,203,130,52,255,224,166,83,255,228,
+-174,103,255,40,34,25,255,0,12,17,16,14,170,221,187,128,255,234,201,143,
+-255,230,191,123,255,28,25,19,244,0,8,10,10,9,164,203,122,50,255,220,
+-148,63,255,217,141,52,255,23,20,14,255,0,8,14,13,11,108,10,10,9,
+-28,0,4,13,13,12,170,221,189,134,255,235,205,154,255,234,206,151,255,42,
+-37,27,255,0,24,11,11,10,255,222,189,131,255,232,195,131,255,224,162,81,
+-255,36,29,19,255,4,4,4,54,0,28,7,7,6,28,19,17,12,232,93,
+-66,30,255,183,112,36,255,209,122,38,255,212,120,39,255,159,102,34,255,22,
+-19,13,255,7,7,6,85,0,24,6,6,5,28,17,16,14,227,149,122,84,
+-255,227,195,140,255,227,191,134,255,179,142,90,255,17,16,14,227,5,5,4,
+-25,0,20,15,14,12,170,204,129,49,255,218,141,51,255,213,126,42,255,25,
+-21,14,255,0,24,8,7,7,91,68,48,25,255,205,127,44,255,220,153,75,
+-255,99,78,44,255,8,8,7,113,0,28,12,11,9,170,196,110,33,255,215,
+-125,38,255,212,124,39,255,24,20,13,255,0,124,9,9,8,25,0,40,2,
+-2,1,23,9,8,6,255,199,116,34,255,215,125,38,255,212,128,45,255,27,
+-24,16,207,0,8,11,11,10,170,219,184,128,255,235,205,154,255,234,205,155,
+-255,58,49,35,255,5,5,4,85,0,4,4,4,3,28,16,15,11,227,204,
+-122,41,255,215,126,40,255,210,123,39,255,32,25,15,170,0,8,13,13,12,
+-122,208,168,99,255,234,199,143,255,234,204,151,255,63,54,38,255,5,5,4,
+-85,0,4,4,4,3,28,18,17,13,215,204,127,45,255,214,125,39,255,212,
+-121,41,255,34,27,15,170,0,8,13,12,10,85,185,112,34,255,215,125,38,
+-255,212,123,37,255,35,28,16,255,4,4,3,85,0,4,3,3,2,28,12,
+-10,9,224,198,117,37,255,215,125,38,255,212,124,39,255,34,27,15,178,0,
+-8,14,13,11,113,206,162,94,255,232,199,141,255,234,207,155,255,63,53,36,
+-255,4,4,3,113,0,4,3,3,3,28,10,10,9,255,200,118,37,255,215,
+-125,38,255,210,123,39,255,27,22,14,227,0,12,3,3,2,6,13,11,8,
+-221,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,5,4,4,
+-57,0,12,15,14,12,147,206,154,87,255,232,195,137,255,234,204,151,255,63,
+-54,38,255,5,5,4,85,0,4,4,4,3,28,18,16,13,227,222,189,131,
+-255,235,205,152,255,234,205,155,255,27,24,20,255,0,8,11,11,10,170,219,
+-184,130,255,235,205,152,255,234,205,155,255,58,49,35,255,5,5,4,85,0,
+-4,4,4,3,28,14,12,9,227,199,117,36,255,215,113,38,255,210,123,39,
+-255,32,25,15,170,0,8,12,12,9,102,194,109,33,255,215,125,38,255,212,
+-124,39,255,27,22,14,255,0,24,18,16,13,170,217,176,110,255,234,196,143,
+-255,234,204,151,255,27,24,20,255,0,8,11,10,10,170,204,134,59,255,219,
+-136,54,255,213,122,42,255,72,50,27,255,8,8,7,255,25,22,14,255,195,
+-116,38,255,208,123,39,255,142,91,31,255,16,14,9,193,4,4,3,17,0,
+-12,11,11,8,170,198,117,37,255,219,133,56,255,221,152,70,255,27,23,16,
+-221,0,8,13,12,10,99,193,113,34,255,223,156,70,255,231,193,128,255,40,
+-34,25,255,4,3,3,113,17,16,12,227,208,136,59,255,45,36,21,255,4,
+-3,3,113,10,9,7,207,196,110,33,255,215,125,38,255,210,128,41,255,32,
+-25,15,170,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212,124,39,
+-255,35,27,16,255,4,4,3,85,0,4,3,3,2,28,12,11,9,227,199,
+-117,36,255,221,150,66,255,229,191,126,255,32,29,23,210,0,8,13,13,12,
+-122,204,150,79,255,223,159,76,255,217,141,52,255,84,57,29,255,9,8,6,
+-170,5,5,4,85,6,6,5,113,27,22,14,255,207,128,44,255,223,147,72,
+-255,227,187,118,255,34,30,23,207,0,8,12,11,11,170,218,180,119,255,229,
+-184,114,255,224,167,85,255,50,40,25,255,5,5,4,85,0,4,4,4,3,
+-28,14,12,9,227,203,125,42,255,217,128,48,255,213,128,45,255,35,27,16,
+-173,0,8,12,12,11,130,209,163,98,255,235,203,148,255,233,202,148,255,63,
+-54,36,255,5,5,4,85,0,4,4,4,3,28,15,15,12,227,209,137,60,
+-255,221,151,68,255,219,147,62,255,23,20,14,238,0,8,10,10,9,150,196,
+-121,41,255,217,128,48,255,215,133,44,255,40,31,19,255,5,5,5,85,0,
+-4,4,4,3,28,16,14,11,207,201,120,40,255,217,133,50,255,221,161,76,
+-255,57,44,28,170,0,8,15,14,12,105,211,165,98,255,232,197,137,255,232,
+-199,141,255,58,49,35,255,4,4,3,113,0,40,3,3,2,17,12,11,9,
+-227,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,4,4,3,
+-62,0,12,12,11,9,170,200,120,41,255,223,159,76,255,230,191,123,255,44,
+-37,27,255,0,12,18,17,15,170,208,140,59,255,217,133,50,255,213,125,40,
+-255,27,23,14,195,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212,
+-124,39,255,25,21,14,255,0,12,17,16,14,170,219,179,116,255,235,201,152,
+-255,234,204,151,255,27,24,20,255,0,8,10,10,9,170,198,122,41,255,215,
+-127,42,255,213,125,40,255,27,22,14,255,0,20,12,11,9,170,201,120,40,
+-255,224,156,83,255,231,190,132,255,40,33,25,255,0,12,10,10,9,85,52,
+-42,29,255,200,142,59,255,183,119,44,255,72,52,27,255,39,30,18,255,49,
+-37,22,255,150,99,33,255,196,116,37,255,77,50,24,255,10,9,7,144,0,
+-12,10,10,9,170,196,115,35,255,215,125,38,255,212,124,39,255,25,21,14,
+-255,0,12,12,11,9,170,196,110,33,255,214,127,43,255,222,158,75,255,41,
+-34,24,255,0,24,5,5,4,85,11,11,10,255,130,101,59,255,223,176,102,
+-255,224,176,101,255,177,137,74,255,18,17,13,227,6,5,5,28,0,12,20,
+-19,15,85,186,120,49,255,217,142,62,255,217,139,56,255,34,29,19,255,4,
+-4,3,17,0,20,17,17,14,170,221,188,130,255,235,205,152,255,234,205,155,
+-255,42,39,29,255,0,24,13,13,10,181,199,119,39,255,212,121,41,255,203,
+-121,40,255,35,29,17,170,0,100,20,18,15,170,222,186,123,255,234,201,143,
+-255,232,197,135,255,47,40,28,255,0,64,14,13,11,170,213,160,84,255,230,
+-187,119,255,231,197,132,255,35,30,22,198,0,4,14,13,11,108,217,176,112,
+-255,232,193,137,255,231,197,132,255,33,28,22,255,0,24,12,12,11,113,31,
+-29,22,210,40,35,27,255,41,34,24,255,29,24,16,255,32,26,17,255,146,
+-92,35,255,214,134,49,255,212,128,45,255,123,81,36,255,15,13,10,142,0,
+-20,7,7,6,85,28,26,19,252,194,140,71,255,212,127,43,255,202,118,35,
+-255,97,66,30,255,15,14,10,207,6,6,5,25,0,24,6,6,5,8,15,
+-13,12,227,111,86,50,255,209,168,102,255,176,136,83,255,85,67,44,255,163,
+-129,80,255,221,186,126,255,83,69,44,255,7,7,6,170,5,5,5,8,0,
+-4,9,9,8,108,20,18,13,170,13,12,10,51,0,36,16,15,13,170,217,
+-176,110,255,232,194,133,255,232,198,139,255,36,33,25,255,0,24,15,15,12,
+-170,219,179,116,255,232,193,137,255,232,199,135,255,31,26,20,255,0,8,11,
+-11,10,28,56,48,33,227,98,76,45,255,104,80,45,255,195,154,96,255,227,
+-186,114,255,226,189,125,255,207,173,114,255,222,188,123,255,231,190,132,255,217,
+-188,124,255,137,109,70,255,99,86,54,255,78,64,43,255,21,20,16,85,0,
+-8,12,12,11,28,54,48,35,227,86,72,47,255,74,63,43,255,171,137,84,
+-255,229,191,130,255,230,191,123,255,230,186,123,255,202,164,105,255,97,80,50,
+-255,75,64,44,255,72,61,39,255,22,21,17,102,0,36,12,11,11,45,55,
+-45,30,227,90,71,45,255,78,63,41,255,72,61,39,255,74,63,43,255,72,
+-61,39,255,72,61,39,255,91,74,46,255,78,63,41,255,22,20,17,102,0,
+-48,12,12,11,176,132,106,61,255,228,188,125,255,210,172,113,255,42,37,29,
+-255,9,9,8,62,0,16,17,16,14,170,221,186,124,255,234,199,143,255,232,
+-201,141,255,232,201,141,255,221,189,134,255,52,46,33,255,6,7,6,227,24,
+-23,17,255,208,132,51,255,215,133,44,255,212,124,39,255,24,20,13,255,0,
+-24,17,16,12,170,219,177,112,255,231,187,124,255,228,182,109,255,40,33,23,
+-255,0,36,9,9,8,74,17,15,12,227,67,51,28,255,162,107,43,255,200,
+-142,67,255,204,157,91,255,177,140,86,255,74,63,43,255,19,17,16,198,9,
+-9,8,28,0,32,14,14,11,31,56,46,31,227,192,157,103,255,229,194,128,
+-255,225,188,124,255,146,112,67,255,11,10,8,164,0,8,7,7,6,28,34,
+-27,17,255,190,107,33,255,210,121,35,255,146,95,35,255,16,14,11,187,0,
+-8,9,9,8,170,214,164,93,255,232,194,127,255,231,195,132,255,40,34,25,
+-255,0,40,13,13,10,170,213,157,84,255,224,166,83,255,221,150,66,255,23,
+-20,14,246,0,8,12,11,9,113,194,109,33,255,212,119,37,255,210,113,35,
+-255,168,103,33,255,56,42,23,255,27,23,14,255,38,31,19,255,149,92,30,
+-255,207,118,32,255,207,113,30,255,124,75,27,255,13,11,8,161,0,28,12,
+-12,11,176,130,99,59,255,229,191,126,255,211,174,116,255,43,37,28,255,9,
+-9,8,59,0,16,8,8,7,85,68,58,37,255,214,177,119,255,231,196,136,
+-255,207,171,114,255,97,80,50,255,54,47,35,255,66,59,41,255,178,148,95,
+-255,228,189,121,255,224,187,123,255,146,112,67,255,12,12,11,170,0,12,10,
+-10,9,28,16,15,13,147,29,28,22,221,48,42,31,255,70,61,41,255,66,
+-57,39,255,70,61,41,255,171,140,92,255,224,170,101,255,224,168,87,255,224,
+-165,81,255,39,32,22,255,0,64,14,13,11,57,100,82,51,255,222,186,123,
+-255,226,172,95,255,113,82,38,255,9,8,8,127,0,32,11,9,6,102,11,
+-10,6,170,11,10,8,170,12,11,9,170,15,13,10,170,15,13,10,170,15,
+-14,10,170,18,15,11,170,18,15,11,156,12,11,9,28,0,28,6,6,5,
+-65,40,34,25,255,224,183,119,255,229,195,136,255,171,140,92,255,21,20,18,
+-142,0,24,11,10,8,102,131,92,46,255,213,145,56,255,214,119,43,255,210,
+-128,41,255,151,94,32,255,23,21,14,255,10,10,9,85,0,12,10,9,7,
+-170,191,106,30,255,211,115,30,255,208,114,31,255,141,87,30,255,36,31,19,
+-255,121,90,42,255,217,168,92,255,205,163,102,255,132,102,59,255,213,172,108,
+-255,231,193,128,255,35,30,22,255,0,8,11,11,10,164,203,129,50,255,215,
+-127,42,255,211,117,34,255,166,97,29,255,54,40,21,255,29,23,14,255,38,
+-31,19,255,120,78,29,255,206,118,33,255,214,127,43,255,224,155,81,255,23,
+-21,16,255,0,8,11,10,10,170,217,183,116,255,234,201,143,255,232,198,139,
+-255,202,166,109,255,97,78,50,255,52,46,33,255,58,50,33,255,150,96,39,
+-255,208,121,37,255,195,112,30,255,83,53,24,255,9,8,6,113,0,8,13,
+-12,8,96,189,104,28,255,210,120,33,255,214,132,45,255,34,29,19,255,0,
+-40,17,16,12,170,217,172,102,255,228,180,105,255,228,181,107,255,40,33,23,
+-255,0,12,17,15,12,170,216,171,101,255,232,191,127,255,231,197,132,255,24,
+-22,17,255,0,8,11,11,10,167,209,146,72,255,221,151,68,255,213,126,42,
+-255,172,106,35,255,57,41,22,255,42,32,19,255,43,33,20,252,18,15,11,
+-85,0,16,11,10,8,170,193,111,30,255,215,113,38,255,220,144,63,255,197,
+-145,84,255,91,71,44,255,75,62,42,255,75,64,44,255,22,21,17,99,0,
+-16,14,13,11,170,196,110,33,255,210,115,31,255,210,115,31,255,22,19,11,
+-227,0,8,16,13,9,113,24,21,15,170,17,15,12,170,18,15,13,170,19,
+-17,12,142,9,8,8,28,0,8,14,13,11,170,210,146,71,255,220,142,59,
+-255,213,125,40,255,168,103,33,255,54,40,21,255,29,23,14,255,38,31,19,
+-255,119,78,30,255,204,116,31,255,210,119,31,255,210,115,31,255,26,20,13,
+-210,0,8,11,11,10,170,217,179,120,255,234,202,147,255,232,201,141,255,40,
+-35,25,255,0,40,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31,
+-255,36,25,13,170,0,8,14,12,9,85,190,105,29,255,210,107,31,255,208,
+-114,31,255,187,124,42,255,143,111,56,255,210,171,109,255,229,187,128,255,131,
+-99,54,255,8,8,7,156,0,20,13,12,10,170,194,112,31,255,210,107,31,
+-255,210,115,31,255,22,19,11,255,0,32,11,10,8,170,193,111,30,255,215,
+-125,38,255,218,141,59,255,39,33,22,255,5,5,5,28,12,12,11,170,156,
+-126,83,255,27,24,20,227,5,5,5,23,14,13,11,198,219,177,112,255,232,
+-191,127,255,230,191,123,255,25,22,16,249,0,8,11,10,8,153,200,120,41,
+-255,214,127,43,255,213,126,42,255,93,66,32,255,11,11,10,255,34,31,23,
+-255,206,152,81,255,226,179,111,255,231,189,128,255,232,192,135,255,232,201,141,
+-255,25,22,18,255,0,8,11,10,10,170,215,171,102,255,228,174,105,255,222,
+-158,75,255,27,24,16,255,0,12,15,15,12,170,219,177,112,255,232,193,137,
+-255,232,201,141,255,25,22,18,255,0,8,11,10,10,170,215,172,104,255,228,
+-182,109,255,221,155,70,255,177,114,46,255,55,42,24,255,35,28,18,255,41,
+-31,18,255,35,28,17,255,27,22,14,255,17,16,12,187,9,9,8,79,0,
+-12,10,9,7,170,191,106,30,255,211,115,30,255,210,115,31,255,33,25,14,
+-255,0,12,21,20,16,170,221,180,116,255,232,193,137,255,232,201,141,255,25,
+-22,18,255,0,8,11,11,10,170,212,160,85,255,224,156,83,255,218,141,59,
+-255,175,115,44,255,55,42,24,255,31,25,16,255,38,30,19,255,127,82,30,
+-255,204,116,31,255,195,112,30,255,82,55,25,255,11,10,8,150,0,12,9,
+-9,8,28,15,14,12,142,28,25,19,221,46,40,29,255,71,60,38,255,66,
+-57,39,255,70,61,41,255,193,159,106,255,227,184,108,255,221,153,72,255,155,
+-98,36,255,13,12,10,170,0,24,17,15,12,170,219,180,112,255,232,197,137,
+-255,232,201,141,255,40,35,25,255,0,24,14,13,11,170,198,117,37,255,213,
+-124,38,255,210,121,35,255,23,19,12,255,0,12,11,10,8,170,193,111,30,
+-255,211,115,30,255,208,114,31,255,23,19,12,207,0,8,14,13,11,85,181,
+-132,68,255,228,185,117,255,231,193,128,255,54,46,31,255,5,5,4,8,0,
+-8,21,20,16,178,215,160,88,255,223,147,72,255,206,135,51,255,23,20,14,
+-170,0,8,12,11,9,102,192,111,31,255,210,108,33,255,208,114,31,255,22,
+-18,11,255,0,4,10,10,9,113,79,61,38,255,17,16,12,198,0,4,16,
+-15,13,170,219,179,116,255,231,187,124,255,224,169,91,255,33,28,20,255,0,
+-20,9,8,8,85,39,33,24,255,217,166,92,255,219,140,56,255,210,121,35,
+-255,66,44,21,255,7,7,6,133,0,32,6,6,5,74,19,18,12,255,183,
+-102,30,255,207,105,30,255,210,111,31,255,73,51,24,255,8,8,7,116,0,
+-24,6,6,6,28,15,13,12,227,144,112,61,255,221,180,116,255,224,178,113,
+-255,152,116,65,255,18,17,13,221,8,8,7,28,0,24,12,10,9,170,193,
+-111,30,255,210,107,31,255,210,115,31,255,22,19,11,255,0,28,16,15,13,
+-227,164,122,63,255,225,185,114,255,192,153,97,255,21,19,16,232,7,7,6,
+-28,0,24,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31,255,23,
+-19,12,255,0,148,6,6,5,51,11,9,6,85,12,10,7,102,10,8,5,
+-156,10,8,5,127,8,7,5,184,27,22,12,255,198,105,29,255,211,122,36,
+-255,220,136,61,255,25,22,16,255,0,8,10,10,9,170,218,181,123,255,234,
+-202,147,255,232,197,141,255,30,27,21,255,0,12,9,8,6,170,191,106,30,
+-255,211,115,30,255,210,111,31,255,39,27,14,170,0,8,12,11,11,170,218,
+-180,119,255,234,196,143,255,232,201,141,255,29,26,20,255,0,12,7,7,6,
+-28,27,22,14,156,25,22,14,255,32,25,15,210,22,18,11,28,0,8,10,
+-9,7,150,195,112,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0,
+-12,9,9,8,170,191,106,30,255,211,111,30,255,208,114,31,255,25,20,12,
+-204,0,8,12,11,11,170,218,180,119,255,234,202,147,255,232,201,141,255,142,
+-111,63,255,14,12,9,227,10,9,7,127,8,7,5,181,35,25,14,255,199,
+-112,28,255,209,118,30,255,209,117,28,255,30,22,13,255,0,16,9,8,6,
+-167,191,106,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0,16,21,
+-19,16,170,220,178,113,255,232,197,137,255,232,201,141,255,26,23,19,255,0,
+-12,11,11,10,170,218,181,123,255,234,201,143,255,231,197,132,255,24,22,17,
+-255,0,8,11,10,10,170,218,181,123,255,234,201,143,255,231,197,132,255,30,
+-26,21,255,0,12,9,8,6,167,191,106,30,255,211,115,30,255,210,111,31,
+-255,39,27,14,170,0,8,13,12,8,85,190,105,29,255,213,119,36,255,214,
+-132,45,255,32,26,17,255,0,24,17,16,14,170,221,186,124,255,234,202,147,
+-255,232,199,135,255,25,22,18,252,0,8,11,10,8,127,192,111,31,255,210,
+-107,31,255,208,114,31,255,161,94,28,255,65,43,20,255,145,85,26,255,207,
+-117,30,255,122,75,29,255,15,14,10,170,5,5,4,8,0,16,11,10,8,
+-170,196,115,35,255,223,146,70,255,228,183,111,255,25,22,16,252,0,8,14,
+-12,9,85,190,105,29,255,215,125,38,255,218,141,59,255,30,24,17,195,0,
+-4,10,10,7,170,193,111,30,255,20,17,11,252,0,4,11,10,8,85,188,
+-103,27,255,211,115,30,255,209,106,30,255,39,27,14,170,0,8,13,12,8,
+-85,190,105,29,255,211,115,30,255,210,115,31,255,19,15,10,255,0,12,9,
+-8,6,167,192,111,31,255,218,137,51,255,227,175,100,255,27,24,18,255,0,
+-8,11,10,8,147,196,106,33,255,210,108,33,255,210,115,31,255,30,23,13,
+-255,4,4,3,14,0,8,15,14,12,195,211,149,76,255,229,184,114,255,232,
+-199,135,255,28,25,19,255,0,8,11,10,8,167,203,129,50,255,215,127,42,
+-255,210,121,35,255,20,17,11,232,0,12,9,8,6,139,190,105,29,255,211,
+-111,30,255,209,114,30,255,30,22,13,198,0,8,13,12,10,170,217,173,104,
+-255,232,193,137,255,232,194,139,255,25,22,18,255,0,12,9,8,8,156,192,
+-111,31,255,210,108,33,255,210,115,31,255,32,24,13,173,0,8,13,12,8,
+-88,190,105,29,255,211,115,30,255,208,114,31,255,19,15,10,255,0,12,7,
+-7,6,28,27,22,14,198,45,36,21,255,52,43,29,244,14,13,11,85,0,
+-8,13,13,12,88,177,143,90,255,230,194,131,255,226,172,95,255,137,91,36,
+-255,10,9,7,227,8,8,5,161,10,9,7,167,10,9,7,136,13,10,6,
+-85,7,6,6,74,0,24,9,8,6,167,191,106,30,255,211,115,30,255,210,
+-115,31,255,19,15,10,252,0,16,12,11,9,170,208,141,61,255,230,187,119,
+-255,232,201,141,255,40,34,25,255,0,12,14,12,9,170,196,109,31,255,210,
+-107,31,255,210,115,31,255,36,25,13,170,0,8,10,9,7,85,155,91,28,
+-255,208,114,31,255,209,106,30,255,30,22,13,255,0,12,22,21,17,176,222,
+-186,123,255,234,199,143,255,226,195,135,255,35,29,22,178,0,8,12,11,9,
+-105,190,105,29,255,211,115,30,255,208,114,31,255,23,19,12,210,0,8,15,
+-12,8,59,7,6,4,3,0,4,9,9,8,159,204,134,59,255,230,182,119,
+-255,232,198,139,255,39,33,24,255,0,16,10,10,9,34,15,14,10,198,52,
+-40,21,255,165,96,28,255,198,113,29,255,185,102,28,255,80,53,25,255,19,
+-17,12,227,10,9,7,76,0,16,11,10,8,170,195,112,30,255,211,115,30,
+-255,210,115,31,255,20,16,11,255,0,12,10,9,7,170,192,111,31,255,215,
+-125,38,255,224,159,83,255,41,33,24,255,0,24,7,7,6,108,24,20,13,
+-255,146,88,31,255,195,127,38,255,113,77,34,255,15,14,12,210,7,7,6,
+-28,0,16,12,12,11,28,37,30,18,227,168,99,31,255,206,114,33,255,51,
+-34,18,255,6,5,5,71,0,20,17,16,14,170,221,186,124,255,234,202,147,
+-255,232,201,141,255,40,35,25,255,0,24,17,15,10,227,198,105,29,255,194,
+-109,33,255,62,44,23,255,16,14,11,85,0,100,19,17,12,142,214,171,97,
+-255,228,183,113,255,227,186,108,255,50,40,25,227,0,64,12,11,9,198,214,
+-158,85,255,229,183,110,255,228,181,107,255,21,19,14,249,2,2,1,20,8,
+-8,7,181,210,156,79,255,226,169,95,255,224,155,81,255,33,26,18,255,4,
+-4,4,28,0,40,3,3,2,28,11,10,8,255,209,138,62,255,223,154,72,
+-255,221,164,82,255,27,23,16,249,0,16,7,7,6,79,46,38,25,255,197,
+-151,84,255,222,161,89,255,209,128,42,255,141,91,32,255,15,13,10,218,5,
+-5,5,11,0,28,15,13,10,139,191,131,60,255,220,168,93,255,168,123,69,
+-255,14,13,11,227,5,5,5,85,9,9,8,170,105,78,40,255,162,116,61,
+-255,88,66,37,255,23,21,16,255,11,11,10,255,78,58,35,255,208,150,75,
+-255,61,46,28,181,0,36,15,13,10,170,216,170,97,255,230,187,119,255,228,
+-178,113,255,34,28,19,255,0,24,15,13,10,170,215,167,92,255,229,179,114,
+-255,228,181,107,255,32,27,19,255,0,16,6,6,6,25,5,5,4,198,52,
+-42,27,255,220,169,97,255,189,142,76,255,35,31,22,255,134,96,51,255,225,
+-176,106,255,140,106,53,255,6,6,5,255,6,6,6,51,0,28,5,5,5,
+-28,15,13,10,227,208,136,59,255,218,138,53,255,213,122,42,255,43,31,18,
+-255,5,5,4,85,0,136,9,8,8,57,57,47,30,255,212,163,93,255,224,
+-157,85,255,124,90,45,255,10,10,9,147,0,20,15,13,10,170,216,170,97,
+-255,228,181,107,255,224,165,81,255,194,136,61,255,58,46,29,255,12,12,11,
+-85,0,4,10,9,7,156,174,91,23,255,202,103,23,255,202,102,21,255,20,
+-16,9,255,0,24,15,13,10,170,213,155,80,255,227,175,100,255,227,171,98,
+-255,35,29,20,255,0,32,7,7,6,85,49,33,18,255,183,108,34,255,209,
+-128,42,255,209,137,60,255,186,134,67,255,95,74,39,255,22,20,15,229,8,
+-8,7,105,0,44,5,4,4,28,17,15,12,227,216,167,89,255,228,181,107,
+-255,223,176,102,255,34,28,19,184,0,8,12,11,9,108,180,106,33,255,214,
+-125,39,255,217,141,52,255,42,33,21,255,4,4,4,85,0,8,11,10,8,
+-198,211,149,76,255,224,160,77,255,220,144,63,255,34,27,17,255,0,40,12,
+-10,7,170,189,99,26,255,206,102,25,255,203,100,24,255,30,21,11,176,0,
+-8,12,10,7,85,167,87,22,255,202,103,23,255,202,102,21,255,27,20,10,
+-255,4,4,3,68,0,4,4,4,4,28,12,10,7,215,176,91,23,255,203,
+-104,24,255,202,105,27,255,28,21,13,249,0,24,9,8,8,57,57,47,30,
+-255,213,167,94,255,228,184,115,255,126,92,47,255,9,9,8,147,0,20,13,
+-12,10,167,199,131,58,255,220,148,63,255,219,147,62,255,49,38,24,255,6,
+-6,6,85,0,4,5,5,5,28,15,14,12,227,217,169,94,255,228,183,111,
+-255,225,174,102,255,31,25,18,241,0,36,5,5,5,28,15,13,10,227,204,
+-127,45,255,219,133,56,255,221,150,66,255,35,28,18,255,0,68,10,9,9,
+-85,45,34,21,255,201,110,30,255,192,100,25,255,57,35,16,255,12,10,7,
+-85,0,24,13,11,6,79,126,68,21,255,191,100,26,255,198,117,37,255,208,
+-139,65,255,213,155,80,255,214,161,85,255,215,167,92,255,216,167,89,255,215,
+-160,88,255,49,38,24,170,0,24,7,7,6,76,45,36,24,249,207,164,90,
+-255,228,183,111,255,143,111,56,255,13,12,10,170,0,28,13,12,8,142,182,
+-99,25,255,203,108,24,255,202,102,21,255,112,65,23,255,15,13,8,227,6,
+-6,5,45,0,16,10,8,7,170,171,89,22,255,202,95,23,255,202,103,23,
+-255,103,64,26,255,20,18,13,255,79,61,36,255,222,173,97,255,227,179,104,
+-255,224,172,97,255,226,171,99,255,224,176,93,255,36,29,19,207,0,8,12,
+-10,7,113,176,91,23,255,202,95,23,255,202,102,21,255,27,20,10,255,4,
+-4,3,74,0,4,4,4,4,28,11,9,6,215,187,101,24,255,216,134,45,
+-255,226,172,95,255,23,21,16,241,0,8,10,10,9,161,212,160,85,255,226,
+-172,95,255,222,158,75,255,51,39,24,255,6,6,6,85,0,4,4,4,3,
+-28,11,10,6,215,176,91,23,255,202,102,21,255,191,102,22,255,22,17,9,
+-170,0,8,12,10,7,85,167,87,22,255,204,105,25,255,217,133,50,255,35,
+-28,18,255,0,40,15,13,10,170,199,116,34,255,212,114,35,255,218,139,55,
+-255,33,27,18,255,0,12,15,13,10,170,213,160,84,255,227,175,100,255,224,
+-165,81,255,25,21,14,235,0,8,13,11,8,108,184,96,25,255,203,96,24,
+-255,202,95,23,255,27,20,10,255,4,4,3,71,0,28,10,9,7,170,187,
+-101,24,255,216,134,45,255,224,167,85,255,54,42,27,255,6,6,6,85,0,
+-28,10,9,7,170,171,89,22,255,202,103,23,255,202,102,21,255,29,21,10,
+-170,0,4,11,9,6,42,137,77,24,255,211,136,56,255,215,167,92,255,216,
+-166,95,255,213,163,84,255,33,28,18,161,0,8,11,10,8,130,184,100,25,
+-255,203,100,24,255,202,102,21,255,27,20,10,255,4,4,3,74,0,4,4,
+-4,4,28,11,9,6,215,176,91,23,255,202,103,23,255,202,95,23,255,28,
+-21,11,190,0,8,10,10,9,161,212,161,89,255,228,174,105,255,223,161,80,
+-255,33,28,18,255,0,40,10,9,7,167,171,89,22,255,202,103,23,255,202,
+-102,21,255,29,21,10,170,0,8,12,10,7,85,167,87,22,255,202,103,23,
+-255,203,108,24,255,68,47,25,255,6,6,5,255,31,26,20,255,220,168,93,
+-255,220,177,101,255,110,80,41,255,12,11,9,150,0,16,10,9,7,170,171,
+-89,22,255,202,103,23,255,202,102,21,255,20,16,9,255,0,32,10,9,7,
+-170,193,111,30,255,219,136,54,255,224,165,81,255,27,24,16,255,0,4,7,
+-7,7,28,21,20,16,181,10,10,9,85,0,4,12,11,9,170,204,130,51,
+-255,218,141,51,255,211,122,36,255,32,23,13,187,0,8,13,11,8,85,167,
+-87,22,255,203,100,24,255,208,105,29,255,23,19,12,255,4,4,3,28,11,
+-10,8,181,211,158,82,255,229,183,110,255,228,183,111,255,228,183,113,255,228,
+-181,107,255,27,23,16,229,0,8,10,10,9,150,192,111,31,255,208,112,27,
+-255,203,108,24,255,21,17,10,255,0,12,15,13,10,170,216,170,97,255,229,
+-183,110,255,228,181,107,255,25,21,16,235,0,8,11,10,8,142,194,116,33,
+-255,209,106,30,255,203,108,24,255,27,20,10,255,4,4,3,74,0,36,10,
+-8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,42,28,13,255,6,
+-5,5,48,0,4,6,6,6,28,21,19,14,255,221,175,102,255,229,179,114,
+-255,228,181,107,255,24,20,15,246,0,8,12,11,9,127,190,104,27,255,206,
+-106,25,255,202,103,23,255,27,20,10,255,4,4,3,74,0,4,4,4,4,
+-28,11,10,6,215,176,91,23,255,204,105,25,255,207,122,38,255,28,22,15,
+-238,0,36,5,5,5,28,15,13,10,227,195,111,28,255,204,105,25,255,197,
+-100,22,255,22,17,9,224,0,24,15,13,10,170,216,170,97,255,229,184,114,
+-255,228,181,107,255,34,28,19,255,0,24,10,9,7,170,174,91,23,255,202,
+-103,23,255,202,102,21,255,20,16,9,252,0,12,10,9,7,170,171,89,22,
+-255,202,107,23,255,206,111,27,255,22,17,11,252,0,8,8,7,7,45,73,
+-59,36,255,218,174,105,255,228,178,107,255,89,67,36,255,7,7,6,113,0,
+-4,5,5,4,28,20,18,13,255,199,110,30,255,202,105,27,255,88,54,23,
+-255,10,9,7,113,0,8,13,11,6,85,167,87,22,255,202,95,23,255,202,
+-90,23,255,32,24,13,255,4,4,3,178,19,16,12,238,212,163,93,255,66,
+-52,31,255,5,5,5,184,14,13,11,255,205,133,48,255,212,114,35,255,208,
+-117,29,255,29,22,14,255,0,16,12,11,9,85,101,74,38,255,189,121,49,
+-255,185,104,32,255,180,98,25,255,180,93,23,255,154,82,23,255,75,44,18,
+-255,11,9,6,144,0,32,10,9,7,170,157,79,22,255,202,102,21,255,202,
+-102,21,255,22,17,9,255,0,28,14,13,11,224,136,98,53,255,217,165,82,
+-255,213,145,56,255,150,92,35,255,19,16,12,173,5,5,5,8,0,28,10,
+-8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,20,16,9,252,0,
+-28,7,7,6,59,43,35,24,255,221,175,102,255,223,178,106,255,134,98,51,
+-255,14,13,11,142,0,24,10,9,7,167,171,89,22,255,202,103,23,255,202,
+-102,21,255,20,16,9,255,0,144,12,10,7,170,46,29,13,255,140,74,21,
+-255,165,86,22,255,167,87,22,255,165,86,22,255,167,87,22,255,185,95,22,
+-255,198,97,23,255,206,111,27,255,221,146,66,255,23,19,14,249,0,8,10,
+-10,9,153,212,161,89,255,229,183,110,255,224,165,81,255,28,23,15,255,0,
+-12,10,8,7,156,171,89,22,255,202,103,23,255,202,102,21,255,31,21,10,
+-170,0,8,10,10,9,167,212,160,85,255,228,177,105,255,222,158,75,255,27,
+-23,16,255,0,40,10,8,7,170,167,87,22,255,202,103,23,255,202,102,21,
+-255,20,16,9,238,0,12,10,8,7,164,171,89,22,255,202,103,23,255,203,
+-100,24,255,22,18,11,235,0,8,10,10,9,167,214,164,93,255,228,182,109,
+-255,223,154,80,255,207,120,36,255,189,94,24,255,167,87,22,255,167,87,22,
+-255,187,96,22,255,198,93,23,255,202,93,21,255,198,96,21,255,26,19,9,
+-227,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20,
+-15,9,252,0,16,17,15,12,170,216,170,97,255,229,183,110,255,224,164,85,
+-255,29,24,16,255,3,3,2,28,0,8,12,11,9,198,211,149,76,255,221,
+-151,68,255,219,146,60,255,22,19,13,246,0,8,10,10,9,161,210,155,77,
+-255,223,147,72,255,213,122,42,255,23,18,12,255,0,12,10,8,7,167,171,
+-89,22,255,202,103,23,255,202,102,21,255,29,21,10,170,0,8,12,10,7,
+-85,166,87,23,255,209,118,30,255,218,139,55,255,33,27,18,255,0,24,15,
+-13,10,170,215,159,92,255,226,169,95,255,218,141,59,255,34,26,15,190,0,
+-8,13,10,6,85,167,87,22,255,202,103,23,255,198,96,21,255,197,96,22,
+-255,189,97,22,255,198,96,21,255,198,96,21,255,25,19,10,255,4,4,3,
+-28,0,20,10,9,7,170,178,92,23,255,210,107,31,255,215,128,44,255,33,
+-24,14,193,0,8,12,10,7,85,167,87,22,255,202,95,23,255,202,103,23,
+-255,32,22,11,170,0,4,10,8,7,170,171,89,22,255,24,17,9,249,0,
+-4,12,10,7,85,163,82,22,255,202,103,23,255,202,102,21,255,29,21,10,
+-170,0,8,12,10,7,85,166,87,23,255,202,103,23,255,202,102,21,255,20,
+-15,9,255,0,12,10,8,7,167,170,89,23,255,206,106,25,255,208,115,33,
+-255,28,21,13,207,0,8,13,10,6,85,167,87,22,255,202,95,23,255,202,
+-102,21,255,20,16,9,255,0,12,15,13,10,170,214,158,85,255,229,183,110,
+-255,228,185,111,255,24,20,15,249,0,8,12,11,9,108,176,91,23,255,202,
+-95,23,255,202,102,21,255,18,15,9,255,2,2,1,8,0,8,8,7,5,
+-184,171,89,22,255,202,95,23,255,202,102,21,255,34,23,11,173,0,8,12,
+-11,9,136,212,160,85,255,228,180,105,255,225,165,88,255,31,25,18,255,3,
+-3,2,28,0,8,8,7,5,178,171,89,22,255,202,103,23,255,202,102,21,
+-255,30,21,11,170,0,8,12,10,7,85,167,87,22,255,202,103,23,255,202,
+-102,21,255,20,15,9,255,0,40,7,7,6,28,30,27,21,238,167,111,50,
+-255,206,110,33,255,199,102,24,255,175,90,22,255,165,86,22,255,167,87,22,
+-255,167,87,22,255,161,87,22,255,84,48,19,255,18,15,9,227,8,7,5,
+-28,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20,
+-15,9,252,0,16,15,13,10,170,211,159,76,255,229,180,110,255,228,182,109,
+-255,34,28,19,255,0,12,10,9,7,170,171,89,22,255,202,103,23,255,202,
+-102,21,255,31,22,10,170,0,8,7,6,6,28,48,31,15,255,189,93,22,
+-255,202,102,21,255,45,29,14,255,5,5,4,113,0,4,5,5,4,28,22,
+-20,15,255,220,169,97,255,226,178,103,255,167,118,54,255,15,13,10,133,0,
+-8,13,11,6,85,167,87,22,255,202,103,23,255,202,102,21,255,19,15,8,
+-215,0,4,11,9,6,105,121,65,20,255,26,18,9,190,0,4,9,9,8,
+-167,208,150,75,255,229,183,110,255,228,181,113,255,37,29,20,255,0,24,8,
+-8,5,218,167,87,22,255,202,93,21,255,198,104,21,255,23,18,10,255,3,
+-3,2,51,0,20,10,9,7,153,171,89,22,255,202,95,23,255,202,102,21,
+-255,20,15,9,255,2,2,1,17,0,8,8,7,5,181,184,100,25,255,215,
+-119,42,255,224,160,85,255,34,28,19,255,0,20,9,8,6,85,31,22,12,
+-255,166,87,23,255,189,97,22,255,99,60,22,255,15,13,8,170,0,28,4,
+-3,3,23,13,11,8,227,182,94,23,255,149,87,26,255,19,17,12,227,7,
+-7,7,23,0,16,15,13,10,170,216,170,97,255,229,179,114,255,228,182,109,
+-255,34,28,19,255,0,20,9,8,6,130,69,42,18,255,195,95,22,255,35,
+-24,12,255,5,5,4,76,0,104,10,9,7,28,27,24,16,184,32,27,19,
+-255,39,29,20,212,13,12,10,85,0,60,13,11,8,170,81,54,28,255,216,
+-148,67,255,223,161,72,255,220,147,61,255,117,76,32,255,13,11,8,255,44,
+-33,19,255,207,123,40,255,217,136,50,255,218,142,53,255,156,100,39,255,18,
+-15,11,227,10,8,7,28,0,12,15,13,8,125,19,14,10,170,14,11,7,
+-170,10,8,7,170,11,9,6,122,13,10,8,85,8,7,5,153,46,33,21,
+-255,212,138,51,255,221,151,68,255,191,132,62,255,19,17,12,176,0,12,7,
+-7,6,76,26,22,15,241,189,129,58,255,219,152,72,255,217,154,72,255,133,
+-87,38,255,15,13,10,221,6,6,5,28,0,8,15,12,8,113,20,16,11,
+-170,17,14,10,142,7,6,6,28,0,8,19,16,12,170,200,117,35,255,212,
+-123,37,255,115,74,30,255,9,8,6,113,0,8,12,11,9,178,104,73,37,
+-255,206,147,63,255,178,121,53,255,58,46,29,255,46,36,25,255,40,32,21,
+-252,19,17,12,85,0,36,12,10,9,164,191,131,60,255,223,161,80,255,221,
+-151,68,255,46,34,21,255,4,4,3,3,0,20,19,16,12,173,208,134,55,
+-255,223,156,70,255,216,160,81,255,21,19,14,255,0,16,6,5,5,25,17,
+-14,10,227,67,48,28,255,94,67,35,255,20,17,13,227,6,6,5,113,12,
+-11,9,198,67,51,30,255,85,62,32,255,25,20,14,255,9,8,6,82,0,
+-32,10,8,5,170,161,87,22,255,195,90,20,255,187,91,20,255,19,14,8,
+-255,0,28,15,12,8,119,20,16,11,170,17,14,10,156,10,8,7,28,0,
+-64,15,12,8,122,18,15,11,170,17,14,10,144,10,8,7,28,0,16,13,
+-12,10,170,157,96,36,255,211,123,38,255,199,116,34,255,31,24,16,255,6,
+-6,6,28,0,20,16,13,11,170,197,110,32,255,209,110,30,255,202,103,23,
+-255,58,36,15,255,8,7,5,113,0,8,10,8,5,85,137,68,18,255,185,
+-86,20,255,174,88,19,255,18,13,7,255,0,24,12,10,9,170,204,129,49,
+-255,220,144,63,255,217,133,50,255,26,20,13,255,0,28,7,6,6,76,23,
+-19,12,244,185,113,36,255,207,129,52,255,173,117,50,255,59,46,28,255,18,
+-15,13,198,9,9,8,113,6,6,6,11,0,24,15,12,8,133,22,17,11,
+-170,17,14,10,142,8,7,5,28,0,12,9,8,6,170,202,128,49,255,220,
+-148,63,255,219,140,56,255,22,19,13,255,0,8,12,10,9,170,200,125,37,
+-255,218,141,51,255,220,147,61,255,138,86,35,255,13,10,8,227,11,9,6,
+-170,13,11,8,198,61,41,22,255,202,111,31,255,204,105,25,255,200,105,21,
+-255,22,17,9,221,0,12,11,9,6,108,14,11,7,170,11,9,6,139,6,
+-5,3,17,0,12,9,7,6,133,144,75,19,255,185,86,20,255,178,86,19,
+-255,27,18,8,170,0,8,11,9,6,85,134,70,19,255,181,88,20,255,180,
+-87,19,255,24,15,7,178,0,12,10,8,5,99,165,86,22,255,206,111,27,
+-255,213,124,38,255,36,27,17,255,0,24,10,10,9,133,167,112,48,255,222,
+-166,77,255,223,157,72,255,54,39,23,255,5,5,4,37,0,20,13,11,8,
+-170,181,93,22,255,206,111,27,255,214,127,43,255,20,16,11,255,0,12,9,
+-8,8,170,203,129,50,255,222,145,63,255,220,147,61,255,33,26,16,255,0,
+-12,12,10,7,113,15,12,8,170,13,10,8,122,0,16,10,8,7,170,200,
+-120,41,255,220,142,59,255,219,146,60,255,27,21,14,255,0,12,13,11,8,
+-113,18,15,11,170,17,14,10,142,8,7,5,28,0,12,14,12,9,113,20,
+-15,11,170,17,14,10,153,10,8,7,28,0,16,9,8,6,85,29,21,10,
+-255,119,62,20,255,153,79,20,255,40,25,11,255,9,8,6,85,0,20,10,
+-8,7,28,32,24,13,218,68,47,25,255,61,43,24,255,61,46,28,255,61,
+-47,28,255,61,47,28,255,66,50,29,255,73,55,32,255,66,48,29,255,24,
+-20,15,85,0,20,7,6,6,79,32,26,17,244,199,132,54,255,208,150,75,
+-255,122,87,41,255,17,15,10,170,0,32,10,9,7,28,32,23,11,227,53,
+-33,14,255,34,23,11,255,12,10,7,190,6,5,5,28,0,20,9,7,4,
+-170,146,76,19,255,197,99,20,255,204,110,27,255,59,41,22,255,6,6,6,
+-170,10,9,9,113,31,26,18,184,30,25,17,255,29,25,18,255,34,27,19,
+-255,37,28,18,221,13,11,8,57,0,8,13,10,6,88,144,75,19,255,185,
+-86,20,255,178,90,19,255,20,14,7,212,0,12,9,7,4,125,157,81,20,
+-255,212,117,33,255,220,148,63,255,27,21,14,218,0,8,12,10,9,127,192,
+-111,31,255,208,112,27,255,202,103,23,255,22,16,9,204,0,12,10,8,5,
+-93,137,68,18,255,185,94,20,255,180,91,19,255,30,20,9,170,0,8,11,
+-9,6,85,140,67,19,255,202,106,21,255,214,125,39,255,25,20,14,255,0,
+-12,6,6,5,28,13,11,8,139,20,16,11,170,19,15,10,142,8,7,5,
+-28,0,8,10,9,5,142,153,79,20,255,195,90,20,255,206,111,27,255,24,
+-20,13,255,0,12,12,10,9,170,195,113,32,255,211,115,30,255,203,108,24,
+-255,31,21,10,173,0,8,11,9,6,85,140,70,19,255,185,86,20,255,180,
+-87,19,255,24,15,7,181,0,32,9,8,6,170,174,91,23,255,215,123,42,
+-255,221,150,66,255,25,20,14,255,0,32,9,7,4,170,148,77,19,255,181,
+-92,20,255,180,87,19,255,25,17,8,170,0,8,34,24,13,170,161,102,38,
+-255,219,154,70,255,220,142,59,255,213,124,38,255,32,24,13,198,0,8,11,
+-9,6,85,140,70,19,255,185,86,20,255,178,90,19,255,20,14,7,212,0,
+-12,8,7,5,127,144,78,19,255,185,86,20,255,180,87,19,255,29,19,10,
+-170,0,8,13,11,8,116,194,116,33,255,209,110,30,255,202,95,23,255,22,
+-17,9,221,0,12,10,8,5,85,12,9,5,170,10,8,5,130,6,5,3,
+-8,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,27,
+-18,8,170,0,8,11,8,6,85,137,68,18,255,185,86,20,255,200,105,21,
+-255,29,21,12,255,4,4,4,25,10,9,7,139,154,100,47,255,215,148,70,
+-255,198,131,45,255,46,34,19,255,11,9,6,88,0,12,10,8,5,119,144,
+-78,19,255,185,86,20,255,180,87,19,255,21,15,8,210,0,32,13,11,8,
+-170,199,119,39,255,220,144,63,255,221,155,70,255,27,21,14,255,0,20,10,
+-9,7,170,171,89,22,255,195,98,20,255,183,89,19,255,29,20,8,170,0,
+-8,11,9,6,85,139,70,20,255,202,103,23,255,211,118,36,255,28,21,13,
+-201,0,4,8,8,7,57,118,84,39,255,215,159,86,255,219,149,66,255,216,
+-129,45,255,211,121,34,255,34,25,13,178,0,8,11,10,6,88,146,76,19,
+-255,185,94,20,255,178,90,19,255,24,18,9,255,0,12,18,15,11,170,203,
+-122,42,255,215,126,40,255,209,106,30,255,32,22,13,184,0,8,12,10,7,
+-85,143,72,20,255,185,94,20,255,178,90,19,255,20,14,7,210,0,40,9,
+-7,4,170,148,77,19,255,180,87,19,255,178,86,19,255,30,21,9,255,5,
+-5,4,37,8,7,5,28,20,17,13,227,133,89,38,255,215,142,56,255,216,
+-129,45,255,209,115,32,255,26,19,11,210,0,8,11,9,6,85,142,74,19,
+-255,185,86,20,255,178,90,19,255,20,14,7,210,0,12,9,7,4,122,143,
+-75,20,255,203,108,24,255,216,129,45,255,30,23,15,255,0,12,12,10,7,
+-110,16,13,9,170,13,10,8,122,0,16,9,8,6,105,142,74,19,255,185,
+-86,20,255,180,87,19,255,23,16,8,255,0,24,15,13,10,170,203,122,42,
+-255,215,126,40,255,209,118,30,255,24,17,11,255,0,24,9,8,4,170,148,
+-77,19,255,181,92,20,255,180,87,19,255,23,16,8,198,0,12,9,7,6,
+-139,159,82,20,255,203,100,24,255,212,121,33,255,28,21,13,255,0,12,12,
+-11,9,119,81,59,34,255,216,153,71,255,173,117,50,255,21,18,14,255,10,
+-10,9,244,11,10,8,255,60,35,15,255,173,85,20,255,84,49,17,255,13,
+-10,6,170,0,12,10,8,5,130,146,79,19,255,193,89,20,255,203,104,24,
+-255,120,77,31,255,19,17,12,255,117,80,36,255,219,154,70,255,178,121,53,
+-255,20,17,13,255,45,33,18,255,184,94,21,255,195,90,20,255,205,106,26,
+-255,30,22,13,255,0,12,7,7,6,82,35,28,18,255,196,114,33,255,148,
+-80,25,255,32,22,11,255,20,15,9,255,26,18,9,255,88,49,17,255,149,
+-78,20,255,40,26,11,255,9,7,4,85,0,28,9,7,4,127,140,70,19,
+-255,181,88,20,255,180,87,19,255,18,13,7,235,0,24,10,9,7,93,104,
+-69,35,255,201,131,48,255,194,109,33,255,65,42,20,255,12,10,7,170,0,
+-36,9,7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,23,16,8,
+-198,0,32,15,14,10,198,188,133,61,255,219,149,66,255,194,115,37,255,17,
+-15,10,244,0,24,10,8,5,113,144,78,19,255,185,86,20,255,180,87,19,
+-255,18,13,7,255,0,140,7,6,4,65,53,31,12,255,162,83,19,255,185,
+-94,20,255,130,70,21,255,31,22,10,255,25,19,10,198,22,17,9,246,70,
+-40,15,255,169,87,20,255,200,105,21,255,212,123,37,255,28,21,13,221,0,
+-8,12,10,9,133,200,127,41,255,210,120,33,255,202,95,23,255,19,14,8,
+-238,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,28,
+-19,9,170,0,8,12,10,9,133,194,112,31,255,209,110,30,255,202,102,21,
+-255,21,15,8,235,0,16,9,7,4,57,12,10,5,88,10,8,5,85,0,
+-12,10,8,5,125,146,79,19,255,181,88,20,255,180,87,19,255,25,17,8,
+-195,0,12,10,8,5,119,144,78,19,255,185,94,20,255,200,105,21,255,23,
+-18,10,221,0,8,11,9,8,153,200,123,41,255,212,117,33,255,202,103,23,
+-255,111,63,20,255,27,20,10,255,20,16,9,246,22,17,9,249,28,20,9,
+-198,30,21,9,170,24,17,9,215,28,20,9,201,10,8,5,85,0,16,9,
+-7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,18,13,7,255,0,
+-16,11,10,8,113,152,104,47,255,214,134,49,255,204,105,25,255,98,54,19,
+-255,18,13,9,227,13,10,8,170,14,12,9,198,60,41,21,255,199,112,28,
+-255,202,102,21,255,202,103,23,255,26,19,11,204,0,8,12,11,9,116,187,
+-101,24,255,202,93,21,255,187,91,20,255,18,13,7,255,0,12,9,7,4,
+-170,146,79,19,255,181,88,20,255,178,90,19,255,27,17,8,170,0,8,11,
+-9,6,85,139,70,20,255,202,103,23,255,212,123,37,255,32,24,15,255,0,
+-24,13,12,10,170,196,114,33,255,206,106,25,255,196,99,21,255,28,19,9,
+-170,0,8,11,8,6,85,137,68,18,255,181,88,20,255,178,86,19,255,164,
+-85,21,255,138,73,21,255,175,93,20,255,178,86,19,255,46,28,11,255,6,
+-5,3,108,0,20,9,7,4,170,146,76,19,255,189,88,20,255,189,88,20,
+-255,28,19,9,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,178,
+-90,19,255,27,17,8,170,0,4,9,7,4,167,146,79,19,255,20,14,7,
+-252,0,4,11,9,6,85,137,68,18,255,185,94,20,255,178,90,19,255,27,
+-17,8,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,180,87,19,
+-255,18,13,7,255,0,12,9,7,4,170,146,79,19,255,185,94,20,255,183,
+-85,19,255,27,19,8,170,0,8,11,9,6,85,140,73,19,255,181,88,20,
+-255,178,90,19,255,20,15,7,255,0,12,16,14,11,170,208,143,59,255,223,
+-156,70,255,216,135,49,255,28,22,13,210,0,8,11,9,6,85,140,70,19,
+-255,185,94,20,255,178,90,19,255,72,39,13,255,10,8,5,218,8,6,3,
+-170,9,7,4,193,39,24,10,255,160,82,19,255,185,94,20,255,144,74,23,
+-255,16,13,9,170,0,8,10,9,7,85,145,101,48,255,218,149,67,255,210,
+-115,31,255,99,57,19,255,10,8,5,227,8,6,3,170,9,7,4,190,30,
+-20,9,255,158,81,19,255,185,94,20,255,178,90,19,255,27,17,8,170,0,
+-8,11,8,6,85,137,68,18,255,185,86,20,255,180,87,19,255,18,13,7,
+-255,0,44,9,9,8,28,13,12,8,142,27,20,10,170,29,21,10,193,24,
+-17,9,252,22,17,9,232,22,17,9,255,87,49,18,255,181,88,20,255,178,
+-90,19,255,100,54,17,255,11,10,6,150,0,16,9,7,4,170,146,79,19,
+-255,181,88,20,255,180,87,19,255,18,13,7,255,0,16,15,13,10,170,208,
+-141,55,255,223,156,70,255,217,133,50,255,23,19,12,255,0,12,10,8,5,
+-122,144,78,19,255,185,86,20,255,180,87,19,255,30,20,9,176,0,12,12,
+-10,7,85,39,26,12,255,155,80,20,255,99,55,19,255,19,16,12,255,12,
+-11,9,255,18,15,11,255,119,84,38,255,209,137,60,255,138,86,35,255,18,
+-15,11,178,0,12,10,8,5,130,144,78,19,255,181,92,20,255,178,90,19,
+-255,39,24,10,255,6,5,3,210,29,20,8,255,169,87,20,255,97,53,18,
+-255,8,7,5,255,26,21,15,255,212,142,59,255,221,151,68,255,218,142,53,
+-255,34,25,15,255,0,20,5,5,4,82,16,12,7,255,160,82,19,255,185,
+-86,20,255,185,86,20,255,52,29,11,255,7,6,4,170,0,20,8,7,5,
+-85,83,46,16,255,181,92,20,255,178,86,19,255,87,47,14,255,10,8,5,
+-224,8,6,3,170,9,7,4,190,29,20,8,255,195,104,24,255,217,136,50,
+-255,221,155,70,255,30,23,15,255,0,16,8,7,5,85,26,18,9,255,107,
+-59,20,255,151,80,22,255,60,34,15,255,11,9,6,170,0,36,8,7,5,
+-170,159,82,20,255,202,118,35,255,66,51,29,255,9,9,8,96,0,16,15,
+-13,10,170,208,140,59,255,223,156,70,255,215,133,44,255,27,20,12,255,0,
+-20,14,12,7,244,131,67,20,255,176,89,19,255,17,12,6,255,0,184,17,
+-14,10,85,171,95,28,255,206,123,33,255,208,123,31,255,207,112,28,255,202,
+-107,23,255,191,98,22,255,170,91,21,255,195,107,22,255,209,123,30,255,212,
+-132,37,255,214,134,39,255,211,133,40,255,202,121,35,255,29,21,12,164,0,
+-8,12,10,7,82,168,98,29,255,202,121,35,255,196,120,31,255,194,115,31,
+-255,190,115,27,255,185,101,26,255,184,100,25,255,199,107,26,255,208,123,31,
+-255,168,105,37,255,25,21,14,227,9,8,8,28,0,8,8,8,7,28,39,
+-30,18,249,183,122,42,255,211,133,40,255,210,133,43,255,161,106,41,255,15,
+-13,10,221,5,4,4,17,0,8,14,11,7,113,148,83,25,255,193,108,24,
+-255,180,93,23,255,27,18,10,153,0,8,12,9,7,122,144,78,19,255,180,
+-91,19,255,83,46,16,255,7,6,4,184,0,8,4,4,3,85,28,21,13,
+-255,202,121,35,255,209,132,42,255,131,87,36,255,10,9,7,255,5,5,5,
+-28,0,40,10,9,7,68,86,62,31,255,206,131,43,255,214,130,39,255,76,
+-50,25,255,7,6,6,113,0,16,5,5,4,28,21,17,12,255,202,121,35,
+-255,210,135,37,255,157,100,38,255,18,15,11,150,0,16,18,15,9,91,161,
+-88,24,255,105,64,28,255,11,10,8,170,0,12,8,7,7,85,40,28,17,
+-255,174,91,23,255,42,27,13,173,0,32,10,8,5,116,133,66,16,255,161,
+-85,17,255,161,78,17,255,25,16,8,221,0,24,15,12,8,119,170,99,29,
+-255,203,126,36,255,199,127,34,255,27,20,12,210,0,60,13,11,8,122,170,
+-99,29,255,204,127,37,255,199,119,34,255,27,20,12,198,0,12,4,4,3,
+-11,18,13,9,255,154,79,19,255,174,88,19,255,92,51,17,255,12,10,7,
+-198,0,24,11,9,6,147,142,74,19,255,171,90,18,255,159,81,18,255,17,
+-12,6,255,0,12,8,7,5,142,133,66,16,255,161,85,17,255,161,85,17,
+-255,21,14,6,215,0,24,10,9,7,198,190,107,25,255,203,104,24,255,196,
+-99,21,255,21,15,8,255,2,2,1,14,0,20,9,8,6,37,35,28,18,
+-255,183,112,36,255,212,132,37,255,178,118,41,255,27,23,16,255,5,5,4,
+-198,0,32,15,12,8,105,142,79,23,255,189,97,22,255,160,83,21,255,18,
+-13,7,218,0,12,10,8,7,198,196,114,33,255,214,129,37,255,212,132,37,
+-255,27,21,12,210,0,8,13,11,8,116,192,114,31,255,210,125,33,255,209,
+-123,30,255,203,113,26,255,177,91,22,255,159,82,20,255,160,83,21,255,165,
+-85,20,255,168,89,19,255,163,86,18,255,161,78,17,255,23,15,6,170,0,
+-8,9,7,4,57,99,48,14,255,142,73,17,255,133,66,16,255,19,13,6,
+-190,0,12,7,6,4,164,135,66,16,255,161,85,17,255,161,85,17,255,25,
+-16,6,170,0,8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17,
+-255,19,13,6,227,0,12,10,8,5,176,190,107,25,255,212,127,35,255,214,
+-134,39,255,30,21,13,255,0,24,12,10,7,170,194,109,33,255,213,132,36,
+-255,208,122,29,255,28,20,11,255,0,24,9,7,4,147,136,70,17,255,202,
+-98,21,255,211,126,34,255,27,20,12,255,3,3,2,28,0,8,10,8,7,
+-195,180,93,23,255,202,102,21,255,202,102,21,255,25,17,10,221,0,8,13,
+-11,8,65,129,70,22,255,172,88,21,255,144,78,19,255,22,15,7,176,0,
+-12,10,8,7,198,198,124,37,255,215,136,42,255,214,134,39,255,27,21,12,
+-212,0,8,12,10,7,79,151,88,26,255,198,116,29,255,192,109,27,255,25,
+-18,10,167,0,8,12,9,7,82,119,62,20,255,174,89,21,255,154,79,19,
+-255,22,15,7,181,0,20,5,5,4,68,20,14,7,249,142,73,17,255,143,
+-74,18,255,45,26,10,255,10,8,5,85,0,76,7,6,6,85,39,30,18,
+-255,196,121,41,255,213,135,42,255,115,72,30,255,10,9,7,170,0,40,5,
+-5,4,17,6,5,5,85,5,5,4,45,0,28,9,7,4,142,146,79,19,
+-255,204,108,23,255,212,126,33,255,30,22,13,255,3,3,3,40,0,36,10,
+-8,5,125,133,66,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0,
+-12,10,8,5,127,136,70,17,255,193,97,20,255,203,108,24,255,30,21,11,
+-193,0,8,13,10,6,85,134,70,19,255,171,90,18,255,159,81,18,255,17,
+-12,6,238,0,12,8,6,5,144,135,66,16,255,161,85,17,255,161,85,17,
+-255,23,15,6,170,0,8,10,7,5,85,133,66,16,255,185,94,20,255,209,
+-123,30,255,23,18,12,255,3,3,2,28,0,4,5,5,4,28,18,15,11,
+-227,134,72,21,255,158,81,19,255,143,74,18,255,22,15,7,142,0,8,10,
+-8,5,85,131,65,16,255,163,79,18,255,178,90,19,255,22,16,9,255,3,
+-2,2,20,0,8,9,7,6,176,144,78,19,255,175,88,18,255,163,79,18,
+-255,26,16,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,
+-78,17,255,19,13,6,229,0,32,8,7,5,156,144,78,19,255,202,102,21,
+-255,206,111,27,255,27,20,12,255,0,32,10,8,5,133,135,66,16,255,161,
+-85,17,255,161,85,17,255,19,13,6,227,0,12,8,7,5,255,172,85,21,
+-255,189,92,20,255,172,87,19,255,24,16,7,170,0,8,10,8,5,85,129,
+-64,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0,12,10,8,5,
+-127,135,66,16,255,161,85,17,255,161,85,17,255,26,16,7,170,0,8,11,
+-9,6,85,134,70,19,255,171,90,18,255,159,78,18,255,23,15,6,170,0,
+-8,9,7,4,57,98,49,13,255,139,71,16,255,133,66,16,255,19,13,6,
+-193,0,12,7,6,4,176,133,66,16,255,161,85,17,255,161,85,17,255,23,
+-15,6,170,0,8,10,8,5,85,129,64,16,255,165,87,18,255,180,91,19,
+-255,20,15,9,255,0,4,5,5,4,17,26,21,15,227,126,75,25,255,178,
+-95,21,255,142,74,19,255,46,28,11,255,10,8,5,57,0,8,10,8,5,
+-85,131,65,16,255,161,85,17,255,161,85,17,255,17,12,6,252,2,1,1,
+-8,0,28,13,11,8,170,199,119,34,255,215,136,42,255,214,139,41,255,28,
+-20,13,255,0,20,8,7,5,170,135,66,16,255,161,85,17,255,161,85,17,
+-255,23,15,6,170,0,8,10,8,5,85,131,67,16,255,202,102,21,255,211,
+-127,36,255,22,17,11,249,0,8,16,14,11,201,101,67,28,255,191,98,22,
+-255,185,94,20,255,172,87,19,255,26,17,7,170,0,8,10,8,5,85,129,
+-64,16,255,161,85,17,255,161,85,17,255,31,20,8,255,5,5,4,102,0,
+-4,5,4,4,28,16,13,9,255,164,85,21,255,180,91,19,255,165,87,18,
+-255,26,17,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,
+-85,17,255,19,13,6,212,0,40,10,8,5,133,135,66,16,255,161,85,17,
+-255,161,85,17,255,26,17,7,255,3,3,2,136,9,7,4,227,131,67,20,
+-255,197,104,22,255,198,104,21,255,183,93,19,255,172,87,19,255,26,17,7,
+-170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,19,
+-13,6,212,0,12,10,8,5,127,135,66,16,255,193,97,20,255,209,123,30,
+-255,19,15,10,252,0,8,13,11,8,65,125,68,22,255,174,86,21,255,146,
+-76,19,255,22,14,7,178,0,12,8,6,5,144,135,66,16,255,161,85,17,
+-255,161,85,17,255,19,14,6,238,0,24,13,11,8,170,163,87,20,255,180,
+-91,19,255,165,87,18,255,17,12,6,255,0,24,9,7,4,139,135,66,16,
+-255,161,85,17,255,161,85,17,255,15,11,6,246,0,12,9,7,6,184,180,
+-93,23,255,211,115,30,255,213,133,38,255,28,20,13,255,0,16,12,11,9,
+-170,152,91,31,255,188,105,31,255,115,66,22,255,91,50,16,255,84,46,15,
+-255,116,59,17,255,118,62,17,255,15,11,6,221,0,16,10,8,5,116,146,
+-79,19,255,202,103,23,255,209,128,32,255,200,127,41,255,167,106,40,255,197,
+-122,42,255,210,130,35,255,186,106,27,255,88,51,19,255,102,55,17,255,157,
+-83,18,255,189,92,20,255,209,123,30,255,29,21,12,224,0,8,7,6,6,
+-28,41,31,18,235,160,84,23,255,170,87,19,255,45,26,10,255,5,5,4,
+-170,4,4,4,8,4,4,3,99,15,12,6,255,140,72,17,255,138,71,17,
+-255,45,26,10,255,10,8,5,85,0,24,8,7,5,142,133,66,16,255,161,
+-85,17,255,161,85,17,255,19,13,6,229,0,24,13,11,8,170,160,86,21,
+-255,185,90,20,255,91,50,16,255,7,6,4,255,0,40,8,7,5,150,133,
+-66,16,255,161,85,17,255,161,85,17,255,15,11,6,246,0,32,8,8,7,
+-110,74,52,27,255,191,103,24,255,176,89,19,255,34,22,9,255,6,5,3,
+-57,0,20,8,6,5,161,133,66,16,255,161,85,17,255,161,78,17,255,15,
+-11,6,252,0,140,12,10,5,85,123,61,16,255,161,85,17,255,161,85,17,
+-255,22,15,7,255,2,2,1,85,0,8,7,6,4,244,133,66,16,255,167,
+-88,18,255,189,92,20,255,27,19,10,195,0,8,12,10,7,110,160,83,21,
+-255,177,85,18,255,161,78,17,255,15,11,6,252,0,12,7,6,4,161,133,
+-66,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0,8,11,9,6,
+-85,134,70,19,255,171,90,18,255,159,78,18,255,15,11,6,249,0,12,10,
+-8,5,85,98,49,13,255,135,72,16,255,133,66,16,255,19,13,6,139,0,
+-8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17,255,15,11,6,
+-246,0,12,7,6,4,164,133,66,16,255,165,87,18,255,178,90,19,255,24,
+-17,9,212,0,8,13,11,8,105,165,86,22,255,180,91,19,255,159,81,18,
+-255,19,14,6,255,2,2,1,79,0,44,8,6,5,167,133,66,16,255,161,
+-85,17,255,161,85,17,255,15,11,6,252,0,16,7,6,6,28,24,19,13,
+-227,103,59,20,255,157,83,18,255,154,78,17,255,150,81,19,255,154,79,19,
+-255,158,81,19,255,162,83,19,255,161,85,17,255,159,81,18,255,163,86,18,
+-255,27,18,8,170,0,8,11,9,6,85,131,67,16,255,165,87,18,255,161,
+-85,17,255,15,11,6,252,0,12,8,6,5,167,133,66,16,255,161,85,17,
+-255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,131,65,16,255,175,
+-88,18,255,191,96,20,255,25,18,10,255,0,24,11,9,6,170,148,77,19,
+-255,169,82,18,255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,129,
+-64,16,255,161,85,17,255,161,85,17,255,87,47,14,255,23,17,8,255,65,
+-34,12,255,150,76,17,255,132,68,17,255,41,25,10,255,10,8,5,85,0,
+-16,8,7,5,150,133,66,16,255,161,85,17,255,161,78,17,255,23,15,6,
+-170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23,
+-15,6,170,0,4,8,7,5,153,133,66,16,255,19,13,6,238,0,4,10,
+-8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0,
+-8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,15,11,6,
+-252,0,12,8,6,5,167,133,66,16,255,161,85,17,255,161,85,17,255,23,
+-15,6,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,
+-255,31,20,8,255,5,4,4,85,0,4,5,4,4,40,17,14,10,255,200,
+-120,35,255,207,112,28,255,195,98,20,255,29,20,8,170,0,8,10,8,5,
+-85,131,65,16,255,163,86,18,255,159,81,18,255,150,76,17,255,137,70,16,
+-255,135,72,16,255,135,66,16,255,146,75,17,255,159,81,18,255,131,67,20,
+-255,42,31,17,255,10,9,7,62,0,8,5,5,4,8,26,21,15,227,137,
+-79,28,255,174,88,19,255,158,83,17,255,137,70,16,255,135,72,16,255,135,
+-66,16,255,146,75,17,255,159,81,18,255,161,85,17,255,161,85,17,255,23,
+-15,6,170,0,8,10,8,5,85,131,67,16,255,163,86,18,255,159,81,18,
+-255,17,12,6,255,0,68,2,1,1,8,7,6,4,249,137,67,16,255,165,
+-80,18,255,154,78,17,255,27,18,8,170,0,16,8,6,5,167,133,66,16,
+-255,161,85,17,255,161,85,17,255,15,11,6,252,0,16,13,11,8,170,199,
+-124,36,255,211,125,32,255,200,105,21,255,18,13,7,255,0,12,7,6,4,
+-164,133,66,16,255,161,85,17,255,161,78,17,255,19,13,6,227,0,16,8,
+-7,5,122,68,38,13,255,150,83,23,255,174,107,35,255,181,112,38,255,190,
+-117,39,255,193,114,36,255,143,84,26,255,15,12,8,212,4,4,3,6,0,
+-12,10,8,5,108,135,66,16,255,161,85,17,255,161,85,17,255,125,65,16,
+-255,90,47,13,255,121,60,16,255,164,84,19,255,189,97,22,255,177,104,32,
+-255,194,123,39,255,212,134,41,255,210,124,31,255,200,105,21,255,23,17,8,
+-218,0,16,10,8,5,167,56,31,11,255,110,55,15,255,118,62,17,255,115,
+-58,16,255,115,58,16,255,120,63,17,255,95,46,14,255,17,13,6,227,7,
+-6,4,28,0,16,14,12,7,227,87,43,14,255,154,78,17,255,152,77,17,
+-255,139,71,16,255,135,72,16,255,135,66,16,255,146,75,17,255,200,105,21,
+-255,211,127,36,255,214,134,39,255,23,18,12,255,0,12,7,6,4,85,26,
+-16,7,255,131,67,16,255,145,75,18,255,78,43,15,255,7,6,4,255,0,
+-40,10,8,5,136,157,81,20,255,210,129,33,255,139,89,36,255,10,9,7,
+-198,0,16,13,11,8,170,196,113,31,255,206,114,25,255,189,92,20,255,18,
+-13,7,244,0,16,5,4,4,88,27,19,8,255,141,73,18,255,161,85,17,
+-255,21,14,6,218,0,112,12,9,7,99,11,8,6,170,10,8,5,91,0,
+-60,11,10,8,28,32,23,13,227,108,57,19,255,153,82,18,255,154,78,17,
+-255,146,75,17,255,97,47,14,255,36,24,11,255,108,64,25,255,203,111,30,
+-255,207,118,32,255,207,118,32,255,189,110,32,255,63,41,20,255,15,12,8,
+-76,0,8,9,8,6,28,38,27,15,218,51,33,18,255,48,32,17,255,131,
+-74,24,255,182,97,21,255,176,89,19,255,170,87,19,255,134,72,21,255,37,
+-25,14,255,15,13,8,144,7,7,6,28,0,12,11,9,8,127,171,99,28,
+-255,208,123,31,255,203,124,30,255,104,63,27,255,15,13,10,212,7,6,6,
+-28,0,12,14,11,7,170,142,74,19,255,161,85,17,255,159,81,18,255,27,
+-18,8,184,0,8,6,5,3,28,27,17,8,227,92,46,13,255,111,55,14,
+-255,31,20,8,255,8,6,3,198,9,7,4,170,10,8,5,227,22,16,9,
+-255,61,39,18,255,107,64,26,255,108,66,25,255,32,22,11,255,9,7,6,
+-170,0,44,10,9,7,156,56,36,19,255,191,114,32,255,175,98,30,255,41,
+-27,16,255,11,9,6,57,0,12,21,15,10,227,100,56,21,255,160,83,21,
+-255,80,44,17,255,14,12,7,190,7,6,6,28,0,16,13,10,6,28,29,
+-20,10,212,21,15,10,144,0,20,12,9,7,85,39,24,10,173,16,12,7,
+-85,0,32,6,5,3,20,19,13,6,173,21,14,6,255,21,15,6,215,10,
+-8,5,85,0,24,15,12,8,170,190,98,23,255,203,108,24,255,202,111,23,
+-255,23,17,10,255,0,60,17,13,10,170,195,112,30,255,211,124,30,255,205,
+-106,26,255,31,21,12,255,0,12,8,6,5,139,44,25,9,255,135,72,16,
+-255,104,54,13,255,15,11,6,249,7,6,4,28,0,24,7,6,4,57,44,
+-25,9,255,137,73,16,255,143,70,16,255,49,25,8,255,8,6,3,184,8,
+-6,3,85,8,6,3,142,23,16,6,255,130,66,15,255,145,77,16,255,87,
+-44,12,255,10,8,5,142,0,20,11,9,8,164,53,31,14,255,150,74,19,
+-255,154,78,17,255,148,76,17,255,65,33,10,255,10,8,5,184,6,5,5,
+-28,0,16,11,9,6,142,175,102,30,255,207,123,32,255,208,114,31,255,196,
+-114,33,255,89,56,26,255,17,13,10,255,11,8,6,170,9,7,6,170,11,
+-8,6,170,15,11,8,170,18,13,9,142,8,6,5,28,0,8,10,8,5,
+-93,102,53,17,255,159,81,18,255,154,78,17,255,72,37,11,255,11,8,6,
+-227,9,7,6,170,11,8,6,198,61,36,20,255,196,107,27,255,204,114,27,
+-255,182,102,31,255,19,14,10,170,0,8,6,6,5,20,26,19,11,198,28,
+-20,11,255,22,16,9,255,23,16,8,255,27,18,8,255,24,16,7,255,24,
+-16,7,255,74,39,11,255,139,68,16,255,143,70,16,255,143,70,16,255,20,
+-13,5,170,0,8,7,6,4,74,87,44,12,255,155,79,18,255,151,73,16,
+-255,67,34,10,255,9,7,4,198,9,7,4,96,8,6,5,159,27,17,8,
+-255,137,67,16,255,158,80,17,255,112,56,15,255,10,8,5,167,0,8,7,
+-5,4,85,74,36,11,255,150,83,17,255,145,77,16,255,55,29,10,255,8,
+-6,3,198,8,6,3,88,7,6,4,153,39,24,12,255,199,112,28,255,210,
+-115,31,255,184,108,33,255,17,14,10,198,0,24,11,9,6,170,139,69,18,
+-255,168,86,19,255,154,78,17,255,17,12,6,235,0,24,7,6,4,85,64,
+-32,11,255,162,80,19,255,198,96,21,255,109,63,26,255,15,11,8,227,10,
+-8,7,170,8,7,5,195,29,18,8,255,137,67,16,255,154,78,17,255,114,
+-59,15,255,11,10,6,164,0,8,9,7,6,85,97,50,16,255,159,81,18,
+-255,152,77,17,255,74,36,11,255,10,8,5,198,7,6,4,125,10,8,5,
+-198,61,36,20,255,200,105,29,255,209,122,28,255,180,104,29,255,16,12,9,
+-170,0,8,12,10,7,170,160,83,21,255,183,89,19,255,174,88,19,255,28,
+-19,9,187,0,8,14,10,7,85,143,75,20,255,195,98,20,255,189,92,20,
+-255,21,15,8,224,0,24,7,6,4,85,26,16,7,255,111,55,14,255,132,
+-67,15,255,39,23,8,255,8,6,3,113,0,68,9,7,6,85,32,22,13,
+-255,188,112,31,255,193,114,30,255,94,57,25,255,17,13,10,170,0,44,9,
+-7,4,142,10,8,5,255,10,8,5,198,6,5,3,28,0,24,8,7,5,
+-85,88,48,19,255,204,114,27,255,208,118,31,255,111,62,26,255,11,8,6,
+-227,8,7,5,150,10,8,5,116,10,8,5,88,9,7,4,85,6,5,3,
+-74,0,16,10,8,5,99,114,56,13,255,143,70,16,255,143,70,16,255,18,
+-12,5,215,0,12,8,7,3,130,118,60,13,255,148,76,17,255,150,76,17,
+-255,24,16,7,170,0,8,9,7,4,85,114,56,13,255,145,74,16,255,143,
+-70,16,255,52,28,9,255,8,6,3,198,8,6,3,88,8,6,3,144,23,
+-15,6,255,130,66,15,255,151,80,16,255,111,55,14,255,10,8,5,144,0,
+-8,6,5,3,59,59,32,10,255,157,83,18,255,185,90,20,255,97,54,22,
+-255,14,10,7,227,13,10,6,170,13,10,6,255,84,41,13,255,148,76,17,
+-255,155,82,18,255,135,66,16,255,14,10,5,159,0,8,9,7,4,85,114,
+-56,13,255,145,77,16,255,145,74,16,255,55,28,10,255,9,7,4,198,8,
+-6,3,93,8,6,3,147,25,16,6,255,130,64,15,255,151,80,16,255,111,
+-55,14,255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,145,77,16,
+-255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3,102,8,6,3,
+-139,8,6,3,170,9,8,4,113,0,12,10,8,5,91,114,56,13,255,150,
+-76,17,255,150,76,17,255,17,12,6,252,0,32,7,6,4,85,64,33,11,
+-255,145,77,16,255,143,70,16,255,56,29,9,255,8,6,3,198,8,6,3,
+-85,6,5,3,119,14,11,5,255,128,66,15,255,151,73,16,255,143,76,16,
+-255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,
+-70,16,255,18,12,5,215,0,12,8,7,3,130,114,56,13,255,143,70,16,
+-255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,
+-70,16,255,143,70,16,255,20,13,5,170,0,8,7,6,4,71,87,44,12,
+-255,158,87,17,255,161,85,17,255,103,53,20,255,15,11,8,227,10,8,7,
+-170,10,8,7,195,33,20,10,255,137,67,16,255,151,73,16,255,111,55,14,
+-255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,146,
+-75,17,255,18,13,7,255,0,8,7,6,6,74,24,16,7,255,132,67,15,
+-255,145,77,16,255,135,72,16,255,14,10,5,170,0,8,9,7,4,85,114,
+-56,13,255,145,77,16,255,143,70,16,255,58,31,11,255,11,8,6,227,11,
+-9,6,170,11,8,6,170,10,7,5,170,9,8,4,113,0,12,11,9,6,
+-161,175,92,24,255,203,108,24,255,198,101,23,255,25,18,10,255,0,20,8,
+-6,3,147,114,56,13,255,143,70,16,255,143,70,16,255,20,13,5,170,0,
+-8,9,7,4,85,114,56,13,255,170,87,19,255,199,106,24,255,24,17,11,
+-255,0,8,6,6,5,28,15,12,6,255,128,66,15,255,145,74,16,255,143,
+-70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145,77,16,
+-255,143,70,16,255,90,44,13,255,19,13,6,255,10,8,5,255,13,10,6,
+-255,62,33,11,255,135,72,16,255,151,73,16,255,108,53,13,255,10,8,5,
+-142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18,
+-12,5,215,0,40,7,6,4,85,64,33,11,255,145,77,16,255,143,70,16,
+-255,67,34,10,255,14,10,5,255,49,27,9,255,140,72,17,255,160,85,19,
+-255,160,85,19,255,110,55,15,255,31,20,8,255,9,7,4,57,0,8,9,
+-8,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18,12,5,215,0,
+-12,8,7,3,136,118,60,13,255,154,75,17,255,172,87,19,255,24,17,9,
+-204,0,8,8,7,5,85,95,49,16,255,161,85,17,255,152,77,17,255,71,
+-34,10,255,9,7,4,198,8,6,3,88,8,6,3,142,23,15,6,255,130,
+-66,15,255,151,80,16,255,111,55,14,255,14,10,5,170,0,24,9,7,4,
+-164,118,56,15,255,145,74,16,255,143,70,16,255,16,12,5,224,0,24,9,
+-7,4,85,85,43,12,255,151,80,16,255,143,70,16,255,55,29,10,255,8,
+-6,3,198,8,6,3,93,8,6,5,173,45,27,14,255,199,112,28,255,210,
+-124,31,255,199,119,34,255,19,15,10,221,0,20,13,11,8,170,46,28,11,
+-255,131,65,16,255,145,74,16,255,137,67,16,255,70,35,11,255,12,10,5,
+-224,7,6,4,28,0,16,8,6,5,34,37,25,14,255,181,100,28,255,206,
+-113,31,255,207,123,32,255,199,119,34,255,107,67,28,255,28,20,11,255,28,
+-19,9,255,84,41,13,255,141,75,16,255,145,74,16,255,159,82,20,255,88,
+-53,25,255,13,11,8,99,0,8,13,10,6,85,114,60,17,255,148,76,17,
+-255,143,70,16,255,21,14,6,255,0,12,10,8,5,170,119,61,14,255,145,
+-77,16,255,135,72,16,255,19,13,6,170,0,24,8,7,3,142,114,56,13,
+-255,143,70,16,255,143,70,16,255,16,12,5,218,0,24,11,8,6,170,126,
+-62,15,255,151,80,16,255,112,57,13,255,19,13,6,255,8,6,3,144,8,
+-6,3,85,9,7,4,113,8,6,3,167,8,6,3,170,8,6,3,170,9,
+-8,4,113,0,12,10,8,5,91,114,56,13,255,145,74,16,255,143,70,16,
+-255,61,32,10,255,9,8,4,170,0,32,12,10,7,207,74,36,11,255,139,
+-74,16,255,79,40,12,255,10,8,5,210,0,16,9,7,4,85,27,17,6,
+-255,130,66,15,255,143,70,16,255,143,76,16,255,16,12,5,221,0,140,8,
+-6,3,85,74,39,11,255,145,77,16,255,143,70,16,255,41,23,8,255,7,
+-6,4,173,5,5,2,85,6,5,3,113,14,10,5,255,129,65,14,255,145,
+-74,16,255,145,74,16,255,24,16,7,170,0,8,10,8,5,85,112,57,13,
+-255,145,77,16,255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3,
+-88,8,6,3,144,23,15,6,255,130,66,15,255,151,80,16,255,111,55,14,
+-255,10,8,5,144,0,8,6,5,3,59,63,34,10,255,145,77,16,255,143,
+-70,16,255,55,29,10,255,8,6,3,198,8,6,3,85,8,6,3,144,32,
+-19,7,255,139,74,16,255,155,79,18,255,135,66,16,255,14,10,5,170,0,
+-8,6,5,3,57,57,31,10,255,145,77,16,255,143,70,16,255,55,29,10,
+-255,8,6,3,198,8,6,3,88,8,6,3,144,21,15,6,255,130,66,15,
+-255,143,76,16,255,146,75,17,255,24,15,7,184,0,8,7,6,4,71,66,
+-33,11,255,148,79,17,255,143,70,16,255,45,25,8,255,7,5,4,176,7,
+-5,4,85,8,6,3,85,9,7,4,85,8,6,3,82,0,28,8,7,3,
+-136,114,56,13,255,143,70,16,255,143,70,16,255,16,12,5,221,0,20,7,
+-6,4,28,10,8,5,130,19,13,6,170,29,19,8,173,24,16,7,212,27,
+-18,8,193,20,13,7,246,55,29,10,255,139,74,16,255,143,70,16,255,143,
+-70,16,255,18,13,5,170,0,8,9,7,4,85,115,54,14,255,143,70,16,
+-255,143,70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143,
+-70,16,255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,
+-255,145,74,16,255,145,74,16,255,17,11,6,252,0,24,10,8,5,170,119,
+-61,14,255,145,74,16,255,143,70,16,255,18,13,5,170,0,8,9,7,4,
+-85,114,56,13,255,143,70,16,255,143,70,16,255,33,20,8,255,5,4,4,
+-195,8,6,5,198,46,26,9,255,126,62,15,255,132,67,15,255,35,22,8,
+-255,9,7,4,93,0,12,10,8,5,93,114,56,13,255,143,70,16,255,143,
+-70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,
+-255,143,70,16,255,20,13,5,170,0,4,9,7,4,125,114,56,13,255,21,
+-13,6,210,0,4,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16,
+-255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,
+-70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143,70,16,
+-255,143,70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145,
+-77,16,255,143,70,16,255,90,44,13,255,17,12,6,255,12,9,5,255,20,
+-15,9,255,97,51,20,255,169,87,20,255,161,85,17,255,112,54,15,255,10,
+-8,5,142,0,8,9,7,4,85,121,60,16,255,174,88,19,255,176,89,19,
+-255,112,59,17,255,37,23,10,255,26,16,7,255,25,18,8,255,24,15,7,
+-255,23,16,8,255,18,13,9,198,10,9,7,99,0,16,9,8,6,34,12,
+-10,7,167,20,14,7,210,21,15,6,255,26,17,7,255,24,16,7,255,26,
+-17,7,255,70,35,11,255,142,73,17,255,148,76,17,255,152,77,17,255,24,
+-15,7,170,0,8,13,10,6,96,129,65,18,255,170,87,19,255,170,87,19,
+-255,24,16,9,255,0,48,5,4,2,76,8,6,3,85,8,6,3,85,8,
+-6,3,85,7,5,4,85,6,5,3,119,16,11,5,255,129,65,14,255,151,
+-73,16,255,118,61,15,255,14,10,5,170,0,16,8,7,3,136,114,56,13,
+-255,143,70,16,255,143,70,16,255,16,12,5,221,0,16,10,8,7,113,109,
+-67,26,255,184,90,21,255,148,76,17,255,52,28,9,255,8,6,3,198,8,
+-6,3,88,8,6,3,144,21,15,6,255,130,66,15,255,143,76,16,255,143,
+-76,16,255,16,12,5,227,0,20,9,8,6,170,67,42,20,255,202,124,31,
+-255,208,128,33,255,205,106,26,255,104,58,21,255,14,11,7,218,6,5,5,
+-28,0,16,7,6,4,28,27,17,8,229,102,51,13,255,139,68,16,255,143,
+-73,16,255,145,74,16,255,71,37,12,255,26,18,9,255,80,50,23,255,204,
+-122,33,255,208,115,33,255,202,104,25,255,149,78,20,255,52,30,11,255,10,
+-8,5,85,0,12,14,10,5,170,85,43,12,255,137,73,16,255,77,39,12,
+-255,14,10,5,227,10,8,5,170,10,8,5,198,46,26,9,255,137,73,16,
+-255,115,59,14,255,25,16,6,232,8,6,3,31,0,12,6,5,3,28,10,
+-8,5,119,19,13,6,170,29,19,8,173,26,16,7,210,27,18,8,187,17,
+-12,6,246,58,30,11,255,151,77,18,255,192,97,21,255,192,97,21,255,24,
+-16,9,207,0,8,4,4,3,3,25,16,6,235,115,59,14,255,143,73,16,
+-255,145,77,16,255,108,53,13,255,21,14,6,255,7,6,4,164,10,7,5,
+-85,8,7,5,147,9,7,4,136,8,6,5,76,0,20,8,6,5,57,58,
+-33,13,255,188,107,27,255,192,111,31,255,85,51,24,255,18,13,9,187,6,
+-5,5,20,0,8,11,9,6,156,139,69,18,255,158,83,17,255,148,76,17,
+-255,23,15,6,170,0,12,9,7,4,85,19,13,6,255,102,51,13,255,128,
+-66,15,255,81,41,12,255,12,9,5,142,0,108,13,10,8,85,115,60,24,
+-255,162,75,23,255,121,60,20,255,23,15,8,142,0,60,3,3,2,6,10,
+-8,5,170,93,48,12,255,123,65,14,255,123,60,14,255,14,10,5,227,3,
+-3,2,85,12,10,7,170,163,83,24,255,199,99,26,255,193,96,24,255,41,
+-26,14,227,6,6,5,45,0,24,3,3,2,28,11,8,6,170,106,50,13,
+-255,129,63,14,255,129,63,14,255,29,18,8,227,6,5,5,31,0,20,13,
+-10,8,136,144,73,21,255,182,89,21,255,99,55,19,255,14,11,7,187,4,
+-4,3,3,0,16,9,7,4,113,93,46,12,255,131,66,14,255,121,62,14,
+-255,16,11,5,170,0,12,7,6,4,28,14,10,5,227,100,50,13,255,110,
+-59,13,255,103,52,14,255,121,59,18,255,134,69,21,255,32,21,11,255,6,
+-5,5,198,10,8,7,227,46,28,13,255,104,51,15,255,96,46,13,255,14,
+-10,5,139,0,44,10,8,7,108,63,37,18,255,176,88,23,255,160,80,21,
+-255,20,14,9,170,0,8,8,6,5,79,85,41,12,255,131,65,16,255,66,
+-34,11,255,10,8,5,170,0,144,9,7,4,167,115,56,16,255,165,85,20,
+-255,112,65,23,255,18,13,9,142,0,60,13,10,8,142,132,68,21,255,162,
+-80,19,255,141,70,18,255,17,12,6,181,0,12,17,12,6,255,103,54,14,
+-255,130,66,15,255,31,20,8,255,6,5,3,113,0,32,8,6,3,156,35,
+-22,8,255,114,58,13,255,110,59,13,255,88,45,11,255,88,42,11,255,92,
+-47,11,255,104,54,13,255,119,58,14,255,61,32,10,255,10,8,5,224,5,
+-4,4,20,0,16,11,8,6,85,113,58,22,255,180,90,23,255,140,69,17,
+-255,123,63,14,255,123,60,14,255,119,56,14,255,120,61,17,255,24,15,9,
+-167,0,16,12,10,7,133,180,88,27,255,203,107,30,255,199,100,28,255,197,
+-104,28,255,191,93,28,255,167,78,24,255,132,68,21,255,121,62,18,255,117,
+-60,18,255,118,57,17,255,108,50,15,255,17,12,6,113,0,12,14,10,5,
+-227,65,33,10,255,115,59,14,255,115,59,14,255,109,52,14,255,116,57,17,
+-255,121,59,18,255,139,68,20,255,154,73,19,255,115,62,20,255,33,23,12,
+-255,9,8,6,71,0,36,2,2,1,8,8,6,3,170,93,50,12,255,125,
+-64,14,255,123,60,14,255,14,10,5,159,0,12,14,10,5,224,65,33,10,
+-255,115,59,14,255,115,59,14,255,109,52,14,255,119,61,18,255,129,66,20,
+-255,148,75,21,255,170,84,21,255,129,67,22,255,37,25,14,255,8,7,5,
+-57,0,8,5,5,4,23,24,17,9,255,103,54,18,255,132,63,17,255,120,
+-62,15,255,98,49,13,255,90,45,11,255,94,45,13,255,124,60,17,255,172,
+-81,21,255,150,78,25,255,44,29,17,255,9,8,6,91,0,24,8,7,3,
+-102,93,46,12,255,125,64,14,255,121,62,14,255,18,12,5,170,0,28,12,
+-10,5,227,64,33,11,255,132,66,17,255,158,79,21,255,151,70,22,255,130,
+-67,21,255,110,53,15,255,108,53,13,255,118,60,13,255,85,43,12,255,21,
+-14,6,255,7,6,4,57,0,12,14,10,5,227,65,33,10,255,131,65,16,
+-255,149,72,20,255,133,68,20,255,111,54,16,255,110,53,15,255,138,72,19,
+-255,163,81,20,255,112,58,19,255,28,20,9,255,8,7,5,57,0,8,9,
+-7,4,91,96,48,13,255,132,70,15,255,123,60,14,255,14,10,5,161,0,
+-8,13,10,6,85,148,73,23,255,202,101,27,255,129,67,26,255,18,13,9,
+-142,0,28,6,5,3,48,17,12,6,227,108,55,13,255,112,55,13,255,35,
+-22,8,255,9,7,4,57,0,64,32,22,13,255,137,68,22,255,154,73,19,
+-255,45,26,10,255,8,6,5,144,0,44,8,6,3,68,67,34,10,255,115,
+-56,16,255,109,52,14,255,16,11,5,147,0,24,5,4,4,11,22,17,11,
+-227,129,76,28,255,195,95,28,255,186,84,23,255,121,59,18,255,107,51,14,
+-255,96,46,13,255,90,45,11,255,88,45,11,255,41,24,8,255,12,10,5,
+-176,0,12,8,6,3,76,88,44,11,255,125,66,14,255,123,60,14,255,18,
+-12,5,170,0,12,9,7,4,85,92,47,11,255,125,64,14,255,123,60,14,
+-255,16,11,5,150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123,
+-60,14,255,114,58,13,255,93,50,12,255,88,44,11,255,92,47,11,255,104,
+-54,13,255,119,58,14,255,85,43,12,255,21,15,6,255,7,6,4,51,0,
+-12,12,10,5,221,61,32,10,255,120,62,15,255,123,61,16,255,109,52,14,
+-255,96,46,13,255,102,51,13,255,115,59,14,255,123,65,14,255,85,43,12,
+-255,25,16,6,255,7,6,4,51,0,8,8,6,3,74,88,45,11,255,125,
+-64,14,255,123,60,14,255,114,58,13,255,93,50,12,255,88,45,11,255,92,
+-47,11,255,104,52,13,255,118,60,13,255,85,43,12,255,21,15,6,255,7,
+-5,4,40,0,8,8,6,3,74,88,45,11,255,125,64,14,255,123,60,14,
+-255,114,58,13,255,93,50,12,255,88,45,11,255,92,43,11,255,93,50,12,
+-255,93,50,12,255,20,13,5,85,0,8,8,6,3,65,88,45,11,255,125,
+-64,14,255,121,62,14,255,18,13,5,170,0,36,12,10,5,227,59,31,10,
+-255,115,62,14,255,114,58,13,255,93,50,12,255,88,44,11,255,88,44,11,
+-255,104,54,13,255,118,60,13,255,123,60,14,255,123,60,14,255,14,10,5,
+-150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18,
+-12,5,170,0,12,9,7,4,85,92,47,11,255,125,66,14,255,123,65,14,
+-255,14,10,5,150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123,
+-65,14,255,14,10,5,159,0,12,14,10,5,221,70,35,11,255,155,74,20,
+-255,193,89,26,255,185,91,28,255,172,85,27,255,165,80,24,255,155,78,22,
+-255,132,66,17,255,90,44,13,255,21,15,6,255,7,5,4,40,0,8,8,
+-6,3,74,88,45,11,255,125,64,14,255,121,62,14,255,19,13,6,176,0,
+-12,9,6,4,133,93,50,12,255,131,66,14,255,123,65,14,255,14,11,5,
+-150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123,60,14,255,118,
+-56,15,255,120,61,17,255,136,67,21,255,118,57,17,255,96,48,13,255,92,
+-47,11,255,18,12,5,85,0,8,9,7,4,79,104,51,15,255,140,66,17,
+-255,135,66,16,255,17,12,6,198,0,20,9,7,4,85,92,47,11,255,125,
+-66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3,65,88,45,11,
+-255,135,66,16,255,136,67,17,255,22,14,7,198,0,12,8,6,3,119,88,
+-45,11,255,125,64,14,255,123,60,14,255,14,10,5,159,0,12,12,10,5,
+-210,59,31,10,255,115,62,14,255,118,60,13,255,104,54,13,255,100,50,13,
+-255,100,50,13,255,114,58,13,255,119,63,14,255,85,43,12,255,21,15,6,
+-255,7,5,4,40,0,8,8,6,3,74,88,45,11,255,125,66,14,255,123,
+-60,14,255,18,12,5,170,0,44,12,10,5,227,59,31,10,255,115,62,14,
+-255,114,58,13,255,100,50,13,255,114,56,13,255,133,66,16,255,160,80,21,
+-255,176,83,21,255,45,27,12,255,6,5,3,170,0,12,8,6,3,82,88,
+-45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9,7,4,
+-85,92,47,11,255,131,61,14,255,126,62,15,255,17,11,6,170,0,12,14,
+-10,5,227,65,33,10,255,115,59,14,255,115,62,14,255,93,50,12,255,88,
+-44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12,255,21,
+-15,6,255,7,6,4,57,0,24,9,7,4,85,92,47,11,255,125,66,14,
+-255,123,60,14,255,18,12,5,170,0,24,5,5,4,28,19,13,6,255,84,
+-42,11,255,115,62,14,255,110,59,13,255,93,50,12,255,84,44,11,255,106,
+-54,15,255,176,84,23,255,199,100,28,255,188,101,31,255,90,54,25,255,13,
+-10,8,142,0,24,8,6,3,164,72,37,11,255,131,66,14,255,110,54,13,
+-255,12,9,5,224,3,3,2,17,0,24,7,6,6,85,30,20,13,255,190,
+-96,27,255,199,98,24,255,121,69,22,255,13,10,6,190,4,3,3,28,5,
+-4,2,105,27,17,6,255,114,56,13,255,125,64,14,255,45,26,10,255,8,
+-7,5,153,0,12,10,7,5,85,96,48,13,255,125,64,14,255,123,60,14,
+-255,16,11,5,195,0,12,8,6,3,110,92,47,11,255,131,66,14,255,123,
+-65,14,255,18,13,5,170,0,24,9,7,4,85,92,47,11,255,125,66,14,
+-255,123,60,14,255,18,12,5,170,0,24,8,7,3,99,93,50,12,255,125,
+-66,14,255,115,59,14,255,104,54,13,255,88,45,11,255,88,44,11,255,92,
+-43,11,255,92,43,11,255,92,43,11,255,93,50,12,255,93,50,12,255,20,
+-13,5,85,0,8,8,6,3,65,88,45,11,255,125,64,14,255,123,60,14,
+-255,115,62,14,255,93,46,12,255,16,11,5,127,0,28,5,4,4,28,12,
+-10,5,246,104,54,13,255,115,59,14,255,39,23,8,255,8,6,3,82,0,
+-12,58,31,9,255,114,58,13,255,119,63,14,255,123,60,14,255,123,65,14,
+-255,18,12,5,170,0,144,14,10,5,227,59,31,10,255,115,62,14,255,110,
+-59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,104,54,13,255,115,
+-59,14,255,123,60,14,255,123,60,14,255,16,11,5,150,0,8,8,6,3,
+-65,88,44,11,255,125,64,14,255,123,60,14,255,114,58,13,255,93,50,12,
+-255,88,44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12,
+-255,21,15,6,255,7,6,4,51,0,12,12,9,5,224,63,32,10,255,115,
+-62,14,255,114,56,13,255,93,50,12,255,88,44,11,255,88,45,11,255,110,
+-59,13,255,119,61,14,255,85,43,12,255,25,16,6,255,7,6,4,57,0,
+-12,12,10,5,221,59,31,10,255,115,62,14,255,114,56,13,255,93,50,12,
+-255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14,
+-255,121,62,14,255,16,11,5,167,0,12,12,10,5,218,59,31,10,255,115,
+-62,14,255,110,59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,88,
+-45,11,255,88,44,11,255,16,11,5,105,0,24,9,7,4,85,92,47,11,
+-255,125,66,14,255,123,60,14,255,18,12,5,170,0,48,7,5,4,198,93,
+-50,12,255,125,66,14,255,123,60,14,255,12,10,5,170,0,8,8,6,3,
+-65,88,45,11,255,125,66,14,255,123,65,14,255,18,12,5,170,0,12,9,
+-7,4,85,92,47,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,
+-8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18,13,5,
+-170,0,20,3,3,2,11,9,7,4,227,100,50,13,255,123,60,14,255,123,
+-60,14,255,12,10,5,170,0,8,8,6,3,62,88,45,11,255,125,66,14,
+-255,123,60,14,255,14,10,5,198,0,8,8,6,3,170,35,22,8,255,115,
+-59,14,255,112,55,13,255,33,21,8,255,8,6,3,37,0,8,8,6,3,
+-74,88,45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8,
+-6,3,65,88,45,11,255,125,66,14,255,123,65,14,255,14,11,5,147,0,
+-4,9,7,4,85,92,47,11,255,20,13,5,170,0,4,8,6,3,62,88,
+-45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3,
+-65,88,45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9,
+-7,4,85,92,47,11,255,125,66,14,255,123,60,14,255,14,10,5,159,0,
+-12,12,10,5,210,59,31,10,255,115,59,14,255,118,60,13,255,104,54,13,
+-255,102,51,13,255,112,53,13,255,122,63,15,255,123,58,14,255,85,43,12,
+-255,21,15,6,255,7,5,4,45,0,8,8,6,3,85,113,55,16,255,196,
+-92,23,255,195,96,24,255,25,17,10,255,4,3,3,79,0,64,3,2,2,
+-28,10,8,5,227,138,71,21,255,177,87,20,255,174,86,21,255,24,16,9,
+-170,0,8,13,10,8,85,142,73,23,255,195,96,24,255,194,91,23,255,24,
+-17,11,227,0,44,12,9,5,150,35,22,8,255,80,42,11,255,84,44,11,
+-255,88,44,11,255,80,42,11,255,88,44,11,255,97,50,12,255,118,60,13,
+-255,85,43,12,255,21,15,6,255,8,6,3,57,0,16,9,7,4,85,92,
+-47,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,16,6,5,5,
+-28,17,13,8,227,68,34,11,255,115,59,14,255,110,59,13,255,93,50,12,
+-255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14,
+-255,123,65,14,255,18,12,5,170,0,24,12,9,7,170,131,69,24,255,191,
+-90,22,255,136,71,19,255,15,11,6,227,4,3,3,17,0,24,7,6,4,
+-31,16,11,5,227,104,52,13,255,131,66,14,255,98,49,13,255,10,8,5,
+-193,3,2,2,68,8,7,5,170,121,66,26,255,195,96,24,255,156,74,19,
+-255,34,21,9,255,9,7,4,85,0,12,8,6,3,51,69,35,10,255,121,
+-62,14,255,123,60,14,255,16,11,5,227,4,3,3,28,0,8,8,6,3,
+-170,92,47,11,255,125,64,14,255,108,55,13,255,14,10,5,164,0,40,7,
+-5,4,198,96,48,13,255,134,65,15,255,133,66,16,255,15,11,6,170,0,
+-8,7,5,4,85,78,39,11,255,130,64,15,255,130,64,15,255,134,65,15,
+-255,136,67,17,255,124,62,17,255,114,56,17,255,113,55,16,255,118,60,17,
+-255,107,55,20,255,48,29,15,255,12,10,7,85,0,20,9,8,6,170,45,
+-27,12,255,139,70,20,255,131,66,18,255,107,53,14,255,19,13,6,99,0,
+-8,8,6,5,85,92,46,13,255,131,61,14,255,125,64,14,255,14,10,5,
+-170,0,12,58,31,9,255,110,59,13,255,115,59,14,255,56,29,9,255,10,
+-8,5,227,5,4,4,23,0,108,10,8,7,28,28,18,11,212,49,28,16,
+-255,35,21,12,241,13,10,6,85,0,68,14,10,5,142,20,14,5,170,16,
+-12,5,164,8,6,3,28,0,8,24,16,9,142,21,15,8,252,23,15,8,
+-184,11,8,6,34,0,36,14,10,5,142,20,14,5,170,16,11,5,170,10,
+-8,5,28,0,24,7,6,4,25,20,13,7,147,22,15,7,170,10,8,5,
+-142,5,4,4,3,0,24,14,10,5,142,20,13,5,170,16,11,5,170,9,
+-7,4,28,0,16,7,5,4,28,14,10,5,156,14,10,5,229,24,15,9,
+-255,32,20,11,255,28,18,11,244,12,9,7,108,0,8,10,8,5,142,19,
+-13,8,235,24,15,7,227,10,8,5,59,0,48,10,8,5,93,23,15,8,
+-170,28,18,9,173,15,11,6,28,0,12,18,12,5,142,21,14,6,170,9,
+-7,4,133,0,148,8,6,5,113,89,44,14,255,100,51,21,255,13,10,8,
+-227,6,5,5,28,0,60,6,5,5,8,17,12,6,142,26,16,7,170,18,
+-12,5,170,9,7,4,28,0,8,6,5,3,85,54,28,11,255,136,66,19,
+-255,121,59,18,255,15,10,6,241,0,40,8,6,3,57,12,9,5,170,18,
+-13,5,178,14,10,5,241,14,10,5,255,14,10,5,252,16,11,5,195,16,
+-11,5,170,8,6,3,113,0,24,8,6,5,28,24,16,9,204,24,17,9,
+-255,17,12,6,210,14,10,5,170,16,11,5,170,17,11,6,246,27,17,10,
+-246,14,10,7,85,0,16,8,6,5,28,21,14,10,195,22,15,11,255,18,
+-13,9,255,18,13,9,255,22,15,9,255,19,13,8,255,17,12,6,255,17,
+-11,6,255,15,11,6,255,17,12,6,255,19,13,6,204,12,9,5,28,0,
+-12,5,4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5,
+-235,15,11,6,255,15,11,6,255,19,12,6,204,19,13,6,170,10,8,5,
+-170,8,6,5,57,0,48,14,10,5,142,21,13,6,170,16,11,5,170,9,
+-7,4,28,0,12,5,4,2,25,8,6,3,125,14,10,5,170,14,10,5,
+-210,23,15,8,255,30,20,11,255,30,20,11,255,23,17,10,255,20,14,9,
+-244,16,12,9,170,9,8,6,79,0,16,9,7,6,65,15,11,8,170,17,
+-12,8,232,21,14,8,255,26,16,9,255,23,15,8,255,21,14,8,255,15,
+-11,6,255,22,15,7,178,11,9,6,170,10,8,7,57,0,32,12,10,5,
+-142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,5,5,4,28,8,
+-6,3,133,15,11,6,193,20,15,9,255,28,18,11,255,30,20,11,255,26,
+-16,9,255,14,10,5,238,16,11,5,170,9,7,4,153,7,5,4,57,0,
+-16,5,4,2,28,8,6,3,142,18,12,7,207,22,15,9,255,28,18,11,
+-255,27,18,10,255,18,13,7,255,15,11,6,227,21,13,6,170,10,7,5,
+-164,7,6,4,57,0,16,14,10,5,142,20,13,5,170,16,12,5,170,9,
+-7,4,28,0,8,10,8,7,119,149,64,26,255,131,63,26,255,14,11,7,
+-227,6,5,5,28,0,32,7,5,4,28,14,10,5,156,20,13,5,170,12,
+-9,5,142,6,5,3,6,0,64,12,10,7,142,24,15,7,170,21,13,6,
+-170,8,6,3,76,0,48,9,7,6,85,83,43,16,255,176,88,23,255,130,
+-62,21,255,16,11,7,170,0,28,9,8,6,28,13,10,8,164,23,16,10,
+-190,16,11,7,252,15,11,6,255,14,10,5,255,14,10,5,255,14,10,5,
+-255,16,11,5,232,14,10,5,170,8,6,3,85,0,16,14,10,5,142,21,
+-13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,142,20,13,5,
+-170,16,11,5,170,9,7,4,28,0,12,14,10,5,136,16,12,5,170,16,
+-11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5,249,16,
+-12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5,5,4,
+-28,8,6,3,125,14,10,5,170,18,12,5,176,14,10,5,238,14,10,5,
+-246,16,12,5,195,18,13,5,170,16,11,5,170,9,7,4,150,7,5,4,
+-54,0,16,14,10,5,142,16,12,5,170,16,11,5,170,18,12,5,170,16,
+-11,5,210,14,10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9,
+-7,4,153,7,6,4,57,0,16,14,10,5,142,16,12,5,170,16,11,5,
+-170,18,12,5,170,16,11,5,210,14,10,5,252,12,9,5,255,16,11,5,
+-255,20,13,5,201,11,9,4,28,0,12,14,10,5,139,20,13,5,170,16,
+-11,5,170,9,7,4,28,0,36,5,5,4,28,8,6,3,125,14,10,5,
+-170,18,13,5,176,14,10,5,238,14,10,5,255,16,11,5,235,18,13,5,
+-173,16,11,5,170,16,12,5,170,16,11,5,164,9,7,4,28,0,12,12,
+-9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,
+-142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,
+-13,6,170,16,11,5,170,9,7,4,28,0,12,6,5,3,28,8,7,5,
+-139,19,13,8,193,21,15,10,255,31,21,12,255,32,21,13,255,31,20,12,
+-255,23,17,10,255,18,12,7,212,10,8,5,159,7,6,4,57,0,16,14,
+-10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,
+-142,21,13,6,170,16,12,5,170,9,7,4,28,0,12,14,10,5,136,16,
+-12,5,170,16,11,5,170,18,12,5,176,17,12,6,252,21,14,8,255,17,
+-12,6,255,16,11,5,255,20,13,5,204,11,9,4,28,0,12,14,10,5,
+-142,21,14,6,170,18,12,5,170,9,8,4,28,0,24,14,10,5,142,20,
+-13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6,
+-170,16,12,5,170,10,8,5,28,0,16,12,9,5,142,20,13,5,170,16,
+-11,5,170,9,7,4,28,0,12,5,5,4,28,8,6,3,125,14,10,5,
+-170,18,12,5,170,20,14,5,173,16,12,5,193,20,13,5,178,20,13,5,
+-170,16,11,5,170,9,7,4,153,7,6,4,57,0,16,14,10,5,142,21,
+-13,6,170,16,11,5,170,9,7,4,28,0,44,5,5,4,28,8,6,3,
+-125,14,10,5,170,18,13,5,170,20,14,5,170,18,12,5,170,13,10,6,
+-227,72,38,19,255,185,86,32,255,144,64,29,255,20,15,11,232,8,7,7,
+-28,0,12,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,
+-16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,5,
+-4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5,238,14,
+-10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9,7,4,153,7,
+-5,4,57,0,32,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,
+-28,0,28,8,6,3,57,9,7,4,164,14,10,5,170,18,13,5,173,14,
+-10,5,229,14,10,5,255,17,12,6,255,22,15,9,255,20,14,9,252,21,
+-15,10,176,11,9,6,139,0,32,11,8,4,122,18,12,5,170,14,10,5,
+-150,7,5,4,28,0,32,8,7,7,57,24,16,11,173,26,18,9,190,13,
+-10,6,142,5,4,4,11,0,8,8,7,3,68,14,10,5,170,16,11,5,
+-170,9,7,4,74,0,20,14,10,5,142,20,14,5,170,16,11,5,170,9,
+-7,4,28,0,16,14,10,5,142,20,14,5,170,16,11,5,170,9,8,4,
+-28,0,28,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,
+-28,14,10,5,142,18,13,5,170,16,12,5,170,18,13,5,173,14,10,5,
+-227,14,10,5,255,14,10,5,252,12,9,5,255,12,9,5,255,16,11,5,
+-255,20,13,5,201,11,9,4,28,0,12,12,10,5,136,16,12,5,170,16,
+-11,5,170,16,11,5,193,21,15,6,184,14,10,5,31,0,32,8,6,3,
+-139,54,30,9,255,107,50,12,255,78,39,11,255,9,7,4,161,0,12,20,
+-13,5,142,18,12,5,210,16,11,5,170,16,11,5,170,16,11,5,170,9,
+-7,4,28,0,64,13,10,8,57,9,7,6,159,8,6,5,159,10,8,7,
+-130,10,8,7,119,9,7,6,133,9,7,6,167,10,8,7,170,11,9,8,
+-113,0,44,5,4,2,28,8,6,3,125,14,10,5,170,18,13,5,176,14,
+-10,5,238,14,10,5,255,16,11,5,235,18,13,5,173,16,11,5,170,16,
+-12,5,170,16,11,5,164,9,7,4,28,0,12,14,10,5,136,16,12,5,
+-170,16,11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5,
+-249,16,12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5,
+-5,4,28,8,6,3,125,14,10,5,170,18,13,5,176,14,10,5,238,14,
+-10,5,255,14,10,5,249,16,11,5,193,16,11,5,170,9,7,4,150,7,
+-5,4,57,0,16,5,5,4,28,8,6,3,125,14,10,5,170,18,13,5,
+-176,14,10,5,238,14,10,5,255,14,10,5,235,18,13,5,173,16,11,5,
+-170,16,12,5,170,16,11,5,170,9,7,4,28,0,12,5,5,4,28,8,
+-6,3,125,14,10,5,170,18,13,5,176,14,10,5,235,14,10,5,255,14,
+-10,5,255,16,11,5,255,20,13,5,207,12,9,5,34,0,28,14,10,5,
+-142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,6,5,3,85,7,
+-5,4,85,6,5,3,85,5,4,4,85,5,4,4,105,9,8,4,241,72,
+-37,11,255,110,54,13,255,67,34,10,255,8,6,3,144,0,12,14,10,5,
+-142,21,14,6,170,16,12,5,170,9,8,4,28,0,16,14,10,5,142,21,
+-13,6,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6,
+-170,16,11,5,170,9,7,4,28,0,12,7,5,2,37,8,6,3,142,8,
+-6,3,227,25,15,6,255,75,36,10,255,99,51,12,255,66,33,9,255,8,
+-6,3,130,0,12,14,10,5,139,21,13,6,170,16,11,5,170,9,7,4,
+-28,0,12,8,6,3,79,14,10,5,170,18,13,5,170,12,9,5,142,0,
+-16,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,12,12,
+-9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,8,20,13,5,
+-85,11,8,4,28,0,8,12,9,5,142,21,13,6,170,16,11,5,170,9,
+-7,4,28,0,12,12,9,5,142,21,13,6,170,16,11,5,170,9,7,4,
+-28,0,16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,
+-12,5,5,4,28,8,6,3,125,14,10,5,170,18,12,5,170,20,14,5,
+-173,16,12,5,193,20,13,5,178,20,13,5,170,16,11,5,170,9,7,4,
+-161,7,6,4,57,0,12,8,6,3,85,84,40,13,255,164,73,23,255,184,
+-79,27,255,15,11,8,246,0,72,11,10,10,170,176,83,37,255,196,87,33,
+-255,192,88,31,255,22,15,11,193,0,12,21,15,10,159,26,17,11,255,24,
+-17,11,221,10,8,7,85,0,44,8,7,3,59,12,9,5,170,16,11,5,
+-210,14,10,5,255,14,10,5,255,14,10,5,255,14,10,5,246,16,12,5,
+-193,16,11,5,170,9,7,4,153,6,5,3,57,0,24,14,10,5,142,20,
+-13,5,170,16,11,5,170,9,7,4,28,0,20,6,5,3,28,8,6,3,
+-127,14,10,5,170,18,13,5,176,14,10,5,238,14,10,5,255,14,10,5,
+-235,18,13,5,173,16,11,5,170,16,12,5,170,16,11,5,170,9,7,4,
+-28,0,28,14,11,7,142,29,19,8,170,17,11,6,159,8,6,3,28,0,
+-32,7,5,4,28,14,10,5,150,20,13,5,170,12,9,5,142,5,4,2,
+-14,0,8,15,11,8,142,26,18,9,178,19,13,6,170,8,6,3,68,0,
+-20,18,12,5,142,16,11,5,238,16,11,5,170,9,7,4,28,0,16,12,
+-9,5,142,16,11,5,215,18,13,5,187,11,9,4,28,0,16,4,4,3,
+-6,5,4,2,82,5,4,2,85,5,4,2,85,5,4,2,85,5,4,2,
+-99,9,7,4,241,72,37,11,255,112,53,13,255,77,39,12,255,10,8,5,
+-170,0,12,19,13,8,184,20,14,9,255,16,11,7,255,14,11,7,255,17,
+-12,8,255,22,15,9,255,27,17,10,255,30,19,11,255,28,18,11,255,21,
+-15,10,255,15,12,8,198,9,7,6,28,0,24,8,6,5,91,15,11,6,
+-170,14,11,5,238,19,13,6,198,12,9,5,28,0,8,6,5,3,85,54,
+-29,9,255,100,48,13,255,109,52,14,255,15,11,6,170,0,12,19,13,6,
+-144,14,10,5,255,16,11,5,178,8,6,3,119,0,255,0,255,0,174,12,
+-9,7,88,99,44,20,255,26,16,11,232,5,4,4,28,0,92,6,5,3,
+-57,60,28,11,255,158,67,23,255,88,44,23,255,11,9,6,142,0,255,0,
+-255,0,150,12,9,7,110,126,51,25,255,25,17,12,232,5,4,4,28,0,
+-184,6,5,5,28,19,14,10,227,52,29,17,255,30,20,13,255,9,8,6,
+-82,0,255,0,255,0,255,0,255,0,8,12,10,9,170,172,81,49,255,213,
+-125,94,255,185,88,58,255,23,16,14,159,0,255,0,255,0,106,5,4,2,
+-28,16,11,5,244,68,34,9,255,62,33,9,255,9,8,4,139,0,96,10,
+-8,7,48,71,33,18,255,108,47,23,255,107,48,22,255,113,51,24,255,109,
+-50,24,255,104,45,21,255,104,45,21,255,113,49,24,255,115,50,24,255,18,
+-13,9,136,0,255,0,129,9,7,6,34,18,13,9,244,66,31,15,255,84,
+-37,17,255,83,36,16,255,75,34,14,255,73,35,14,255,91,41,16,255,110,
+-47,19,255,79,40,16,255,24,16,9,255,8,6,5,57,0,100,22,14,5,
+-244,40,23,7,255,42,23,7,255,54,28,9,255,60,31,9,255,36,22,7,
+-255,12,9,5,244,6,5,3,28,0,255,0,29,9,7,6,85,72,34,13,
+-255,126,56,21,255,148,63,25,255,25,17,14,190,0,72,15,12,12,133,178,
+-86,57,255,200,89,55,255,194,82,47,255,30,20,17,187,0,255,0,169,9,
+-7,4,99,17,12,6,255,42,22,9,255,49,25,9,255,54,26,11,255,52,
+-26,11,255,59,28,12,255,82,37,15,255,111,49,18,255,84,39,17,255,25,
+-17,10,255,8,7,5,57,0,112,6,5,3,57,38,22,7,255,85,39,12,
+-255,124,52,21,255,20,13,9,170,0,255,0,255,0,202,8,6,5,28,26,
+-16,11,170,11,8,6,85,0,100,12,8,5,119,20,14,9,170,12,9,7,
+-142,0,255,0,255,0,154,9,7,6,28,27,17,12,170,11,9,8,85,0,
+-192,7,6,6,28,8,7,5,85,8,6,5,57,0,255,0,255,0,255,0,
+-255,0,16,25,17,16,161,41,27,26,255,40,26,23,235,14,12,11,82,0,
+-255,0,255,0,110,8,6,3,37,9,7,4,142,9,7,4,136,6,5,3,
+-6,0,100,23,15,10,153,19,13,10,255,16,11,9,255,16,11,9,255,16,
+-11,9,255,16,11,9,255,16,11,9,255,18,13,9,255,24,16,11,204,16,
+-11,9,31,0,255,0,133,10,8,7,142,18,12,9,207,18,13,9,255,16,
+-11,9,255,15,11,8,255,15,11,8,252,18,13,9,195,18,12,9,170,11,
+-8,6,167,8,7,5,57,0,104,9,8,4,142,14,10,5,170,13,10,6,
+-170,13,9,6,170,11,8,6,170,7,6,4,130,6,5,3,28,0,255,0,
+-37,14,10,7,142,21,14,10,170,19,13,10,170,14,11,9,31,0,72,8,
+-7,8,14,25,17,16,142,27,18,16,193,26,18,15,170,15,11,10,34,0,
+-255,0,169,9,7,4,28,11,8,6,170,14,10,7,232,15,10,8,255,15,
+-10,8,255,15,10,8,255,15,10,8,252,18,12,9,195,18,12,9,170,11,
+-8,6,167,9,7,6,57,0,120,9,7,4,91,16,11,7,170,20,13,9,
+-170,13,10,8,28,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,
+-255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,
+-255,0,255,0,255}};
+- /* Created by MiniCompress.. an iOS RLE compressor.
+- * Compress Rate : 46.36 %
+- */
+diff -Naur /home/d4rk/goom2k4-0/src/gfontrle.h /src/gfontrle.h
+--- /home/d4rk/goom2k4-0/src/gfontrle.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/gfontrle.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,7 +0,0 @@
+-extern const struct {
+- unsigned int width;
+- unsigned int height;
+- unsigned int bytes_per_pixel;
+- unsigned int rle_size;
+- unsigned char rle_pixel [49725];
+-} the_font ;
+diff -Naur /home/d4rk/goom2k4-0/src/goom_config.h /src/goom_config.h
+--- /home/d4rk/goom2k4-0/src/goom_config.h 2008-08-03 19:23:12.000000000 -0600
++++ /src/goom_config.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,28 +0,0 @@
+-#if WORDS_BIGENDIAN
+-#define COLOR_ARGB
+-#else
+-#define COLOR_BGRA
+-#endif
+-
+-#if 1
+-/* ndef COLOR_BGRA */
+-/** position des composantes **/
+- #define BLEU 2
+- #define VERT 1
+- #define ROUGE 0
+- #define ALPHA 3
+-#else
+- #define ROUGE 1
+- #define BLEU 3
+- #define VERT 2
+- #define ALPHA 0
+-#endif
+-
+-#ifndef guint32
+-#define guint8 unsigned char
+-#define guin16 unsigned short
+-#define guint32 unsigned int
+-#define gint8 signed char
+-#define gint16 signed short int
+-#define gint32 signed int
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/goom_config_param.h /src/goom_config_param.h
+--- /home/d4rk/goom2k4-0/src/goom_config_param.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom_config_param.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,115 +0,0 @@
+-#ifndef _CONFIG_PARAM_H
+-#define _CONFIG_PARAM_H
+-
+-#include <stdlib.h>
+-
+-/**
+- * File created on 2003-05-24 by Jeko.
+- * (c)2003, JC Hoelt for iOS-software.
+- *
+- * LGPL Licence.
+- */
+-
+-typedef enum {
+- PARAM_INTVAL,
+- PARAM_FLOATVAL,
+- PARAM_BOOLVAL,
+- PARAM_STRVAL,
+- PARAM_LISTVAL,
+-} ParamType;
+-
+-struct IntVal {
+- int value;
+- int min;
+- int max;
+- int step;
+-};
+-struct FloatVal {
+- float value;
+- float min;
+- float max;
+- float step;
+-};
+-struct StrVal {
+- char *value;
+-};
+-struct ListVal {
+- char *value;
+- int nbChoices;
+- char **choices;
+-};
+-struct BoolVal {
+- int value;
+-};
+-
+-
+-typedef struct _PARAM {
+- char *name;
+- char *desc;
+- char rw;
+- ParamType type;
+- union {
+- struct IntVal ival;
+- struct FloatVal fval;
+- struct StrVal sval;
+- struct ListVal slist;
+- struct BoolVal bval;
+- } param;
+-
+- /* used by the core to inform the GUI of a change */
+- void (*change_listener)(struct _PARAM *_this);
+-
+- /* used by the GUI to inform the core of a change */
+- void (*changed)(struct _PARAM *_this);
+-
+- void *user_data; /* can be used by the GUI */
+-} PluginParam;
+-
+-#define IVAL(p) ((p).param.ival.value)
+-#define SVAL(p) ((p).param.sval.value)
+-#define FVAL(p) ((p).param.fval.value)
+-#define BVAL(p) ((p).param.bval.value)
+-#define LVAL(p) ((p).param.slist.value)
+-
+-#define FMIN(p) ((p).param.fval.min)
+-#define FMAX(p) ((p).param.fval.max)
+-#define FSTEP(p) ((p).param.fval.step)
+-
+-#define IMIN(p) ((p).param.ival.min)
+-#define IMAX(p) ((p).param.ival.max)
+-#define ISTEP(p) ((p).param.ival.step)
+-
+-PluginParam goom_secure_param(void);
+-
+-PluginParam goom_secure_f_param(char *name);
+-PluginParam goom_secure_i_param(char *name);
+-PluginParam goom_secure_b_param(char *name, int value);
+-PluginParam goom_secure_s_param(char *name);
+-
+-PluginParam goom_secure_f_feedback(char *name);
+-PluginParam goom_secure_i_feedback(char *name);
+-
+-void goom_set_str_param_value(PluginParam *p, const char *str);
+-void goom_set_list_param_value(PluginParam *p, const char *str);
+-
+-typedef struct _PARAMETERS {
+- char *name;
+- char *desc;
+- int nbParams;
+- PluginParam **params;
+-} PluginParameters;
+-
+-PluginParameters goom_plugin_parameters(const char *name, int nb);
+-
+-#define secure_param goom_secure_param
+-#define secure_f_param goom_secure_f_param
+-#define secure_i_param goom_secure_i_param
+-#define secure_b_param goom_secure_b_param
+-#define secure_s_param goom_secure_s_param
+-#define secure_f_feedback goom_secure_f_feedback
+-#define secure_i_feedback goom_secure_i_feedback
+-#define set_list_param_value goom_set_list_param_value
+-#define set_str_param_value goom_set_str_param_value
+-#define plugin_parameters goom_plugin_parameters
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/goom_core.c /src/goom_core.c
+--- /home/d4rk/goom2k4-0/src/goom_core.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom_core.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,886 +0,0 @@
+-/**
+-* file: goom_core.c
+- * author: Jean-Christophe Hoelt (which is not so proud of it)
+- *
+- * Contains the core of goom's work.
+- *
+- * (c)2000-2003, by iOS-software.
+- */
+-
+-#include <math.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <string.h>
+-#include <inttypes.h>
+-
+-#include "goom.h"
+-#include "goom_tools.h"
+-#include "goom_filters.h"
+-#include "lines.h"
+-#include "ifs.h"
+-#include "tentacle3d.h"
+-#include "gfontlib.h"
+-
+-#include "sound_tester.h"
+-#include "goom_plugin_info.h"
+-#include "goom_fx.h"
+-#include "goomsl.h"
+-
+-/* #define VERBOSE */
+-
+-#define STOP_SPEED 128
+-/* TODO: put that as variable in PluginInfo */
+-#define TIME_BTW_CHG 300
+-
+-static void choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur,
+- int *mode, float *amplitude, int far);
+-
+-static void update_message (PluginInfo *goomInfo, char *message);
+-
+-static void init_buffers(PluginInfo *goomInfo, int buffsize)
+-{
+- goomInfo->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128);
+- bzero (goomInfo->pixel, buffsize * sizeof (guint32) + 128);
+- goomInfo->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128);
+- bzero (goomInfo->back, buffsize * sizeof (guint32) + 128);
+- goomInfo->conv = (Pixel *) malloc (buffsize * sizeof (guint32) + 128);
+- bzero (goomInfo->conv, buffsize * sizeof (guint32) + 128);
+-
+- goomInfo->outputBuf = goomInfo->conv;
+-
+- goomInfo->p1 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->pixel)) / 128) * 128);
+- goomInfo->p2 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->back)) / 128) * 128);
+-}
+-
+-/**************************
+-* INIT *
+-**************************/
+-PluginInfo *goom_init (guint32 resx, guint32 resy)
+-{
+- PluginInfo *goomInfo = (PluginInfo*)malloc(sizeof(PluginInfo));
+-
+-#ifdef VERBOSE
+- printf ("GOOM: init (%d, %d);\n", resx, resy);
+-#endif
+-
+- plugin_info_init(goomInfo,4);
+-
+- goomInfo->star_fx = flying_star_create();
+- goomInfo->star_fx.init(&goomInfo->star_fx, goomInfo);
+-
+- goomInfo->zoomFilter_fx = zoomFilterVisualFXWrapper_create ();
+- goomInfo->zoomFilter_fx.init(&goomInfo->zoomFilter_fx, goomInfo);
+-
+- goomInfo->tentacles_fx = tentacle_fx_create();
+- goomInfo->tentacles_fx.init(&goomInfo->tentacles_fx, goomInfo);
+-
+- goomInfo->convolve_fx = convolve_create();
+- goomInfo->convolve_fx.init(&goomInfo->convolve_fx, goomInfo);
+-
+- plugin_info_add_visual (goomInfo, 0, &goomInfo->zoomFilter_fx);
+- plugin_info_add_visual (goomInfo, 1, &goomInfo->tentacles_fx);
+- plugin_info_add_visual (goomInfo, 2, &goomInfo->star_fx);
+- plugin_info_add_visual (goomInfo, 3, &goomInfo->convolve_fx);
+-
+- goomInfo->screen.width = resx;
+- goomInfo->screen.height = resy;
+- goomInfo->screen.size = resx * resy;
+-
+- init_buffers(goomInfo, goomInfo->screen.size);
+- goomInfo->gRandom = goom_random_init((uintptr_t)goomInfo->pixel);
+-
+- goomInfo->cycle = 0;
+-
+- goomInfo->ifs_fx = ifs_visualfx_create();
+- goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo);
+-
+- goomInfo->gmline1 = goom_lines_init (goomInfo, resx, goomInfo->screen.height,
+- GML_HLINE, goomInfo->screen.height, GML_BLACK,
+- GML_CIRCLE, 0.4f * (float) goomInfo->screen.height, GML_VERT);
+- goomInfo->gmline2 = goom_lines_init (goomInfo, resx, goomInfo->screen.height,
+- GML_HLINE, 0, GML_BLACK,
+- GML_CIRCLE, 0.2f * (float) goomInfo->screen.height, GML_RED);
+-
+- gfont_load ();
+-
+- /* goom_set_main_script(goomInfo, goomInfo->main_script_str); */
+-
+- return goomInfo;
+-}
+-
+-
+-
+-void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy)
+-{
+- free (goomInfo->pixel);
+- free (goomInfo->back);
+- free (goomInfo->conv);
+-
+- goomInfo->screen.width = resx;
+- goomInfo->screen.height = resy;
+- goomInfo->screen.size = resx * resy;
+-
+- init_buffers(goomInfo, goomInfo->screen.size);
+-
+- /* init_ifs (goomInfo, resx, goomInfo->screen.height); */
+- goomInfo->ifs_fx.free(&goomInfo->ifs_fx);
+- goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo);
+-
+- goom_lines_set_res (goomInfo->gmline1, resx, goomInfo->screen.height);
+- goom_lines_set_res (goomInfo->gmline2, resx, goomInfo->screen.height);
+-}
+-
+-int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer)
+-{
+- goomInfo->outputBuf = (Pixel*)buffer;
+- return 1;
+-}
+-
+-/********************************************
+-* UPDATE *
+-********************************************
+-
+-* WARNING: this is a 600 lines function ! (21-11-2003)
+-*/
+-guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512],
+- int forceMode, float fps, char *songTitle, char *message)
+-{
+- Pixel *return_val;
+- guint32 pointWidth;
+- guint32 pointHeight;
+- int i;
+- float largfactor; /* elargissement de l'intervalle d'évolution des points */
+- Pixel *tmp;
+-
+- ZoomFilterData *pzfd;
+-
+- /* test if the config has changed, update it if so */
+- pointWidth = (goomInfo->screen.width * 2) / 5;
+- pointHeight = ((goomInfo->screen.height) * 2) / 5;
+-
+- /* ! etude du signal ... */
+- evaluate_sound (data, &(goomInfo->sound));
+-
+- /* goom_execute_main_script(goomInfo); */
+-
+- /* ! calcul du deplacement des petits points ... */
+- largfactor = goomInfo->sound.speedvar / 150.0f + goomInfo->sound.volume / 1.5f;
+-
+- if (largfactor > 1.5f)
+- largfactor = 1.5f;
+-
+- goomInfo->update.decay_ifs--;
+- if (goomInfo->update.decay_ifs > 0)
+- goomInfo->update.ifs_incr += 2;
+- if (goomInfo->update.decay_ifs == 0)
+- goomInfo->update.ifs_incr = 0;
+-
+- if (goomInfo->update.recay_ifs) {
+- goomInfo->update.ifs_incr -= 2;
+- goomInfo->update.recay_ifs--;
+- if ((goomInfo->update.recay_ifs == 0)&&(goomInfo->update.ifs_incr<=0))
+- goomInfo->update.ifs_incr = 1;
+- }
+-
+- if (goomInfo->update.ifs_incr > 0)
+- goomInfo->ifs_fx.apply(&goomInfo->ifs_fx, goomInfo->p2, goomInfo->p1, goomInfo);
+-
+- if (goomInfo->curGState->drawPoints) {
+- for (i = 1; i * 15 <= goomInfo->sound.speedvar*80.0f + 15; i++) {
+- goomInfo->update.loopvar += goomInfo->sound.speedvar*50 + 1;
+-
+- pointFilter (goomInfo, goomInfo->p1,
+- YELLOW,
+- ((pointWidth - 6.0f) * largfactor + 5.0f),
+- ((pointHeight - 6.0f) * largfactor + 5.0f),
+- i * 152.0f, 128.0f, goomInfo->update.loopvar + i * 2032);
+- pointFilter (goomInfo, goomInfo->p1, ORANGE,
+- ((pointWidth / 2) * largfactor) / i + 10.0f * i,
+- ((pointHeight / 2) * largfactor) / i + 10.0f * i,
+- 96.0f, i * 80.0f, goomInfo->update.loopvar / i);
+- pointFilter (goomInfo, goomInfo->p1, VIOLET,
+- ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i,
+- ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i,
+- i + 122.0f, 134.0f, goomInfo->update.loopvar / i);
+- pointFilter (goomInfo, goomInfo->p1, BLACK,
+- ((pointHeight / 3) * largfactor + 20.0f),
+- ((pointHeight / 3) * largfactor + 20.0f),
+- 58.0f, i * 66.0f, goomInfo->update.loopvar / i);
+- pointFilter (goomInfo, goomInfo->p1, WHITE,
+- (pointHeight * largfactor + 10.0f * i) / i,
+- (pointHeight * largfactor + 10.0f * i) / i,
+- 66.0f, 74.0f, goomInfo->update.loopvar + i * 500);
+- }
+- }
+-
+- /* par défaut pas de changement de zoom */
+- pzfd = NULL;
+-
+- /*
+- * Test forceMode
+- */
+-#ifdef VERBOSE
+- if (forceMode != 0) {
+- printf ("forcemode = %d\n", forceMode);
+- }
+-#endif
+-
+-
+- /* diminuer de 1 le temps de lockage */
+- /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */
+- /* changement d'etat du plugin juste apres un autre changement d'etat. oki */
+- if (--goomInfo->update.lockvar < 0)
+- goomInfo->update.lockvar = 0;
+-
+- /* on verifie qu'il ne se pas un truc interressant avec le son. */
+- if ((goomInfo->sound.timeSinceLastGoom == 0)
+- || (forceMode > 0)
+- || (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG)) {
+-
+- /* changement eventuel de mode */
+- if (goom_irand(goomInfo->gRandom,16) == 0)
+- switch (goom_irand(goomInfo->gRandom,34)) {
+- case 0:
+- case 10:
+- goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2);
+- case 13:
+- case 20:
+- case 21:
+- goomInfo->update.zoomFilterData.mode = WAVE_MODE;
+- goomInfo->update.zoomFilterData.reverse = 0;
+- goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,3) == 0);
+- if (goom_irand(goomInfo->gRandom,2))
+- goomInfo->update.zoomFilterData.vitesse = (goomInfo->update.zoomFilterData.vitesse + 127) >> 1;
+- break;
+- case 1:
+- case 11:
+- goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE;
+- goomInfo->update.zoomFilterData.waveEffect = 0;
+- goomInfo->update.zoomFilterData.hypercosEffect = 0;
+- break;
+- case 2:
+- case 12:
+- goomInfo->update.zoomFilterData.mode = AMULETTE_MODE;
+- goomInfo->update.zoomFilterData.waveEffect = 0;
+- goomInfo->update.zoomFilterData.hypercosEffect = 0;
+- break;
+- case 3:
+- goomInfo->update.zoomFilterData.mode = WATER_MODE;
+- goomInfo->update.zoomFilterData.waveEffect = 0;
+- goomInfo->update.zoomFilterData.hypercosEffect = 0;
+- break;
+- case 4:
+- case 14:
+- goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE;
+- goomInfo->update.zoomFilterData.waveEffect = 0;
+- goomInfo->update.zoomFilterData.hypercosEffect = 0;
+- break;
+- case 5:
+- case 15:
+- case 22:
+- goomInfo->update.zoomFilterData.mode = HYPERCOS1_MODE;
+- goomInfo->update.zoomFilterData.waveEffect = 0;
+- goomInfo->update.zoomFilterData.hypercosEffect = (goom_irand(goomInfo->gRandom,3) == 0);
+- break;
+- case 6:
+- case 16:
+- goomInfo->update.zoomFilterData.mode = HYPERCOS2_MODE;
+- goomInfo->update.zoomFilterData.waveEffect = 0;
+- goomInfo->update.zoomFilterData.hypercosEffect = 0;
+- break;
+- case 7:
+- case 17:
+- goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE;
+- goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,4) == 0);
+- goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2);
+- break;
+- case 8:
+- case 18:
+- case 19:
+- goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE;
+- goomInfo->update.zoomFilterData.waveEffect = 1;
+- goomInfo->update.zoomFilterData.hypercosEffect = 1;
+- break;
+- case 29:
+- case 30:
+- goomInfo->update.zoomFilterData.mode = YONLY_MODE;
+- break;
+- case 31:
+- case 32:
+- case 33:
+- goomInfo->update.zoomFilterData.mode = SPEEDWAY_MODE;
+- break;
+- default:
+- goomInfo->update.zoomFilterData.mode = NORMAL_MODE;
+- goomInfo->update.zoomFilterData.waveEffect = 0;
+- goomInfo->update.zoomFilterData.hypercosEffect = 0;
+- }
+- }
+-
+- /* tout ceci ne sera fait qu'en cas de non-blocage */
+- if (goomInfo->update.lockvar == 0) {
+- /* reperage de goom (acceleration forte de l'acceleration du volume) */
+- /* -> coup de boost de la vitesse si besoin.. */
+- if (goomInfo->sound.timeSinceLastGoom == 0) {
+-
+- int i;
+- goomInfo->update.goomvar++;
+-
+- /* SELECTION OF THE GOOM STATE */
+- if ((!goomInfo->update.stateSelectionBlocker)&&(goom_irand(goomInfo->gRandom,3))) {
+- goomInfo->update.stateSelectionRnd = goom_irand(goomInfo->gRandom,goomInfo->statesRangeMax);
+- goomInfo->update.stateSelectionBlocker = 3;
+- }
+- else if (goomInfo->update.stateSelectionBlocker) goomInfo->update.stateSelectionBlocker--;
+-
+- for (i=0;i<goomInfo->statesNumber;i++)
+- if ((goomInfo->update.stateSelectionRnd >= goomInfo->states[i].rangemin)
+- && (goomInfo->update.stateSelectionRnd <= goomInfo->states[i].rangemax))
+- goomInfo->curGState = &(goomInfo->states[i]);
+-
+- if ((goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr<=0)) {
+- goomInfo->update.recay_ifs = 5;
+- goomInfo->update.ifs_incr = 11;
+- }
+-
+- if ((!goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr>0) && (goomInfo->update.decay_ifs<=0))
+- goomInfo->update.decay_ifs = 100;
+-
+- if (!goomInfo->curGState->drawScope)
+- goomInfo->update.stop_lines = 0xf000 & 5;
+-
+- if (!goomInfo->curGState->drawScope) {
+- goomInfo->update.stop_lines = 0;
+- goomInfo->update.lineMode = goomInfo->update.drawLinesDuration;
+- }
+-
+- /* if (goomInfo->update.goomvar % 1 == 0) */
+- {
+- guint32 vtmp;
+- guint32 newvit;
+-
+- goomInfo->update.lockvar = 50;
+- newvit = STOP_SPEED + 1 - ((float)3.5f * log10(goomInfo->sound.speedvar * 60 + 1));
+- /* retablir le zoom avant.. */
+- if ((goomInfo->update.zoomFilterData.reverse) && (!(goomInfo->cycle % 13)) && (rand () % 5 == 0)) {
+- goomInfo->update.zoomFilterData.reverse = 0;
+- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 2;
+- goomInfo->update.lockvar = 75;
+- }
+- if (goom_irand(goomInfo->gRandom,10) == 0) {
+- goomInfo->update.zoomFilterData.reverse = 1;
+- goomInfo->update.lockvar = 100;
+- }
+-
+- if (goom_irand(goomInfo->gRandom,10) == 0)
+- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1;
+- if (goom_irand(goomInfo->gRandom,12) == 0)
+- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED + 1;
+-
+- /* changement de milieu.. */
+- switch (goom_irand(goomInfo->gRandom,25)) {
+- case 0:
+- case 3:
+- case 6:
+- goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height - 1;
+- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2;
+- break;
+- case 1:
+- case 4:
+- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width - 1;
+- break;
+- case 2:
+- case 5:
+- goomInfo->update.zoomFilterData.middleX = 1;
+- break;
+- default:
+- goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2;
+- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2;
+- }
+-
+- if ((goomInfo->update.zoomFilterData.mode == WATER_MODE)
+- || (goomInfo->update.zoomFilterData.mode == YONLY_MODE)
+- || (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE)) {
+- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2;
+- goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2;
+- }
+-
+- switch (vtmp = (goom_irand(goomInfo->gRandom,15))) {
+- case 0:
+- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,3)
+- - goom_irand(goomInfo->gRandom,3);
+- goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,3)
+- - goom_irand(goomInfo->gRandom,3);
+- break;
+- case 3:
+- goomInfo->update.zoomFilterData.vPlaneEffect = 0;
+- goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,8)
+- - goom_irand(goomInfo->gRandom,8);
+- break;
+- case 4:
+- case 5:
+- case 6:
+- case 7:
+- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,5)
+- - goom_irand(goomInfo->gRandom,5);
+- goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.vPlaneEffect;
+- break;
+- case 8:
+- goomInfo->update.zoomFilterData.hPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8);
+- goomInfo->update.zoomFilterData.vPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect;
+- break;
+- case 9:
+- goomInfo->update.zoomFilterData.vPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8);
+- goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect;
+- break;
+- case 13:
+- goomInfo->update.zoomFilterData.hPlaneEffect = 0;
+- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10)
+- - goom_irand(goomInfo->gRandom,10);
+- break;
+- case 14:
+- goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,10)
+- - goom_irand(goomInfo->gRandom,10);
+- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10)
+- - goom_irand(goomInfo->gRandom,10);
+- break;
+- default:
+- if (vtmp < 10) {
+- goomInfo->update.zoomFilterData.vPlaneEffect = 0;
+- goomInfo->update.zoomFilterData.hPlaneEffect = 0;
+- }
+- }
+-
+- if (goom_irand(goomInfo->gRandom,5) != 0)
+- goomInfo->update.zoomFilterData.noisify = 0;
+- else {
+- goomInfo->update.zoomFilterData.noisify = goom_irand(goomInfo->gRandom,2) + 1;
+- goomInfo->update.lockvar *= 2;
+- }
+-
+- if (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE) {
+- goomInfo->update.zoomFilterData.vPlaneEffect = 0;
+- goomInfo->update.zoomFilterData.hPlaneEffect = 0;
+- goomInfo->update.zoomFilterData.noisify = 0;
+- }
+-
+- if ((goomInfo->update.zoomFilterData.middleX == 1) || (goomInfo->update.zoomFilterData.middleX == (signed int)goomInfo->screen.width - 1)) {
+- goomInfo->update.zoomFilterData.vPlaneEffect = 0;
+- if (goom_irand(goomInfo->gRandom,2))
+- goomInfo->update.zoomFilterData.hPlaneEffect = 0;
+- }
+-
+- if ((signed int)newvit < goomInfo->update.zoomFilterData.vitesse) /* on accelere */
+- {
+- pzfd = &goomInfo->update.zoomFilterData;
+- if (((newvit < STOP_SPEED - 7) &&
+- (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 6) &&
+- (goomInfo->cycle % 3 == 0)) || (goom_irand(goomInfo->gRandom,40) == 0)) {
+- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - goom_irand(goomInfo->gRandom,2)
+- + goom_irand(goomInfo->gRandom,2);
+- goomInfo->update.zoomFilterData.reverse = !goomInfo->update.zoomFilterData.reverse;
+- }
+- else {
+- goomInfo->update.zoomFilterData.vitesse = (newvit + goomInfo->update.zoomFilterData.vitesse * 7) / 8;
+- }
+- goomInfo->update.lockvar += 50;
+- }
+- }
+-
+- if (goomInfo->update.lockvar > 150) {
+- goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount;
+- goomInfo->update.switchMult = 1.0f;
+- }
+- }
+- /* mode mega-lent */
+- if (goom_irand(goomInfo->gRandom,700) == 0) {
+- /*
+- * printf ("coup du sort...\n") ;
+- */
+- pzfd = &goomInfo->update.zoomFilterData;
+- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1;
+- goomInfo->update.zoomFilterData.pertedec = 8;
+- goomInfo->update.zoomFilterData.sqrtperte = 16;
+- goomInfo->update.goomvar = 1;
+- goomInfo->update.lockvar += 50;
+- goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount;
+- goomInfo->update.switchMult = 1.0f;
+- }
+- }
+-
+- /*
+- * gros frein si la musique est calme
+- */
+- if ((goomInfo->sound.speedvar < 0.01f)
+- && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 4)
+- && (goomInfo->cycle % 16 == 0)) {
+- pzfd = &goomInfo->update.zoomFilterData;
+- goomInfo->update.zoomFilterData.vitesse += 3;
+- goomInfo->update.zoomFilterData.pertedec = 8;
+- goomInfo->update.zoomFilterData.sqrtperte = 16;
+- goomInfo->update.goomvar = 0;
+- }
+-
+- /*
+- * baisser regulierement la vitesse...
+- */
+- if ((goomInfo->cycle % 73 == 0) && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 5)) {
+- pzfd = &goomInfo->update.zoomFilterData;
+- goomInfo->update.zoomFilterData.vitesse++;
+- }
+-
+- /*
+- * arreter de decrémenter au bout d'un certain temps
+- */
+- if ((goomInfo->cycle % 101 == 0) && (goomInfo->update.zoomFilterData.pertedec == 7)) {
+- pzfd = &goomInfo->update.zoomFilterData;
+- goomInfo->update.zoomFilterData.pertedec = 8;
+- goomInfo->update.zoomFilterData.sqrtperte = 16;
+- }
+-
+- /*
+- * Permet de forcer un effet.
+- */
+- if ((forceMode > 0) && (forceMode <= NB_FX)) {
+- pzfd = &goomInfo->update.zoomFilterData;
+- pzfd->mode = forceMode - 1;
+- }
+-
+- if (forceMode == -1) {
+- pzfd = NULL;
+- }
+-
+- /*
+- * Changement d'effet de zoom !
+- */
+- if (pzfd != NULL) {
+- int dif;
+-
+- goomInfo->update.cyclesSinceLastChange = 0;
+-
+- goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount;
+-
+- dif = goomInfo->update.zoomFilterData.vitesse - goomInfo->update.previousZoomSpeed;
+- if (dif < 0)
+- dif = -dif;
+-
+- if (dif > 2) {
+- goomInfo->update.switchIncr *= (dif + 2) / 2;
+- }
+- goomInfo->update.previousZoomSpeed = goomInfo->update.zoomFilterData.vitesse;
+- goomInfo->update.switchMult = 1.0f;
+-
+- if (((goomInfo->sound.timeSinceLastGoom == 0)
+- && (goomInfo->sound.totalgoom < 2)) || (forceMode > 0)) {
+- goomInfo->update.switchIncr = 0;
+- goomInfo->update.switchMult = goomInfo->update.switchMultAmount;
+- }
+- }
+- else {
+- if (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG) {
+- pzfd = &goomInfo->update.zoomFilterData;
+- goomInfo->update.cyclesSinceLastChange = 0;
+- }
+- else
+- goomInfo->update.cyclesSinceLastChange++;
+- }
+-
+-#ifdef VERBOSE
+- if (pzfd) {
+- printf ("GOOM: pzfd->mode = %d\n", pzfd->mode);
+- }
+-#endif
+-
+- /* Zoom here ! */
+- zoomFilterFastRGB (goomInfo, goomInfo->p1, goomInfo->p2, pzfd, goomInfo->screen.width, goomInfo->screen.height,
+- goomInfo->update.switchIncr, goomInfo->update.switchMult);
+-
+- /*
+- * Affichage tentacule
+- */
+-
+- goomInfo->tentacles_fx.apply(&goomInfo->tentacles_fx, goomInfo->p1, goomInfo->p2, goomInfo);
+- goomInfo->star_fx.apply (&goomInfo->star_fx,goomInfo->p2,goomInfo->p1,goomInfo);
+-
+- /*
+- * Affichage de texte
+- */
+- {
+- /*char title[1024];*/
+- char text[64];
+-
+- /*
+- * Le message
+- */
+- update_message (goomInfo, message);
+-
+- if (fps > 0) {
+- sprintf (text, "%2.0f fps", fps);
+- goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height,
+- 10, 24, text, 1, 0);
+- }
+-
+- /*
+- * Le titre
+- */
+- if (songTitle != NULL) {
+- strncpy (goomInfo->update.titleText, songTitle, 1023);
+- goomInfo->update.titleText[1023]=0;
+- goomInfo->update.timeOfTitleDisplay = 200;
+- }
+-
+- if (goomInfo->update.timeOfTitleDisplay) {
+- goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height,
+- goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText,
+- ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1);
+- goomInfo->update.timeOfTitleDisplay--;
+- if (goomInfo->update.timeOfTitleDisplay < 4)
+- goom_draw_text (goomInfo->p2,goomInfo->screen.width,goomInfo->screen.height,
+- goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText,
+- ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1);
+- }
+- }
+-
+- /*
+- * Gestion du Scope
+- */
+-
+- /*
+- * arret demande
+- */
+- if ((goomInfo->update.stop_lines & 0xf000)||(!goomInfo->curGState->drawScope)) {
+- float param1, param2, amplitude;
+- int couleur;
+- int mode;
+-
+- choose_a_goom_line (goomInfo, &param1, &param2, &couleur, &mode, &amplitude,1);
+- couleur = GML_BLACK;
+-
+- goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur);
+- goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur);
+- goomInfo->update.stop_lines &= 0x0fff;
+- }
+-
+- /*
+- * arret aleatore.. changement de mode de ligne..
+- */
+- if (goomInfo->update.lineMode != goomInfo->update.drawLinesDuration) {
+- goomInfo->update.lineMode--;
+- if (goomInfo->update.lineMode == -1)
+- goomInfo->update.lineMode = 0;
+- }
+- else
+- if ((goomInfo->cycle%80==0)&&(goom_irand(goomInfo->gRandom,5)==0)&&goomInfo->update.lineMode)
+- goomInfo->update.lineMode--;
+-
+- if ((goomInfo->cycle % 120 == 0)
+- && (goom_irand(goomInfo->gRandom,4) == 0)
+- && (goomInfo->curGState->drawScope)) {
+- if (goomInfo->update.lineMode == 0)
+- goomInfo->update.lineMode = goomInfo->update.drawLinesDuration;
+- else if (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration) {
+- float param1, param2, amplitude;
+- int couleur1,couleur2;
+- int mode;
+-
+- goomInfo->update.lineMode--;
+- choose_a_goom_line (goomInfo, &param1, &param2, &couleur1,
+- &mode, &amplitude,goomInfo->update.stop_lines);
+-
+- couleur2 = 5-couleur1;
+- if (goomInfo->update.stop_lines) {
+- goomInfo->update.stop_lines--;
+- if (goom_irand(goomInfo->gRandom,2))
+- couleur2=couleur1 = GML_BLACK;
+- }
+-
+- goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1);
+- goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2);
+- }
+- }
+-
+- /*
+- * si on est dans un goom : afficher les lignes...
+- */
+- if ((goomInfo->update.lineMode != 0) || (goomInfo->sound.timeSinceLastGoom < 5)) {
+- goomInfo->gmline2->power = goomInfo->gmline1->power;
+-
+- goom_lines_draw (goomInfo, goomInfo->gmline1, data[0], goomInfo->p2);
+- goom_lines_draw (goomInfo, goomInfo->gmline2, data[1], goomInfo->p2);
+-
+- if (((goomInfo->cycle % 121) == 9) && (goom_irand(goomInfo->gRandom,3) == 1)
+- && ((goomInfo->update.lineMode == 0) || (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration))) {
+- float param1, param2, amplitude;
+- int couleur1,couleur2;
+- int mode;
+-
+- choose_a_goom_line (goomInfo, &param1, &param2, &couleur1,
+- &mode, &amplitude, goomInfo->update.stop_lines);
+- couleur2 = 5-couleur1;
+-
+- if (goomInfo->update.stop_lines) {
+- goomInfo->update.stop_lines--;
+- if (goom_irand(goomInfo->gRandom,2))
+- couleur2=couleur1 = GML_BLACK;
+- }
+- goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1);
+- goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2);
+- }
+- }
+-
+- return_val = goomInfo->p1;
+- tmp = goomInfo->p1;
+- goomInfo->p1 = goomInfo->p2;
+- goomInfo->p2 = tmp;
+-
+- /* affichage et swappage des buffers.. */
+- goomInfo->cycle++;
+-
+- goomInfo->convolve_fx.apply(&goomInfo->convolve_fx,return_val,goomInfo->outputBuf,goomInfo);
+-
+- return (guint32*)goomInfo->outputBuf;
+-}
+-
+-/****************************************
+-* CLOSE *
+-****************************************/
+-void goom_close (PluginInfo *goomInfo)
+-{
+- if (goomInfo->pixel != NULL)
+- free (goomInfo->pixel);
+- if (goomInfo->back != NULL)
+- free (goomInfo->back);
+- if (goomInfo->conv != NULL)
+- free (goomInfo->conv);
+-
+- goomInfo->pixel = goomInfo->back = NULL;
+- goomInfo->conv = NULL;
+- goom_random_free(goomInfo->gRandom);
+- goom_lines_free (&goomInfo->gmline1);
+- goom_lines_free (&goomInfo->gmline2);
+-
+- /* release_ifs (); */
+- goomInfo->ifs_fx.free(&goomInfo->ifs_fx);
+- goomInfo->convolve_fx.free(&goomInfo->convolve_fx);
+- goomInfo->star_fx.free(&goomInfo->star_fx);
+- goomInfo->tentacles_fx.free(&goomInfo->tentacles_fx);
+- goomInfo->zoomFilter_fx.free(&goomInfo->zoomFilter_fx);
+-
+- free(goomInfo);
+-}
+-
+-
+-/* *** */
+-void
+-choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, int *mode,
+- float *amplitude, int far)
+-{
+- *mode = goom_irand(goomInfo->gRandom,3);
+- *amplitude = 1.0f;
+- switch (*mode) {
+- case GML_CIRCLE:
+- if (far) {
+- *param1 = *param2 = 0.47f;
+- *amplitude = 0.8f;
+- break;
+- }
+- if (goom_irand(goomInfo->gRandom,3) == 0) {
+- *param1 = *param2 = 0;
+- *amplitude = 3.0f;
+- }
+- else if (goom_irand(goomInfo->gRandom,2)) {
+- *param1 = 0.40f * goomInfo->screen.height;
+- *param2 = 0.22f * goomInfo->screen.height;
+- }
+- else {
+- *param1 = *param2 = goomInfo->screen.height * 0.35;
+- }
+- break;
+- case GML_HLINE:
+- if (goom_irand(goomInfo->gRandom,4) || far) {
+- *param1 = goomInfo->screen.height / 7;
+- *param2 = 6.0f * goomInfo->screen.height / 7.0f;
+- }
+- else {
+- *param1 = *param2 = goomInfo->screen.height / 2.0f;
+- *amplitude = 2.0f;
+- }
+- break;
+- case GML_VLINE:
+- if (goom_irand(goomInfo->gRandom,3) || far) {
+- *param1 = goomInfo->screen.width / 7.0f;
+- *param2 = 6.0f * goomInfo->screen.width / 7.0f;
+- }
+- else {
+- *param1 = *param2 = goomInfo->screen.width / 2.0f;
+- *amplitude = 1.5f;
+- }
+- break;
+- }
+-
+- *couleur = goom_irand(goomInfo->gRandom,6);
+-}
+-
+-#define ECART_VARIATION 1.5
+-#define POS_VARIATION 3.0
+-#define SCROLLING_SPEED 80
+-
+-/*
+- * Met a jour l'affichage du message defilant
+- */
+-void update_message (PluginInfo *goomInfo, char *message) {
+-
+- int fin = 0;
+-
+- if (message) {
+- int i=1,j=0;
+- sprintf (goomInfo->update_message.message, message);
+- for (j=0;goomInfo->update_message.message[j];j++)
+- if (goomInfo->update_message.message[j]=='\n')
+- i++;
+- goomInfo->update_message.numberOfLinesInMessage = i;
+- goomInfo->update_message.affiche = goomInfo->screen.height + goomInfo->update_message.numberOfLinesInMessage * 25 + 105;
+- goomInfo->update_message.longueur = strlen(goomInfo->update_message.message);
+- }
+- if (goomInfo->update_message.affiche) {
+- int i = 0;
+- char *msg = malloc(goomInfo->update_message.longueur + 1);
+- char *ptr = msg;
+- int pos;
+- float ecart;
+- message = msg;
+- sprintf (msg, goomInfo->update_message.message);
+-
+- while (!fin) {
+- while (1) {
+- if (*ptr == 0) {
+- fin = 1;
+- break;
+- }
+- if (*ptr == '\n') {
+- *ptr = 0;
+- break;
+- }
+- ++ptr;
+- }
+- pos = goomInfo->update_message.affiche - (goomInfo->update_message.numberOfLinesInMessage - i)*25;
+- pos += POS_VARIATION * (cos((double)pos / 20.0));
+- pos -= SCROLLING_SPEED;
+- ecart = (ECART_VARIATION * sin((double)pos / 20.0));
+- if ((fin) && (2 * pos < (int)goomInfo->screen.height))
+- pos = (int)goomInfo->screen.height / 2;
+- pos += 7;
+-
+- goom_draw_text(goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height,
+- goomInfo->screen.width/2, pos,
+- message,
+- ecart,
+- 1);
+- message = ++ptr;
+- i++;
+- }
+- goomInfo->update_message.affiche --;
+- free (msg);
+- }
+-}
+-
+diff -Naur /home/d4rk/goom2k4-0/src/goom_filters.h /src/goom_filters.h
+--- /home/d4rk/goom2k4-0/src/goom_filters.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom_filters.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,52 +0,0 @@
+-#ifndef FILTERS_H
+-#define FILTERS_H
+-
+-#include "goom_config.h"
+-#include "goom_typedefs.h"
+-#include "goom_visual_fx.h"
+-#include "goom_graphic.h"
+-
+-VisualFX zoomFilterVisualFXWrapper_create(void);
+-
+-struct _ZOOM_FILTER_DATA
+-{
+- int vitesse; /* 128 = vitesse nule... * * 256 = en arriere
+- * hyper vite.. * * 0 = en avant hype vite. */
+- unsigned char pertedec;
+- unsigned char sqrtperte;
+- int middleX, middleY; /* milieu de l'effet */
+- char reverse; /* inverse la vitesse */
+- char mode; /* type d'effet à appliquer (cf les #define) */
+- /** @since June 2001 */
+- int hPlaneEffect; /* deviation horitontale */
+- int vPlaneEffect; /* deviation verticale */
+- /** @since April 2002 */
+- int waveEffect; /* applique une "surcouche" de wave effect */
+- int hypercosEffect; /* applique une "surcouche de hypercos effect */
+-
+- char noisify; /* ajoute un bruit a la transformation */
+-};
+-
+-#define NORMAL_MODE 0
+-#define WAVE_MODE 1
+-#define CRYSTAL_BALL_MODE 2
+-#define SCRUNCH_MODE 3
+-#define AMULETTE_MODE 4
+-#define WATER_MODE 5
+-#define HYPERCOS1_MODE 6
+-#define HYPERCOS2_MODE 7
+-#define YONLY_MODE 8
+-#define SPEEDWAY_MODE 9
+-
+-void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c,
+- float t1, float t2, float t3, float t4, guint32 cycle);
+-
+-/* filtre de zoom :
+- * le contenu de pix1 est copie dans pix2.
+- * zf : si non NULL, configure l'effet.
+- * resx,resy : taille des buffers.
+- */
+-void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, guint32 resx,
+- guint32 resy, int switchIncr, float switchMult);
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/goom_fx.h /src/goom_fx.h
+--- /home/d4rk/goom2k4-0/src/goom_fx.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom_fx.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,12 +0,0 @@
+-#ifndef _GOOM_FX_H
+-#define _GOOM_FX_H
+-
+-#include "goom_visual_fx.h"
+-#include "goom_plugin_info.h"
+-
+-VisualFX convolve_create ();
+-VisualFX flying_star_create (void);
+-
+-void zoom_filter_c(int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/goom_graphic.h /src/goom_graphic.h
+--- /home/d4rk/goom2k4-0/src/goom_graphic.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom_graphic.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,74 +0,0 @@
+-#ifndef GRAPHIC_H
+-#define GRAPHIC_H
+-
+-typedef unsigned int Uint;
+-
+-typedef struct
+-{
+- unsigned short r, v, b;
+-}
+-Color;
+-
+-extern const Color BLACK;
+-extern const Color WHITE;
+-extern const Color RED;
+-extern const Color BLUE;
+-extern const Color GREEN;
+-extern const Color YELLOW;
+-extern const Color ORANGE;
+-extern const Color VIOLET;
+-
+-
+-#ifdef COLOR_BGRA
+-
+-#define B_CHANNEL 0xFF000000
+-#define G_CHANNEL 0x00FF0000
+-#define R_CHANNEL 0x0000FF00
+-#define A_CHANNEL 0x000000FF
+-#define B_OFFSET 24
+-#define G_OFFSET 16
+-#define R_OFFSET 8
+-#define A_OFFSET 0
+-
+-typedef union _PIXEL {
+- struct {
+- unsigned char b;
+- unsigned char g;
+- unsigned char r;
+- unsigned char a;
+- } channels;
+- unsigned int val;
+- unsigned char cop[4];
+-} Pixel;
+-
+-#else
+-
+-#define A_CHANNEL 0xFF000000
+-#define R_CHANNEL 0x00FF0000
+-#define G_CHANNEL 0x0000FF00
+-#define B_CHANNEL 0x000000FF
+-#define A_OFFSET 24
+-#define R_OFFSET 16
+-#define G_OFFSET 8
+-#define B_OFFSET 0
+-
+-typedef union _PIXEL {
+- struct {
+- unsigned char a;
+- unsigned char r;
+- unsigned char g;
+- unsigned char b;
+- } channels;
+- unsigned int val;
+- unsigned char cop[4];
+-} Pixel;
+-
+-#endif /* COLOR_BGRA */
+-
+-/*
+-inline void setPixelRGB (Pixel * buffer, Uint x, Uint y, Color c);
+-inline void getPixelRGB (Pixel * buffer, Uint x, Uint y, Color * c);
+-*/
+-
+-
+-#endif /* GRAPHIC_H */
+diff -Naur /home/d4rk/goom2k4-0/src/goom.h /src/goom.h
+--- /home/d4rk/goom2k4-0/src/goom.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,30 +0,0 @@
+-#ifndef _GOOMCORE_H
+-#define _GOOMCORE_H
+-
+-#include "goom_config.h"
+-#include "goom_plugin_info.h"
+-#include "goomsl.h"
+-
+-#define NB_FX 10
+-
+-PluginInfo *goom_init (guint32 resx, guint32 resy);
+-void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy);
+-
+-/*
+- * forceMode == 0 : do nothing
+- * forceMode == -1 : lock the FX
+- * forceMode == 1..NB_FX : force a switch to FX n# forceMode
+- *
+- * songTitle = pointer to the title of the song...
+- * - NULL if it is not the start of the song
+- * - only have a value at the start of the song
+- */
+-guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], int forceMode, float fps,
+- char *songTitle, char *message);
+-
+-/* returns 0 if the buffer wasn't accepted */
+-int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer);
+-
+-void goom_close (PluginInfo *goomInfo);
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/goom_hash.c /src/goom_hash.c
+--- /home/d4rk/goom2k4-0/src/goom_hash.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom_hash.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,100 +0,0 @@
+-#include "goom_hash.h"
+-#include <string.h>
+-#include <stdlib.h>
+-
+-static GoomHashEntry *entry_new(const char *key, HashValue value) {
+-
+- GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry));
+-
+- entry->key = (char *)malloc(strlen(key)+1);
+- strcpy(entry->key,key);
+- entry->value = value;
+- entry->lower = NULL;
+- entry->upper = NULL;
+-
+- return entry;
+-}
+-
+-static void entry_free(GoomHashEntry *entry) {
+- if (entry!=NULL) {
+- entry_free(entry->lower);
+- entry_free(entry->upper);
+- free(entry->key);
+- free(entry);
+- }
+-}
+-
+-static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) {
+- int cmp = strcmp(key,entry->key);
+- if (cmp==0) {
+- entry->value = value;
+- }
+- else if (cmp > 0) {
+- if (entry->upper == NULL)
+- entry->upper = entry_new(key,value);
+- else
+- entry_put(entry->upper, key, value);
+- }
+- else {
+- if (entry->lower == NULL)
+- entry->lower = entry_new(key,value);
+- else
+- entry_put(entry->lower, key, value);
+- }
+-}
+-
+-static HashValue *entry_get(GoomHashEntry *entry, const char *key) {
+-
+- int cmp;
+- if (entry==NULL)
+- return NULL;
+- cmp = strcmp(key,entry->key);
+- if (cmp > 0)
+- return entry_get(entry->upper, key);
+- else if (cmp < 0)
+- return entry_get(entry->lower, key);
+- else
+- return &(entry->value);
+-}
+-
+-GoomHash *goom_hash_new(void) {
+- GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash));
+- _this->root = NULL;
+- return _this;
+-}
+-
+-void goom_hash_free(GoomHash *_this) {
+- entry_free(_this->root);
+- free(_this);
+-}
+-
+-void goom_hash_put(GoomHash *_this, const char *key, HashValue value) {
+- if (_this->root == NULL)
+- _this->root = entry_new(key,value);
+- else
+- entry_put(_this->root,key,value);
+-}
+-
+-HashValue *goom_hash_get(GoomHash *_this, const char *key) {
+- return entry_get(_this->root,key);
+-}
+-
+-void goom_hash_put_int(GoomHash *_this, const char *key, int i) {
+- HashValue value;
+- value.i = i;
+- goom_hash_put(_this,key,value);
+-}
+-
+-void goom_hash_put_float(GoomHash *_this, const char *key, float f) {
+- HashValue value;
+- value.f = f;
+- goom_hash_put(_this,key,value);
+-}
+-
+-void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) {
+- HashValue value;
+- value.ptr = ptr;
+- goom_hash_put(_this,key,value);
+-}
+-
+-
+diff -Naur /home/d4rk/goom2k4-0/src/goom_hash.h /src/goom_hash.h
+--- /home/d4rk/goom2k4-0/src/goom_hash.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom_hash.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,34 +0,0 @@
+-#ifndef _GOOM_HASH_H
+-#define _GOOM_HASH_H
+-
+-typedef struct GOOM_HASH_ENTRY GoomHashEntry;
+-typedef struct GOOM_HASH GoomHash;
+-
+-typedef union {
+- void *ptr;
+- int i;
+- float f;
+-} HashValue;
+-
+-struct GOOM_HASH_ENTRY {
+- char *key;
+- HashValue value;
+- GoomHashEntry *lower;
+- GoomHashEntry *upper;
+-};
+-
+-struct GOOM_HASH {
+- GoomHashEntry *root;
+-};
+-
+-GoomHash *goom_hash_new(void);
+-void goom_hash_free(GoomHash *gh);
+-
+-void goom_hash_put(GoomHash *gh, const char *key, HashValue value);
+-HashValue *goom_hash_get(GoomHash *gh, const char *key);
+-
+-void goom_hash_put_int(GoomHash *_this, const char *key, int i);
+-void goom_hash_put_float(GoomHash *_this, const char *key, float f);
+-void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr);
+-
+-#endif /* _GOOM_HASH_H */
+diff -Naur /home/d4rk/goom2k4-0/src/goom_plugin_info.h /src/goom_plugin_info.h
+--- /home/d4rk/goom2k4-0/src/goom_plugin_info.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom_plugin_info.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,176 +0,0 @@
+-#ifndef _PLUGIN_INFO_H
+-#define _PLUGIN_INFO_H
+-
+-#include "goom_typedefs.h"
+-
+-#include "goom_config.h"
+-
+-#include "goom_graphic.h"
+-#include "goom_config_param.h"
+-#include "goom_visual_fx.h"
+-#include "goom_filters.h"
+-#include "goom_tools.h"
+-#include "goomsl.h"
+-
+-typedef struct {
+- char drawIFS;
+- char drawPoints;
+- char drawTentacle;
+-
+- char drawScope;
+- int farScope;
+-
+- int rangemin;
+- int rangemax;
+-} GoomState;
+-
+-#define STATES_MAX_NB 128
+-
+-/**
+- * Gives informations about the sound.
+- */
+-struct _SOUND_INFO {
+-
+- /* nota : a Goom is just a sound event... */
+-
+- int timeSinceLastGoom; /* >= 0 */
+- float goomPower; /* power of the last Goom [0..1] */
+-
+- int timeSinceLastBigGoom; /* >= 0 */
+-
+- float volume; /* [0..1] */
+- short samples[2][512];
+-
+- /* other "internal" datas for the sound_tester */
+- float goom_limit; /* auto-updated limit of goom_detection */
+- float bigGoomLimit;
+- float accelvar; /* acceleration of the sound - [0..1] */
+- float speedvar; /* speed of the sound - [0..100] */
+- int allTimesMax;
+- int totalgoom; /* number of goom since last reset
+- * (a reset every 64 cycles) */
+-
+- float prov_max; /* accel max since last reset */
+-
+- int cycle;
+-
+- /* private */
+- PluginParam volume_p;
+- PluginParam speed_p;
+- PluginParam accel_p;
+- PluginParam goom_limit_p;
+- PluginParam goom_power_p;
+- PluginParam last_goom_p;
+- PluginParam last_biggoom_p;
+- PluginParam biggoom_speed_limit_p;
+- PluginParam biggoom_factor_p;
+-
+- PluginParameters params; /* contains the previously defined parameters. */
+-};
+-
+-
+-/**
+- * Allows FXs to know the current state of the plugin.
+- */
+-struct _PLUGIN_INFO {
+-
+- /* public datas */
+-
+- int nbParams;
+- PluginParameters *params;
+-
+- /* private datas */
+-
+- struct _SIZE_TYPE {
+- int width;
+- int height;
+- int size; /* == screen.height * screen.width. */
+- } screen;
+-
+- SoundInfo sound;
+-
+- int nbVisuals;
+- VisualFX **visuals; /* pointers on all the visual fx */
+-
+- /** The known FX */
+- VisualFX convolve_fx;
+- VisualFX star_fx;
+- VisualFX zoomFilter_fx;
+- VisualFX tentacles_fx;
+- VisualFX ifs_fx;
+-
+- /** image buffers */
+- guint32 *pixel;
+- guint32 *back;
+- Pixel *p1, *p2;
+- Pixel *conv;
+- Pixel *outputBuf;
+-
+- /** state of goom */
+- guint32 cycle;
+- GoomState states[STATES_MAX_NB];
+- int statesNumber;
+- int statesRangeMax;
+-
+- GoomState *curGState;
+-
+- /** effet de ligne.. */
+- GMLine *gmline1;
+- GMLine *gmline2;
+-
+- /** sinus table */
+- int sintable[0x10000];
+-
+- /* INTERNALS */
+-
+- /** goom_update internals.
+- * I took all static variables from goom_update and put them here.. for the moment.
+- */
+- struct {
+- int lockvar; /* pour empecher de nouveaux changements */
+- int goomvar; /* boucle des gooms */
+- int loopvar; /* mouvement des points */
+- int stop_lines;
+- int ifs_incr; /* dessiner l'ifs (0 = non: > = increment) */
+- int decay_ifs; /* disparition de l'ifs */
+- int recay_ifs; /* dedisparition de l'ifs */
+- int cyclesSinceLastChange; /* nombre de Cycle Depuis Dernier Changement */
+- int drawLinesDuration; /* duree de la transition entre afficher les lignes ou pas */
+- int lineMode; /* l'effet lineaire a dessiner */
+- float switchMultAmount; /* SWITCHMULT (29.0f/30.0f) */
+- int switchIncrAmount; /* 0x7f */
+- float switchMult; /* 1.0f */
+- int switchIncr; /* = SWITCHINCR; */
+- int stateSelectionRnd;
+- int stateSelectionBlocker;
+- int previousZoomSpeed;
+- int timeOfTitleDisplay;
+- char titleText[1024];
+- ZoomFilterData zoomFilterData;
+- } update;
+-
+- struct {
+- int numberOfLinesInMessage;
+- char message[0x800];
+- int affiche;
+- int longueur;
+- } update_message;
+-
+- struct {
+- void (*draw_line) (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny);
+- void (*zoom_filter) (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
+- } methods;
+-
+- GoomRandom *gRandom;
+-
+- GoomSL *scanner;
+- GoomSL *main_scanner;
+- const char *main_script_str;
+-};
+-
+-void plugin_info_init(PluginInfo *p, int nbVisual);
+-
+-/* i = [0..p->nbVisual-1] */
+-void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual);
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/goomsl.c /src/goomsl.c
+--- /home/d4rk/goom2k4-0/src/goomsl.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/goomsl.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,1509 +0,0 @@
+-#include <math.h>
+-#include <stdlib.h>
+-#include <stdio.h>
+-#include <string.h>
+-#include "goomsl.h"
+-#include "goomsl_private.h"
+-#include "goomsl_yacc.h"
+-
+-/*#define TRACE_SCRIPT*/
+-
+- /* {{{ definition of the instructions number */
+-#define INSTR_SETI_VAR_INTEGER 1
+-#define INSTR_SETI_VAR_VAR 2
+-#define INSTR_SETF_VAR_FLOAT 3
+-#define INSTR_SETF_VAR_VAR 4
+-#define INSTR_NOP 5
+-/* #define INSTR_JUMP 6 */
+-#define INSTR_SETP_VAR_PTR 7
+-#define INSTR_SETP_VAR_VAR 8
+-#define INSTR_SUBI_VAR_INTEGER 9
+-#define INSTR_SUBI_VAR_VAR 10
+-#define INSTR_SUBF_VAR_FLOAT 11
+-#define INSTR_SUBF_VAR_VAR 12
+-#define INSTR_ISLOWERF_VAR_VAR 13
+-#define INSTR_ISLOWERF_VAR_FLOAT 14
+-#define INSTR_ISLOWERI_VAR_VAR 15
+-#define INSTR_ISLOWERI_VAR_INTEGER 16
+-#define INSTR_ADDI_VAR_INTEGER 17
+-#define INSTR_ADDI_VAR_VAR 18
+-#define INSTR_ADDF_VAR_FLOAT 19
+-#define INSTR_ADDF_VAR_VAR 20
+-#define INSTR_MULI_VAR_INTEGER 21
+-#define INSTR_MULI_VAR_VAR 22
+-#define INSTR_MULF_VAR_FLOAT 23
+-#define INSTR_MULF_VAR_VAR 24
+-#define INSTR_DIVI_VAR_INTEGER 25
+-#define INSTR_DIVI_VAR_VAR 26
+-#define INSTR_DIVF_VAR_FLOAT 27
+-#define INSTR_DIVF_VAR_VAR 28
+-/* #define INSTR_JZERO 29 */
+-#define INSTR_ISEQUALP_VAR_VAR 30
+-#define INSTR_ISEQUALP_VAR_PTR 31
+-#define INSTR_ISEQUALI_VAR_VAR 32
+-#define INSTR_ISEQUALI_VAR_INTEGER 33
+-#define INSTR_ISEQUALF_VAR_VAR 34
+-#define INSTR_ISEQUALF_VAR_FLOAT 35
+-/* #define INSTR_CALL 36 */
+-/* #define INSTR_RET 37 */
+-/* #define INSTR_EXT_CALL 38 */
+-#define INSTR_NOT_VAR 39
+-/* #define INSTR_JNZERO 40 */
+-#define INSTR_SETS_VAR_VAR 41
+-#define INSTR_ISEQUALS_VAR_VAR 42
+-#define INSTR_ADDS_VAR_VAR 43
+-#define INSTR_SUBS_VAR_VAR 44
+-#define INSTR_MULS_VAR_VAR 45
+-#define INSTR_DIVS_VAR_VAR 46
+-
+- /* }}} */
+-/* {{{ definition of the validation error types */
+-static const char *VALIDATE_OK = "ok";
+-#define VALIDATE_ERROR "error while validating "
+-#define VALIDATE_TODO "todo"
+-#define VALIDATE_SYNTHAX_ERROR "synthax error"
+-#define VALIDATE_NO_SUCH_INT "no such integer variable"
+-#define VALIDATE_NO_SUCH_VAR "no such variable"
+-#define VALIDATE_NO_SUCH_DEST_VAR "no such destination variable"
+-#define VALIDATE_NO_SUCH_SRC_VAR "no such src variable"
+-/* }}} */
+-
+- /***********************************/
+- /* PROTOTYPE OF INTERNAL FUNCTIONS */
+-/***********************************/
+-
+-/* {{{ */
+-static void gsl_instr_free(Instruction *_this);
+-static const char *gsl_instr_validate(Instruction *_this);
+-static void gsl_instr_display(Instruction *_this);
+-
+-static InstructionFlow *iflow_new(void);
+-static void iflow_add_instr(InstructionFlow *_this, Instruction *instr);
+-static void iflow_clean(InstructionFlow *_this);
+-static void iflow_free(InstructionFlow *_this);
+-static void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl);
+-/* }}} */
+-
+- /************************************/
+- /* DEFINITION OF INTERNAL FUNCTIONS */
+-/************************************/
+-
+-void iflow_free(InstructionFlow *_this)
+-{ /* {{{ */
+- goom_hash_free(_this->labels);
+- free(_this); /*TODO: finir cette fonction */
+-} /* }}} */
+-
+-void iflow_clean(InstructionFlow *_this)
+-{ /* {{{ */
+- /* TODO: clean chaque instruction du flot */
+- _this->number = 0;
+- goom_hash_free(_this->labels);
+- _this->labels = goom_hash_new();
+-} /* }}} */
+-
+-InstructionFlow *iflow_new(void)
+-{ /* {{{ */
+- InstructionFlow *_this = (InstructionFlow*)malloc(sizeof(InstructionFlow));
+- _this->number = 0;
+- _this->tabsize = 6;
+- _this->instr = (Instruction**)malloc(_this->tabsize * sizeof(Instruction*));
+- _this->labels = goom_hash_new();
+-
+- return _this;
+-} /* }}} */
+-
+-void iflow_add_instr(InstructionFlow *_this, Instruction *instr)
+-{ /* {{{ */
+- if (_this->number == _this->tabsize) {
+- _this->tabsize *= 2;
+- _this->instr = (Instruction**)realloc(_this->instr, _this->tabsize * sizeof(Instruction*));
+- }
+- _this->instr[_this->number] = instr;
+- instr->address = _this->number;
+- _this->number++;
+-} /* }}} */
+-
+-void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns)
+-{ /* {{{ */
+- if (_this->cur_param <= 0) {
+- fprintf(stderr, "ERROR: Line %d, No more params to instructions\n", _this->line_number);
+- exit(1);
+- }
+- _this->vnamespace[_this->cur_param-1] = ns;
+-} /* }}} */
+-
+-void gsl_instr_add_param(Instruction *instr, char *param, int type)
+-{ /* {{{ */
+- int len;
+- if (instr==NULL)
+- return;
+- if (instr->cur_param==0)
+- return;
+- --instr->cur_param;
+- len = strlen(param);
+- instr->params[instr->cur_param] = (char*)malloc(len+1);
+- strcpy(instr->params[instr->cur_param], param);
+- instr->types[instr->cur_param] = type;
+- if (instr->cur_param == 0) {
+-
+- const char *result = gsl_instr_validate(instr);
+- if (result != VALIDATE_OK) {
+- printf("ERROR: Line %d: ", instr->parent->num_lines + 1);
+- gsl_instr_display(instr);
+- printf("... %s\n", result);
+- instr->parent->compilationOK = 0;
+- exit(1);
+- }
+-
+-#if USE_JITC_X86
+- iflow_add_instr(instr->parent->iflow, instr);
+-#else
+- if (instr->id != INSTR_NOP)
+- iflow_add_instr(instr->parent->iflow, instr);
+- else
+- gsl_instr_free(instr);
+-#endif
+- }
+-} /* }}} */
+-
+-Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number)
+-{ /* {{{ */
+- Instruction *instr = (Instruction*)malloc(sizeof(Instruction));
+- instr->params = (char**)malloc(nb_param*sizeof(char*));
+- instr->vnamespace = (GoomHash**)malloc(nb_param*sizeof(GoomHash*));
+- instr->types = (int*)malloc(nb_param*sizeof(int));
+- instr->cur_param = instr->nb_param = nb_param;
+- instr->parent = parent;
+- instr->id = id;
+- instr->name = name;
+- instr->jump_label = NULL;
+- instr->line_number = line_number;
+- return instr;
+-} /* }}} */
+-
+-void gsl_instr_free(Instruction *_this)
+-{ /* {{{ */
+- int i;
+- free(_this->types);
+- for (i=_this->cur_param; i<_this->nb_param; ++i)
+- free(_this->params[i]);
+- free(_this->params);
+- free(_this);
+-} /* }}} */
+-
+-void gsl_instr_display(Instruction *_this)
+-{ /* {{{ */
+- int i=_this->nb_param-1;
+- printf("%s", _this->name);
+- while(i>=_this->cur_param) {
+- printf(" %s", _this->params[i]);
+- --i;
+- }
+-} /* }}} */
+-
+- /****************************************/
+- /* VALIDATION OF INSTRUCTION PARAMETERS */
+-/****************************************/
+-
+-static const char *validate_v_v(Instruction *_this)
+-{ /* {{{ */
+- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]);
+- HashValue *src = goom_hash_get(_this->vnamespace[0], _this->params[0]);
+-
+- if (dest == NULL) {
+- return VALIDATE_NO_SUCH_DEST_VAR;
+- }
+- if (src == NULL) {
+- return VALIDATE_NO_SUCH_SRC_VAR;
+- }
+- _this->data.udest.var = dest->ptr;
+- _this->data.usrc.var = src->ptr;
+- return VALIDATE_OK;
+-} /* }}} */
+-
+-static const char *validate_v_i(Instruction *_this)
+-{ /* {{{ */
+- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]);
+- _this->data.usrc.value_int = strtol(_this->params[0],NULL,0);
+-
+- if (dest == NULL) {
+- return VALIDATE_NO_SUCH_INT;
+- }
+- _this->data.udest.var = dest->ptr;
+- return VALIDATE_OK;
+-} /* }}} */
+-
+-static const char *validate_v_p(Instruction *_this)
+-{ /* {{{ */
+- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]);
+- _this->data.usrc.value_ptr = strtol(_this->params[0],NULL,0);
+-
+- if (dest == NULL) {
+- return VALIDATE_NO_SUCH_INT;
+- }
+- _this->data.udest.var = dest->ptr;
+- return VALIDATE_OK;
+-} /* }}} */
+-
+-static const char *validate_v_f(Instruction *_this)
+-{ /* {{{ */
+- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]);
+- _this->data.usrc.value_float = atof(_this->params[0]);
+-
+- if (dest == NULL) {
+- return VALIDATE_NO_SUCH_VAR;
+- }
+- _this->data.udest.var = dest->ptr;
+- return VALIDATE_OK;
+-} /* }}} */
+-
+-static const char *validate(Instruction *_this,
+- int vf_f_id, int vf_v_id,
+- int vi_i_id, int vi_v_id,
+- int vp_p_id, int vp_v_id,
+- int vs_v_id)
+-{ /* {{{ */
+- if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FLOAT)) {
+- _this->id = vf_f_id;
+- return validate_v_f(_this);
+- }
+- else if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FVAR)) {
+- _this->id = vf_v_id;
+- return validate_v_v(_this);
+- }
+- else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_INTEGER)) {
+- _this->id = vi_i_id;
+- return validate_v_i(_this);
+- }
+- else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_IVAR)) {
+- _this->id = vi_v_id;
+- return validate_v_v(_this);
+- }
+- else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PTR)) {
+- if (vp_p_id == INSTR_NOP) return VALIDATE_ERROR;
+- _this->id = vp_p_id;
+- return validate_v_p(_this);
+- }
+- else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PVAR)) {
+- _this->id = vp_v_id;
+- if (vp_v_id == INSTR_NOP) return VALIDATE_ERROR;
+- return validate_v_v(_this);
+- }
+- else if ((_this->types[1] < FIRST_RESERVED) && (_this->types[1] >= 0) && (_this->types[0] == _this->types[1])) {
+- _this->id = vs_v_id;
+- if (vs_v_id == INSTR_NOP) return "Impossible operation to perform between two structs";
+- return validate_v_v(_this);
+- }
+- return VALIDATE_ERROR;
+-} /* }}} */
+-
+-const char *gsl_instr_validate(Instruction *_this)
+-{ /* {{{ */
+- if (_this->id != INSTR_EXT_CALL) {
+- int i = _this->nb_param;
+- while (i>0)
+- {
+- i--;
+- if (_this->types[i] == TYPE_VAR) {
+- int type = gsl_type_of_var(_this->vnamespace[i], _this->params[i]);
+-
+- if (type == INSTR_INT)
+- _this->types[i] = TYPE_IVAR;
+- else if (type == INSTR_FLOAT)
+- _this->types[i] = TYPE_FVAR;
+- else if (type == INSTR_PTR)
+- _this->types[i] = TYPE_PVAR;
+- else if ((type >= 0) && (type < FIRST_RESERVED))
+- _this->types[i] = type;
+- else fprintf(stderr,"WARNING: Line %d, %s has no namespace\n", _this->line_number, _this->params[i]);
+- }
+- }
+- }
+-
+- switch (_this->id) {
+-
+- /* set */
+- case INSTR_SET:
+- return validate(_this,
+- INSTR_SETF_VAR_FLOAT, INSTR_SETF_VAR_VAR,
+- INSTR_SETI_VAR_INTEGER, INSTR_SETI_VAR_VAR,
+- INSTR_SETP_VAR_PTR, INSTR_SETP_VAR_VAR,
+- INSTR_SETS_VAR_VAR);
+-
+- /* extcall */
+- case INSTR_EXT_CALL:
+- if (_this->types[0] == TYPE_VAR) {
+- HashValue *fval = goom_hash_get(_this->parent->functions, _this->params[0]);
+- if (fval) {
+- _this->data.udest.external_function = (struct _ExternalFunctionStruct*)fval->ptr;
+- return VALIDATE_OK;
+- }
+- }
+- return VALIDATE_ERROR;
+-
+- /* call */
+- case INSTR_CALL:
+- if (_this->types[0] == TYPE_LABEL) {
+- _this->jump_label = _this->params[0];
+- return VALIDATE_OK;
+- }
+- return VALIDATE_ERROR;
+-
+- /* ret */
+- case INSTR_RET:
+- return VALIDATE_OK;
+-
+- /* jump */
+- case INSTR_JUMP:
+-
+- if (_this->types[0] == TYPE_LABEL) {
+- _this->jump_label = _this->params[0];
+- return VALIDATE_OK;
+- }
+- return VALIDATE_ERROR;
+-
+- /* jzero / jnzero */
+- case INSTR_JZERO:
+- case INSTR_JNZERO:
+-
+- if (_this->types[0] == TYPE_LABEL) {
+- _this->jump_label = _this->params[0];
+- return VALIDATE_OK;
+- }
+- return VALIDATE_ERROR;
+-
+- /* label */
+- case INSTR_LABEL:
+-
+- if (_this->types[0] == TYPE_LABEL) {
+- _this->id = INSTR_NOP;
+- _this->nop_label = _this->params[0];
+- goom_hash_put_int(_this->parent->iflow->labels, _this->params[0], _this->parent->iflow->number);
+- return VALIDATE_OK;
+- }
+- return VALIDATE_ERROR;
+-
+- /* isequal */
+- case INSTR_ISEQUAL:
+- return validate(_this,
+- INSTR_ISEQUALF_VAR_FLOAT, INSTR_ISEQUALF_VAR_VAR,
+- INSTR_ISEQUALI_VAR_INTEGER, INSTR_ISEQUALI_VAR_VAR,
+- INSTR_ISEQUALP_VAR_PTR, INSTR_ISEQUALP_VAR_VAR,
+- INSTR_ISEQUALS_VAR_VAR);
+-
+- /* not */
+- case INSTR_NOT:
+- _this->id = INSTR_NOT_VAR;
+- return VALIDATE_OK;
+-
+- /* islower */
+- case INSTR_ISLOWER:
+- return validate(_this,
+- INSTR_ISLOWERF_VAR_FLOAT, INSTR_ISLOWERF_VAR_VAR,
+- INSTR_ISLOWERI_VAR_INTEGER, INSTR_ISLOWERI_VAR_VAR,
+- INSTR_NOP, INSTR_NOP, INSTR_NOP);
+-
+- /* add */
+- case INSTR_ADD:
+- return validate(_this,
+- INSTR_ADDF_VAR_FLOAT, INSTR_ADDF_VAR_VAR,
+- INSTR_ADDI_VAR_INTEGER, INSTR_ADDI_VAR_VAR,
+- INSTR_NOP, INSTR_NOP,
+- INSTR_ADDS_VAR_VAR);
+-
+- /* mul */
+- case INSTR_MUL:
+- return validate(_this,
+- INSTR_MULF_VAR_FLOAT, INSTR_MULF_VAR_VAR,
+- INSTR_MULI_VAR_INTEGER, INSTR_MULI_VAR_VAR,
+- INSTR_NOP, INSTR_NOP,
+- INSTR_MULS_VAR_VAR);
+-
+- /* sub */
+- case INSTR_SUB:
+- return validate(_this,
+- INSTR_SUBF_VAR_FLOAT, INSTR_SUBF_VAR_VAR,
+- INSTR_SUBI_VAR_INTEGER, INSTR_SUBI_VAR_VAR,
+- INSTR_NOP, INSTR_NOP,
+- INSTR_SUBS_VAR_VAR);
+-
+- /* div */
+- case INSTR_DIV:
+- return validate(_this,
+- INSTR_DIVF_VAR_FLOAT, INSTR_DIVF_VAR_VAR,
+- INSTR_DIVI_VAR_INTEGER, INSTR_DIVI_VAR_VAR,
+- INSTR_NOP,INSTR_NOP,
+- INSTR_DIVS_VAR_VAR);
+-
+- default:
+- return VALIDATE_TODO;
+- }
+- return VALIDATE_ERROR;
+-} /* }}} */
+-
+- /*************/
+- /* EXECUTION */
+-/*************/
+-void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl)
+-{ /* {{{ */
+- int flag = 0;
+- int ip = 0;
+- FastInstruction *instr = _this->instr;
+- int stack[0x10000];
+- int stack_pointer = 0;
+-
+- stack[stack_pointer++] = -1;
+-
+- /* Quelques Macro pour rendre le code plus lisible */
+-#define pSRC_VAR instr[ip].data.usrc.var
+-#define SRC_VAR_INT *instr[ip].data.usrc.var_int
+-#define SRC_VAR_FLOAT *instr[ip].data.usrc.var_float
+-#define SRC_VAR_PTR *instr[ip].data.usrc.var_ptr
+-
+-#define pDEST_VAR instr[ip].data.udest.var
+-#define DEST_VAR_INT *instr[ip].data.udest.var_int
+-#define DEST_VAR_FLOAT *instr[ip].data.udest.var_float
+-#define DEST_VAR_PTR *instr[ip].data.udest.var_ptr
+-
+-#define VALUE_INT instr[ip].data.usrc.value_int
+-#define VALUE_FLOAT instr[ip].data.usrc.value_float
+-#define VALUE_PTR instr[ip].data.usrc.value_ptr
+-
+-#define JUMP_OFFSET instr[ip].data.udest.jump_offset
+-
+-#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1]
+-#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1]
+-#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i]
+-#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i]
+-#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i]
+-#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i]
+-#define DEST_STRUCT_IBLOCK_VAR(i,j) \
+- ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j]
+-#define DEST_STRUCT_FBLOCK_VAR(i,j) \
+- ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j]
+-#define SRC_STRUCT_IBLOCK_VAR(i,j) \
+- ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j]
+-#define SRC_STRUCT_FBLOCK_VAR(i,j) \
+- ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j]
+-#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size
+-
+- while (1)
+- {
+- int i;
+-#ifdef TRACE_SCRIPT
+- printf("execute "); gsl_instr_display(instr[ip].proto); printf("\n");
+-#endif
+- switch (instr[ip].id) {
+-
+- /* SET.I */
+- case INSTR_SETI_VAR_INTEGER:
+- DEST_VAR_INT = VALUE_INT;
+- ++ip; break;
+-
+- case INSTR_SETI_VAR_VAR:
+- DEST_VAR_INT = SRC_VAR_INT;
+- ++ip; break;
+-
+- /* SET.F */
+- case INSTR_SETF_VAR_FLOAT:
+- DEST_VAR_FLOAT = VALUE_FLOAT;
+- ++ip; break;
+-
+- case INSTR_SETF_VAR_VAR:
+- DEST_VAR_FLOAT = SRC_VAR_FLOAT;
+- ++ip; break;
+-
+- /* SET.P */
+- case INSTR_SETP_VAR_VAR:
+- DEST_VAR_PTR = SRC_VAR_PTR;
+- ++ip; break;
+-
+- case INSTR_SETP_VAR_PTR:
+- DEST_VAR_PTR = VALUE_PTR;
+- ++ip; break;
+-
+- /* JUMP */
+- case INSTR_JUMP:
+- ip += JUMP_OFFSET; break;
+-
+- /* JZERO */
+- case INSTR_JZERO:
+- ip += (flag ? 1 : JUMP_OFFSET); break;
+-
+- case INSTR_NOP:
+- ++ip; break;
+-
+- /* ISEQUAL.P */
+- case INSTR_ISEQUALP_VAR_VAR:
+- flag = (DEST_VAR_PTR == SRC_VAR_PTR);
+- ++ip; break;
+-
+- case INSTR_ISEQUALP_VAR_PTR:
+- flag = (DEST_VAR_PTR == VALUE_PTR);
+- ++ip; break;
+-
+- /* ISEQUAL.I */
+- case INSTR_ISEQUALI_VAR_VAR:
+- flag = (DEST_VAR_INT == SRC_VAR_INT);
+- ++ip; break;
+-
+- case INSTR_ISEQUALI_VAR_INTEGER:
+- flag = (DEST_VAR_INT == VALUE_INT);
+- ++ip; break;
+-
+- /* ISEQUAL.F */
+- case INSTR_ISEQUALF_VAR_VAR:
+- flag = (DEST_VAR_FLOAT == SRC_VAR_FLOAT);
+- ++ip; break;
+-
+- case INSTR_ISEQUALF_VAR_FLOAT:
+- flag = (DEST_VAR_FLOAT == VALUE_FLOAT);
+- ++ip; break;
+-
+- /* ISLOWER.I */
+- case INSTR_ISLOWERI_VAR_VAR:
+- flag = (DEST_VAR_INT < SRC_VAR_INT);
+- ++ip; break;
+-
+- case INSTR_ISLOWERI_VAR_INTEGER:
+- flag = (DEST_VAR_INT < VALUE_INT);
+- ++ip; break;
+-
+- /* ISLOWER.F */
+- case INSTR_ISLOWERF_VAR_VAR:
+- flag = (DEST_VAR_FLOAT < SRC_VAR_FLOAT);
+- ++ip; break;
+-
+- case INSTR_ISLOWERF_VAR_FLOAT:
+- flag = (DEST_VAR_FLOAT < VALUE_FLOAT);
+- ++ip; break;
+-
+- /* ADD.I */
+- case INSTR_ADDI_VAR_VAR:
+- DEST_VAR_INT += SRC_VAR_INT;
+- ++ip; break;
+-
+- case INSTR_ADDI_VAR_INTEGER:
+- DEST_VAR_INT += VALUE_INT;
+- ++ip; break;
+-
+- /* ADD.F */
+- case INSTR_ADDF_VAR_VAR:
+- DEST_VAR_FLOAT += SRC_VAR_FLOAT;
+- ++ip; break;
+-
+- case INSTR_ADDF_VAR_FLOAT:
+- DEST_VAR_FLOAT += VALUE_FLOAT;
+- ++ip; break;
+-
+- /* MUL.I */
+- case INSTR_MULI_VAR_VAR:
+- DEST_VAR_INT *= SRC_VAR_INT;
+- ++ip; break;
+-
+- case INSTR_MULI_VAR_INTEGER:
+- DEST_VAR_INT *= VALUE_INT;
+- ++ip; break;
+-
+- /* MUL.F */
+- case INSTR_MULF_VAR_FLOAT:
+- DEST_VAR_FLOAT *= VALUE_FLOAT;
+- ++ip; break;
+-
+- case INSTR_MULF_VAR_VAR:
+- DEST_VAR_FLOAT *= SRC_VAR_FLOAT;
+- ++ip; break;
+-
+- /* DIV.I */
+- case INSTR_DIVI_VAR_VAR:
+- DEST_VAR_INT /= SRC_VAR_INT;
+- ++ip; break;
+-
+- case INSTR_DIVI_VAR_INTEGER:
+- DEST_VAR_INT /= VALUE_INT;
+- ++ip; break;
+-
+- /* DIV.F */
+- case INSTR_DIVF_VAR_FLOAT:
+- DEST_VAR_FLOAT /= VALUE_FLOAT;
+- ++ip; break;
+-
+- case INSTR_DIVF_VAR_VAR:
+- DEST_VAR_FLOAT /= SRC_VAR_FLOAT;
+- ++ip; break;
+-
+- /* SUB.I */
+- case INSTR_SUBI_VAR_VAR:
+- DEST_VAR_INT -= SRC_VAR_INT;
+- ++ip; break;
+-
+- case INSTR_SUBI_VAR_INTEGER:
+- DEST_VAR_INT -= VALUE_INT;
+- ++ip; break;
+-
+- /* SUB.F */
+- case INSTR_SUBF_VAR_FLOAT:
+- DEST_VAR_FLOAT -= VALUE_FLOAT;
+- ++ip; break;
+-
+- case INSTR_SUBF_VAR_VAR:
+- DEST_VAR_FLOAT -= SRC_VAR_FLOAT;
+- ++ip; break;
+-
+- /* CALL */
+- case INSTR_CALL:
+- stack[stack_pointer++] = ip + 1;
+- ip += JUMP_OFFSET; break;
+-
+- /* RET */
+- case INSTR_RET:
+- ip = stack[--stack_pointer];
+- if (ip<0) return;
+- break;
+-
+- /* EXT_CALL */
+- case INSTR_EXT_CALL:
+- instr[ip].data.udest.external_function->function(gsl, gsl->vars, instr[ip].data.udest.external_function->vars);
+- ++ip; break;
+-
+- /* NOT */
+- case INSTR_NOT_VAR:
+- flag = !flag;
+- ++ip; break;
+-
+- /* JNZERO */
+- case INSTR_JNZERO:
+- ip += (flag ? JUMP_OFFSET : 1); break;
+-
+- case INSTR_SETS_VAR_VAR:
+- memcpy(pDEST_VAR, pSRC_VAR, DEST_STRUCT_SIZE);
+- ++ip; break;
+-
+- case INSTR_ISEQUALS_VAR_VAR:
+- break;
+-
+- case INSTR_ADDS_VAR_VAR:
+- /* process integers */
+- i=0;
+- while (DEST_STRUCT_IBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_IBLOCK(i).size;
+- while (j--) {
+- DEST_STRUCT_IBLOCK_VAR(i,j) += SRC_STRUCT_IBLOCK_VAR(i,j);
+- }
+- ++i;
+- }
+- /* process floats */
+- i=0;
+- while (DEST_STRUCT_FBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_FBLOCK(i).size;
+- while (j--) {
+- DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j);
+- }
+- ++i;
+- }
+- ++ip; break;
+-
+- case INSTR_SUBS_VAR_VAR:
+- /* process integers */
+- i=0;
+- while (DEST_STRUCT_IBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_IBLOCK(i).size;
+- while (j--) {
+- DEST_STRUCT_IBLOCK_VAR(i,j) -= SRC_STRUCT_IBLOCK_VAR(i,j);
+- }
+- ++i;
+- }
+- /* process floats */
+- i=0;
+- while (DEST_STRUCT_FBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_FBLOCK(i).size;
+- while (j--) {
+- DEST_STRUCT_FBLOCK_VAR(i,j) -= SRC_STRUCT_FBLOCK_VAR(i,j);
+- }
+- ++i;
+- }
+- ++ip; break;
+-
+- case INSTR_MULS_VAR_VAR:
+- /* process integers */
+- i=0;
+- while (DEST_STRUCT_IBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_IBLOCK(i).size;
+- while (j--) {
+- DEST_STRUCT_IBLOCK_VAR(i,j) *= SRC_STRUCT_IBLOCK_VAR(i,j);
+- }
+- ++i;
+- }
+- /* process floats */
+- i=0;
+- while (DEST_STRUCT_FBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_FBLOCK(i).size;
+- while (j--) {
+- DEST_STRUCT_FBLOCK_VAR(i,j) *= SRC_STRUCT_FBLOCK_VAR(i,j);
+- }
+- ++i;
+- }
+- ++ip; break;
+-
+- case INSTR_DIVS_VAR_VAR:
+- /* process integers */
+- i=0;
+- while (DEST_STRUCT_IBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_IBLOCK(i).size;
+- while (j--) {
+- DEST_STRUCT_IBLOCK_VAR(i,j) /= SRC_STRUCT_IBLOCK_VAR(i,j);
+- }
+- ++i;
+- }
+- /* process floats */
+- i=0;
+- while (DEST_STRUCT_FBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_FBLOCK(i).size;
+- while (j--) {
+- DEST_STRUCT_FBLOCK_VAR(i,j) /= SRC_STRUCT_FBLOCK_VAR(i,j);
+- }
+- ++i;
+- }
+- ++ip; break;
+-
+- default:
+- printf("NOT IMPLEMENTED : %d\n", instr[ip].id);
+- ++ip;
+- exit(1);
+- }
+- }
+-} /* }}} */
+-
+-int gsl_malloc(GoomSL *_this, int size)
+-{ /* {{{ */
+- if (_this->nbPtr >= _this->ptrArraySize) {
+- _this->ptrArraySize *= 2;
+- _this->ptrArray = (void**)realloc(_this->ptrArray, sizeof(void*) * _this->ptrArraySize);
+- }
+- _this->ptrArray[_this->nbPtr] = malloc(size);
+- return _this->nbPtr++;
+-} /* }}} */
+-
+-void *gsl_get_ptr(GoomSL *_this, int id)
+-{ /* {{{ */
+- if ((id>=0)&&(id<_this->nbPtr))
+- return _this->ptrArray[id];
+- fprintf(stderr,"INVALID GET PTR 0x%08x\n", id);
+- return NULL;
+-} /* }}} */
+-
+-void gsl_free_ptr(GoomSL *_this, int id)
+-{ /* {{{ */
+- if ((id>=0)&&(id<_this->nbPtr)) {
+- free(_this->ptrArray[id]);
+- _this->ptrArray[id] = 0;
+- }
+-} /* }}} */
+-
+-void gsl_enternamespace(const char *name)
+-{ /* {{{ */
+- HashValue *val = goom_hash_get(currentGoomSL->functions, name);
+- if (val) {
+- ExternalFunctionStruct *function = (ExternalFunctionStruct*)val->ptr;
+- currentGoomSL->currentNS++;
+- currentGoomSL->namespaces[currentGoomSL->currentNS] = function->vars;
+- }
+- else {
+- fprintf(stderr, "ERROR: Line %d, Could not find namespace: %s\n", currentGoomSL->num_lines, name);
+- exit(1);
+- }
+-} /* }}} */
+-
+-void gsl_reenternamespace(GoomHash *nsinfo) {
+- currentGoomSL->currentNS++;
+- currentGoomSL->namespaces[currentGoomSL->currentNS] = nsinfo;
+-}
+-
+-GoomHash *gsl_leavenamespace(void)
+-{ /* {{{ */
+- currentGoomSL->currentNS--;
+- return currentGoomSL->namespaces[currentGoomSL->currentNS+1];
+-} /* }}} */
+-
+-GoomHash *gsl_find_namespace(const char *name)
+-{ /* {{{ */
+- int i;
+- for (i=currentGoomSL->currentNS;i>=0;--i) {
+- if (goom_hash_get(currentGoomSL->namespaces[i], name))
+- return currentGoomSL->namespaces[i];
+- }
+- return NULL;
+-} /* }}} */
+-
+-void gsl_declare_task(const char *name)
+-{ /* {{{ */
+- if (goom_hash_get(currentGoomSL->functions, name)) {
+- return;
+- }
+- else {
+- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct));
+- gef->function = 0;
+- gef->vars = goom_hash_new();
+- gef->is_extern = 0;
+- goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef);
+- }
+-} /* }}} */
+-
+-void gsl_declare_external_task(const char *name)
+-{ /* {{{ */
+- if (goom_hash_get(currentGoomSL->functions, name)) {
+- fprintf(stderr, "ERROR: Line %d, Duplicate declaration of %s\n", currentGoomSL->num_lines, name);
+- return;
+- }
+- else {
+- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct));
+- gef->function = 0;
+- gef->vars = goom_hash_new();
+- gef->is_extern = 1;
+- goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef);
+- }
+-} /* }}} */
+-
+-static void reset_scanner(GoomSL *gss)
+-{ /* {{{ */
+- gss->num_lines = 0;
+- gss->instr = NULL;
+- iflow_clean(gss->iflow);
+-
+- /* reset variables */
+- goom_hash_free(gss->vars);
+- gss->vars = goom_hash_new();
+- gss->currentNS = 0;
+- gss->namespaces[0] = gss->vars;
+-
+- goom_hash_free(gss->structIDS);
+- gss->structIDS = goom_hash_new();
+-
+- while (gss->nbStructID > 0) {
+- int i;
+- gss->nbStructID--;
+- for(i=0;i<gss->gsl_struct[gss->nbStructID]->nbFields;++i)
+- free(gss->gsl_struct[gss->nbStructID]->fields[i]);
+- free(gss->gsl_struct[gss->nbStructID]);
+- }
+-
+- gss->compilationOK = 1;
+-
+- goom_heap_delete(gss->data_heap);
+- gss->data_heap = goom_heap_new();
+-} /* }}} */
+-
+-static void calculate_labels(InstructionFlow *iflow)
+-{ /* {{{ */
+- int i = 0;
+- while (i < iflow->number) {
+- Instruction *instr = iflow->instr[i];
+- if (instr->jump_label) {
+- HashValue *label = goom_hash_get(iflow->labels,instr->jump_label);
+- if (label) {
+- instr->data.udest.jump_offset = -instr->address + label->i;
+- }
+- else {
+- fprintf(stderr, "ERROR: Line %d, Could not find label %s\n", instr->line_number, instr->jump_label);
+- instr->id = INSTR_NOP;
+- instr->nop_label = 0;
+- exit(1);
+- }
+- }
+- ++i;
+- }
+-} /* }}} */
+-
+-static int powerOfTwo(int i)
+-{
+- int b;
+- for (b=0;b<31;b++)
+- if (i == (1<<b))
+- return b;
+- return 0;
+-}
+-
+-/* Cree un flow d'instruction optimise */
+-static void gsl_create_fast_iflow(void)
+-{ /* {{{ */
+- int number = currentGoomSL->iflow->number;
+- int i;
+-#ifdef USE_JITC_X86
+-
+- /* pour compatibilite avec les MACROS servant a execution */
+- int ip = 0;
+- GoomSL *gsl = currentGoomSL;
+-
+- JitcX86Env *jitc;
+-
+- if (currentGoomSL->jitc != NULL)
+- jitc_x86_delete(currentGoomSL->jitc);
+- jitc = currentGoomSL->jitc = jitc_x86_env_new(0xffff);
+- currentGoomSL->jitc_func = jitc_prepare_func(jitc);
+-
+-#if 0
+-#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1]
+-#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1]
+-#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i]
+-#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i]
+-#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i]
+-#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i]
+-#define DEST_STRUCT_IBLOCK_VAR(i,j) \
+- ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j]
+-#define DEST_STRUCT_FBLOCK_VAR(i,j) \
+- ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j]
+-#define SRC_STRUCT_IBLOCK_VAR(i,j) \
+- ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j]
+-#define SRC_STRUCT_FBLOCK_VAR(i,j) \
+- ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j]
+-#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size
+-#endif
+-
+- JITC_JUMP_LABEL(jitc, "__very_end__");
+- JITC_ADD_LABEL (jitc, "__very_start__");
+-
+- for (i=0;i<number;++i) {
+- Instruction *instr = currentGoomSL->iflow->instr[i];
+- switch (instr->id) {
+- case INSTR_SETI_VAR_INTEGER :
+- jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int);
+- break;
+- case INSTR_SETI_VAR_VAR :
+- jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_int);
+- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+- break;
+- /* SET.F */
+- case INSTR_SETF_VAR_FLOAT :
+- jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_float, *(int*)(&instr->data.usrc.value_float));
+- break;
+- case INSTR_SETF_VAR_VAR :
+- jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_float);
+- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_float);
+- break;
+- case INSTR_NOP :
+- if (instr->nop_label != 0)
+- JITC_ADD_LABEL(jitc, instr->nop_label);
+- break;
+- case INSTR_JUMP :
+- JITC_JUMP_LABEL(jitc,instr->jump_label);
+- break;
+- case INSTR_SETP_VAR_PTR :
+- jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_ptr, instr->data.usrc.value_ptr);
+- break;
+- case INSTR_SETP_VAR_VAR :
+- jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_ptr);
+- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_ptr);
+- break;
+- case INSTR_SUBI_VAR_INTEGER :
+- jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, -instr->data.usrc.value_int);
+- break;
+- case INSTR_SUBI_VAR_VAR :
+- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+- jitc_add(jitc, "sub eax, [$d]", instr->data.usrc.var_int);
+- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+- break;
+- case INSTR_SUBF_VAR_FLOAT :
+- printf("NOT IMPLEMENTED : %d\n", instr->id);
+- break;
+- case INSTR_SUBF_VAR_VAR :
+- printf("NOT IMPLEMENTED : %d\n", instr->id);
+- break;
+- case INSTR_ISLOWERF_VAR_VAR:
+- printf("NOT IMPLEMENTED : %d\n", instr->id);
+- break;
+- case INSTR_ISLOWERF_VAR_FLOAT:
+- printf("NOT IMPLEMENTED : %d\n", instr->id);
+- break;
+- case INSTR_ISLOWERI_VAR_VAR:
+- jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int);
+- jitc_add(jitc,"sub edx, [$d]", instr->data.usrc.var_int);
+- jitc_add(jitc,"shr edx, $d", 31);
+- break;
+- case INSTR_ISLOWERI_VAR_INTEGER:
+- jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int);
+- jitc_add(jitc,"sub edx, $d", instr->data.usrc.value_int);
+- jitc_add(jitc,"shr edx, $d", 31);
+- break;
+- case INSTR_ADDI_VAR_INTEGER:
+- jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int);
+- break;
+- case INSTR_ADDI_VAR_VAR:
+- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+- jitc_add(jitc, "add eax, [$d]", instr->data.usrc.var_int);
+- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+- break;
+- case INSTR_ADDF_VAR_FLOAT:
+- printf("NOT IMPLEMENTED : %d\n", instr->id);
+- break;
+- case INSTR_ADDF_VAR_VAR:
+- printf("NOT IMPLEMENTED : %d\n", instr->id);
+- break;
+- case INSTR_MULI_VAR_INTEGER:
+- if (instr->data.usrc.value_int != 1)
+- {
+- int po2 = powerOfTwo(instr->data.usrc.value_int);
+- if (po2) {
+- /* performs (V / 2^n) by doing V >> n */
+- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+- jitc_add(jitc, "sal eax, $d", po2);
+- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+- }
+- else {
+- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+- jitc_add(jitc, "imul eax, $d", instr->data.usrc.value_int);
+- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+- }
+- }
+- break;
+- case INSTR_MULI_VAR_VAR:
+- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+- jitc_add(jitc, "imul eax, [$d]", instr->data.usrc.var_int);
+- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+- break;
+- case INSTR_MULF_VAR_FLOAT:
+- printf("NOT IMPLEMENTED : %d\n", instr->id);
+- break;
+- case INSTR_MULF_VAR_VAR:
+- printf("NOT IMPLEMENTED : %d\n", instr->id);
+- break;
+- case INSTR_DIVI_VAR_INTEGER:
+- if ((instr->data.usrc.value_int != 1) && (instr->data.usrc.value_int != 0))
+- {
+- int po2 = powerOfTwo(instr->data.usrc.value_int);
+- if (po2) {
+- /* performs (V / 2^n) by doing V >> n */
+- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+- jitc_add(jitc, "sar eax, $d", po2);
+- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+- }
+- else {
+- /* performs (V/n) by doing (V*(32^2/n)) */
+- long coef;
+- double dcoef = (double)4294967296.0 / (double)instr->data.usrc.value_int;
+- if (dcoef < 0.0) dcoef = -dcoef;
+- coef = (long)floor(dcoef);
+- dcoef -= floor(dcoef);
+- if (dcoef < 0.5) coef += 1;
+-
+- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+- jitc_add(jitc, "mov edx, $d", coef);
+- jitc_add(jitc, "imul edx");
+- if (instr->data.usrc.value_int < 0)
+- jitc_add(jitc, "neg edx");
+- jitc_add(jitc, "mov [$d], edx", instr->data.udest.var_int);
+- }
+- }
+- break;
+- case INSTR_DIVI_VAR_VAR :
+- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+- jitc_add(jitc, "cdq"); /* sign extend eax into edx */
+- jitc_add(jitc, "idiv [$d]", instr->data.usrc.var_int);
+- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+- break;
+- case INSTR_DIVF_VAR_FLOAT:
+- printf("NOT IMPLEMENTED : %d\n", instr->id);
+- break;
+- case INSTR_DIVF_VAR_VAR:
+- printf("NOT IMPLEMENTED : %d\n", instr->id);
+- break;
+- case INSTR_JZERO:
+- jitc_add(jitc, "cmp edx, $d", 0);
+- jitc_add(jitc, "je $s", instr->jump_label);
+- break;
+- case INSTR_ISEQUALP_VAR_VAR :
+- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr);
+- jitc_add(jitc, "mov edx, $d", 0);
+- jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_ptr);
+- jitc_add(jitc, "jne $d", 1);
+- jitc_add(jitc, "inc edx");
+- break;
+- case INSTR_ISEQUALP_VAR_PTR :
+- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr);
+- jitc_add(jitc, "mov edx, $d", 0);
+- jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_ptr);
+- jitc_add(jitc, "jne $d", 1);
+- jitc_add(jitc, "inc edx");
+- break;
+- case INSTR_ISEQUALI_VAR_VAR :
+- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+- jitc_add(jitc, "mov edx, $d", 0);
+- jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_int);
+- jitc_add(jitc, "jne $d", 1);
+- jitc_add(jitc, "inc edx");
+- break;
+- case INSTR_ISEQUALI_VAR_INTEGER :
+- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+- jitc_add(jitc, "mov edx, $d", 0);
+- jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_int);
+- jitc_add(jitc, "jne $d", 1);
+- jitc_add(jitc, "inc edx");
+- break;
+- case INSTR_ISEQUALF_VAR_VAR :
+- printf("NOT IMPLEMENTED : %d\n", instr->id);
+- break;
+- case INSTR_ISEQUALF_VAR_FLOAT :
+- printf("NOT IMPLEMENTED : %d\n", instr->id);
+- break;
+- case INSTR_CALL:
+- jitc_add(jitc, "call $s", instr->jump_label);
+- break;
+- case INSTR_RET:
+- jitc_add(jitc, "ret");
+- break;
+- case INSTR_EXT_CALL:
+- jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function->vars));
+- jitc_add(jitc, "push eax");
+- jitc_add(jitc, "mov edx, [$d]", &(currentGoomSL->vars));
+- jitc_add(jitc, "push edx");
+- jitc_add(jitc, "mov eax, [$d]", &(currentGoomSL));
+- jitc_add(jitc, "push eax");
+-
+- jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function));
+- jitc_add(jitc, "mov eax, [eax]");
+- jitc_add(jitc, "call [eax]");
+- jitc_add(jitc, "add esp, $d", 12);
+- break;
+- case INSTR_NOT_VAR:
+- jitc_add(jitc, "mov eax, edx");
+- jitc_add(jitc, "mov edx, $d", 1);
+- jitc_add(jitc, "sub edx, eax");
+- break;
+- case INSTR_JNZERO:
+- jitc_add(jitc, "cmp edx, $d", 0);
+- jitc_add(jitc, "jne $s", instr->jump_label);
+- break;
+- case INSTR_SETS_VAR_VAR:
+- {
+- int loop = DEST_STRUCT_SIZE / sizeof(int);
+- int dst = (int)pDEST_VAR;
+- int src = (int)pSRC_VAR;
+-
+- while (loop--) {
+- jitc_add(jitc,"mov eax, [$d]", src);
+- jitc_add(jitc,"mov [$d], eax", dst);
+- src += 4;
+- dst += 4;
+- }
+- }
+- break;
+- case INSTR_ISEQUALS_VAR_VAR:
+- break;
+- case INSTR_ADDS_VAR_VAR:
+- {
+- /* process integers */
+- int i=0;
+- while (DEST_STRUCT_IBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_IBLOCK(i).size;
+- while (j--) { /* TODO interlace 2 */
+- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j));
+- jitc_add(jitc, "add eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j));
+- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j));
+- }
+- ++i;
+- }
+- /* process floats */
+- i=0;
+- while (DEST_STRUCT_FBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_FBLOCK(i).size;
+- while (j--) {
+- /* DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); */
+- /* TODO */
+- }
+- ++i;
+- }
+- break;
+- }
+- case INSTR_SUBS_VAR_VAR:
+- {
+- /* process integers */
+- int i=0;
+- while (DEST_STRUCT_IBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_IBLOCK(i).size;
+- while (j--) {
+- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j));
+- jitc_add(jitc, "sub eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j));
+- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j));
+- }
+- ++i;
+- }
+- break;
+- }
+- case INSTR_MULS_VAR_VAR:
+- {
+- /* process integers */
+- int i=0;
+- while (DEST_STRUCT_IBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_IBLOCK(i).size;
+- while (j--) {
+- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j));
+- jitc_add(jitc, "imul eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j));
+- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j));
+- }
+- ++i;
+- }
+- break;
+- }
+- case INSTR_DIVS_VAR_VAR:
+- {
+- /* process integers */
+- int i=0;
+- while (DEST_STRUCT_IBLOCK(i).size > 0) {
+- int j=DEST_STRUCT_IBLOCK(i).size;
+- while (j--) {
+- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j));
+- jitc_add(jitc, "cdq");
+- jitc_add(jitc, "idiv [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j));
+- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j));
+- }
+- ++i;
+- }
+- break;
+- }
+- }
+- }
+-
+- JITC_ADD_LABEL (jitc, "__very_end__");
+- jitc_add(jitc, "call $s", "__very_start__");
+- jitc_add(jitc, "mov eax, $d", 0);
+- jitc_validate_func(jitc);
+-#else
+- InstructionFlow *iflow = currentGoomSL->iflow;
+- FastInstructionFlow *fastiflow = (FastInstructionFlow*)malloc(sizeof(FastInstructionFlow));
+- fastiflow->mallocedInstr = calloc(number*16, sizeof(FastInstruction));
+- /* fastiflow->instr = (FastInstruction*)(((int)fastiflow->mallocedInstr) + 16 - (((int)fastiflow->mallocedInstr)%16)); */
+- fastiflow->instr = (FastInstruction*)fastiflow->mallocedInstr;
+- fastiflow->number = number;
+- for(i=0;i<number;++i) {
+- fastiflow->instr[i].id = iflow->instr[i]->id;
+- fastiflow->instr[i].data = iflow->instr[i]->data;
+- fastiflow->instr[i].proto = iflow->instr[i];
+- }
+- currentGoomSL->fastiflow = fastiflow;
+-#endif
+-} /* }}} */
+-
+-void yy_scan_string(const char *str);
+-void yyparse(void);
+-
+-GoomHash *gsl_globals(GoomSL *_this)
+-{
+- return _this->vars;
+-}
+-
+-
+-/**
+- * Some native external functions
+- */
+-static void ext_charAt(GoomSL *gsl, GoomHash *global, GoomHash *local)
+-{
+- char *string = GSL_LOCAL_PTR(gsl, local, "value");
+- int index = GSL_LOCAL_INT(gsl, local, "index");
+- GSL_GLOBAL_INT(gsl, "charAt") = 0;
+- if (string == NULL) {
+- return;
+- }
+- if (index < strlen(string))
+- GSL_GLOBAL_INT(gsl, "charAt") = string[index];
+-}
+-
+-static void ext_i2f(GoomSL *gsl, GoomHash *global, GoomHash *local)
+-{
+- int i = GSL_LOCAL_INT(gsl, local, "value");
+- GSL_GLOBAL_FLOAT(gsl, "i2f") = i;
+-}
+-
+-static void ext_f2i(GoomSL *gsl, GoomHash *global, GoomHash *local)
+-{
+- float f = GSL_LOCAL_FLOAT(gsl, local, "value");
+- GSL_GLOBAL_INT(gsl, "f2i") = f;
+-}
+-
+-/**
+- *
+- */
+-void gsl_compile(GoomSL *_currentGoomSL, const char *script)
+-{ /* {{{ */
+- char *script_and_externals;
+- static const char *sBinds =
+- "external <charAt: string value, int index> : int\n"
+- "external <f2i: float value> : int\n"
+- "external <i2f: int value> : float\n";
+-
+-#ifdef VERBOSE
+- printf("\n=== Starting Compilation ===\n");
+-#endif
+-
+- script_and_externals = malloc(strlen(script) + strlen(sBinds) + 2);
+- strcpy(script_and_externals, sBinds);
+- strcat(script_and_externals, script);
+-
+- /* 0- reset */
+- currentGoomSL = _currentGoomSL;
+- reset_scanner(currentGoomSL);
+-
+- /* 1- create the syntaxic tree */
+- yy_scan_string(script_and_externals);
+- yyparse();
+-
+- /* 2- generate code */
+- gsl_commit_compilation();
+-
+- /* 3- resolve symbols */
+- calculate_labels(currentGoomSL->iflow);
+-
+- /* 4- optimize code */
+- gsl_create_fast_iflow();
+-
+- /* 5- bind a few internal functions */
+- gsl_bind_function(currentGoomSL, "charAt", ext_charAt);
+- gsl_bind_function(currentGoomSL, "f2i", ext_f2i);
+- gsl_bind_function(currentGoomSL, "i2f", ext_i2f);
+- free(script_and_externals);
+-
+-#ifdef VERBOSE
+- printf("=== Compilation done. # of lines: %d. # of instr: %d ===\n", currentGoomSL->num_lines, currentGoomSL->iflow->number);
+-#endif
+-} /* }}} */
+-
+-void gsl_execute(GoomSL *scanner)
+-{ /* {{{ */
+- if (scanner->compilationOK) {
+-#if USE_JITC_X86
+- scanner->jitc_func();
+-#else
+- iflow_execute(scanner->fastiflow, scanner);
+-#endif
+- }
+-} /* }}} */
+-
+-GoomSL *gsl_new(void)
+-{ /* {{{ */
+- GoomSL *gss = (GoomSL*)malloc(sizeof(GoomSL));
+-
+- gss->iflow = iflow_new();
+- gss->vars = goom_hash_new();
+- gss->functions = goom_hash_new();
+- gss->nbStructID = 0;
+- gss->structIDS = goom_hash_new();
+- gss->gsl_struct_size = 32;
+- gss->gsl_struct = (GSL_Struct**)malloc(gss->gsl_struct_size * sizeof(GSL_Struct*));
+- gss->currentNS = 0;
+- gss->namespaces[0] = gss->vars;
+- gss->data_heap = goom_heap_new();
+-
+- reset_scanner(gss);
+-
+- gss->compilationOK = 0;
+- gss->nbPtr=0;
+- gss->ptrArraySize=256;
+- gss->ptrArray = (void**)malloc(gss->ptrArraySize * sizeof(void*));
+-#ifdef USE_JITC_X86
+- gss->jitc = NULL;
+-#endif
+- return gss;
+-} /* }}} */
+-
+-void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func)
+-{ /* {{{ */
+- HashValue *val = goom_hash_get(gss->functions, fname);
+- if (val) {
+- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)val->ptr;
+- gef->function = func;
+- }
+- else fprintf(stderr, "Unable to bind function %s\n", fname);
+-} /* }}} */
+-
+-int gsl_is_compiled(GoomSL *gss)
+-{ /* {{{ */
+- return gss->compilationOK;
+-} /* }}} */
+-
+-void gsl_free(GoomSL *gss)
+-{ /* {{{ */
+- iflow_free(gss->iflow);
+- free(gss->vars);
+- free(gss->functions);
+- free(gss);
+-} /* }}} */
+-
+-
+-static int gsl_nb_import;
+-static char gsl_already_imported[256][256];
+-
+-char *gsl_init_buffer(const char *fname)
+-{
+- char *fbuffer;
+- fbuffer = (char*)malloc(512);
+- fbuffer[0]=0;
+- gsl_nb_import = 0;
+- if (fname)
+- gsl_append_file_to_buffer(fname,&fbuffer);
+- return fbuffer;
+-}
+-
+-static char *gsl_read_file(const char *fname)
+-{
+- FILE *f;
+- char *buffer;
+- int fsize;
+- f = fopen(fname,"rt");
+- if (!f) {
+- fprintf(stderr, "ERROR: Could not load file %s\n", fname);
+- exit(1);
+- }
+- fseek(f,0,SEEK_END);
+- fsize = ftell(f);
+- rewind(f);
+- buffer = (char*)malloc(fsize+512);
+- fread(buffer,1,fsize,f);
+- fclose(f);
+- buffer[fsize]=0;
+- return buffer;
+-}
+-
+-void gsl_append_file_to_buffer(const char *fname, char **buffer)
+-{
+- char *fbuffer;
+- int size,fsize,i=0;
+- char reset_msg[256];
+-
+- /* look if the file have not been already imported */
+- for (i=0;i<gsl_nb_import;++i) {
+- if (strcmp(gsl_already_imported[i], fname) == 0)
+- return;
+- }
+-
+- /* add fname to the already imported files. */
+- strcpy(gsl_already_imported[gsl_nb_import++], fname);
+-
+- /* load the file */
+- fbuffer = gsl_read_file(fname);
+- fsize = strlen(fbuffer);
+-
+- /* look for #import */
+- while (fbuffer[i]) {
+- if ((fbuffer[i]=='#') && (fbuffer[i+1]=='i')) {
+- char impName[256];
+- int j;
+- while (fbuffer[i] && (fbuffer[i]!=' '))
+- i++;
+- i++;
+- j=0;
+- while (fbuffer[i] && (fbuffer[i]!='\n'))
+- impName[j++] = fbuffer[i++];
+- impName[j++] = 0;
+- gsl_append_file_to_buffer(impName, buffer);
+- }
+- i++;
+- }
+-
+- sprintf(reset_msg, "\n#FILE %s#\n#RST_LINE#\n", fname);
+- strcat(*buffer, reset_msg);
+- size=strlen(*buffer);
+- *buffer = (char*)realloc(*buffer, size+fsize+256);
+- strcat((*buffer)+size, fbuffer);
+- free(fbuffer);
+-}
+-
+-
+diff -Naur /home/d4rk/goom2k4-0/src/goomsl.h /src/goomsl.h
+--- /home/d4rk/goom2k4-0/src/goomsl.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goomsl.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,34 +0,0 @@
+-#ifndef _GOOMSL_H
+-#define _GOOMSL_H
+-
+-#include "goomsl_hash.h"
+-
+-typedef struct _GoomSL GoomSL;
+-typedef void (*GoomSL_ExternalFunction)(GoomSL *gsl, GoomHash *global_vars, GoomHash *local_vars);
+-
+-GoomSL*gsl_new(void);
+-void gsl_free(GoomSL *gss);
+-
+-char *gsl_init_buffer(const char *file_name);
+-void gsl_append_file_to_buffer(const char *file_name, char **buffer);
+-
+-void gsl_compile (GoomSL *scanner, const char *script);
+-void gsl_execute (GoomSL *scanner);
+-int gsl_is_compiled (GoomSL *gss);
+-void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func);
+-
+-int gsl_malloc (GoomSL *_this, int size);
+-void *gsl_get_ptr (GoomSL *_this, int id);
+-void gsl_free_ptr(GoomSL *_this, int id);
+-
+-GoomHash *gsl_globals(GoomSL *_this);
+-
+-#define GSL_LOCAL_PTR(gsl,local,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(local,name)->ptr)
+-#define GSL_LOCAL_INT(gsl,local,name) (*(int*)goom_hash_get(local,name)->ptr)
+-#define GSL_LOCAL_FLOAT(gsl,local,name) (*(float*)goom_hash_get(local,name)->ptr)
+-
+-#define GSL_GLOBAL_PTR(gsl,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(gsl_globals(gsl),name)->ptr)
+-#define GSL_GLOBAL_INT(gsl,name) (*(int*)goom_hash_get(gsl_globals(gsl),name)->ptr)
+-#define GSL_GLOBAL_FLOAT(gsl,name) (*(float*)goom_hash_get(gsl_globals(gsl),name)->ptr)
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/goomsl_hash.c /src/goomsl_hash.c
+--- /home/d4rk/goom2k4-0/src/goomsl_hash.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/goomsl_hash.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,120 +0,0 @@
+-#include "goomsl_hash.h"
+-#include <string.h>
+-#include <stdlib.h>
+-
+-static GoomHashEntry *entry_new(const char *key, HashValue value) {
+-
+- int len = strlen(key);
+- GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry));
+-
+- entry->key = (char *)malloc(len+1);
+- memcpy(entry->key,key,len+1);
+- entry->value = value;
+- entry->lower = NULL;
+- entry->upper = NULL;
+-
+- return entry;
+-}
+-
+-static void entry_free(GoomHashEntry *entry) {
+- if (entry!=NULL) {
+- entry_free(entry->lower);
+- entry_free(entry->upper);
+- free(entry->key);
+- free(entry);
+- }
+-}
+-
+-static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) {
+- int cmp = strcmp(key,entry->key);
+- if (cmp==0) {
+- entry->value = value;
+- }
+- else if (cmp > 0) {
+- if (entry->upper == NULL)
+- entry->upper = entry_new(key,value);
+- else
+- entry_put(entry->upper, key, value);
+- }
+- else {
+- if (entry->lower == NULL)
+- entry->lower = entry_new(key,value);
+- else
+- entry_put(entry->lower, key, value);
+- }
+-}
+-
+-static HashValue *entry_get(GoomHashEntry *entry, const char *key) {
+-
+- int cmp;
+- if (entry==NULL)
+- return NULL;
+- cmp = strcmp(key,entry->key);
+- if (cmp > 0)
+- return entry_get(entry->upper, key);
+- else if (cmp < 0)
+- return entry_get(entry->lower, key);
+- else
+- return &(entry->value);
+-}
+-
+-GoomHash *goom_hash_new() {
+- GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash));
+- _this->root = NULL;
+- _this->number_of_puts = 0;
+- return _this;
+-}
+-
+-void goom_hash_free(GoomHash *_this) {
+- entry_free(_this->root);
+- free(_this);
+-}
+-
+-void goom_hash_put(GoomHash *_this, const char *key, HashValue value) {
+- _this->number_of_puts += 1;
+- if (_this->root == NULL)
+- _this->root = entry_new(key,value);
+- else
+- entry_put(_this->root,key,value);
+-}
+-
+-HashValue *goom_hash_get(GoomHash *_this, const char *key) {
+- if (_this == NULL) return NULL;
+- return entry_get(_this->root,key);
+-}
+-
+-void goom_hash_put_int(GoomHash *_this, const char *key, int i) {
+- HashValue value;
+- value.i = i;
+- goom_hash_put(_this,key,value);
+-}
+-
+-void goom_hash_put_float(GoomHash *_this, const char *key, float f) {
+- HashValue value;
+- value.f = f;
+- goom_hash_put(_this,key,value);
+-}
+-
+-void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) {
+- HashValue value;
+- value.ptr = ptr;
+- goom_hash_put(_this,key,value);
+-}
+-
+-/* FOR EACH */
+-
+-static void _goom_hash_for_each(GoomHash *_this, GoomHashEntry *entry, GH_Func func)
+-{
+- if (entry == NULL) return;
+- func(_this, entry->key, &(entry->value));
+- _goom_hash_for_each(_this, entry->lower, func);
+- _goom_hash_for_each(_this, entry->upper, func);
+-}
+-
+-void goom_hash_for_each(GoomHash *_this, GH_Func func) {
+- _goom_hash_for_each(_this, _this->root, func);
+-}
+-
+-int goom_hash_number_of_puts(GoomHash *_this) {
+- return _this->number_of_puts;
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/goomsl_hash.h /src/goomsl_hash.h
+--- /home/d4rk/goom2k4-0/src/goomsl_hash.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goomsl_hash.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,40 +0,0 @@
+-#ifndef _GOOMSL_HASH_H
+-#define _GOOMSL_HASH_H
+-
+-typedef struct GOOM_HASH_ENTRY GoomHashEntry;
+-typedef struct GOOM_HASH GoomHash;
+-
+-typedef union {
+- void *ptr;
+- int i;
+- float f;
+-} HashValue;
+-
+-struct GOOM_HASH_ENTRY {
+- char *key;
+- HashValue value;
+- GoomHashEntry *lower;
+- GoomHashEntry *upper;
+-};
+-
+-struct GOOM_HASH {
+- GoomHashEntry *root;
+- int number_of_puts;
+-};
+-
+-GoomHash *goom_hash_new();
+-void goom_hash_free(GoomHash *gh);
+-
+-void goom_hash_put(GoomHash *gh, const char *key, HashValue value);
+-HashValue *goom_hash_get(GoomHash *gh, const char *key);
+-
+-void goom_hash_put_int (GoomHash *_this, const char *key, int i);
+-void goom_hash_put_float(GoomHash *_this, const char *key, float f);
+-void goom_hash_put_ptr (GoomHash *_this, const char *key, void *ptr);
+-
+-typedef void (*GH_Func)(GoomHash *caller, const char *key, HashValue *value);
+-
+-void goom_hash_for_each(GoomHash *_this, GH_Func func);
+-int goom_hash_number_of_puts(GoomHash *_this);
+-
+-#endif /* _GOOM_HASH_H */
+diff -Naur /home/d4rk/goom2k4-0/src/goomsl_heap.c /src/goomsl_heap.c
+--- /home/d4rk/goom2k4-0/src/goomsl_heap.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/goomsl_heap.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,105 +0,0 @@
+-#include "goomsl_heap.h"
+-#include <stdlib.h>
+-
+-struct _GOOM_HEAP {
+- void **arrays;
+- int number_of_arrays;
+- int size_of_each_array;
+- int consumed_in_last_array;
+-};
+-
+-/* Constructors / Destructor */
+-GoomHeap *goom_heap_new(void)
+-{
+- return goom_heap_new_with_granularity(4096);
+-}
+-
+-GoomHeap *goom_heap_new_with_granularity(int granularity)
+-{
+- GoomHeap *_this;
+- _this = (GoomHeap*)malloc(sizeof(GoomHeap));
+- _this->number_of_arrays = 0;
+- _this->size_of_each_array = granularity;
+- _this->consumed_in_last_array = 0;
+- _this->arrays = (void**)malloc(sizeof(void*));
+- return _this;
+-}
+-
+-void goom_heap_delete(GoomHeap *_this)
+-{
+- int i;
+- for (i=0;i<_this->number_of_arrays;++i) {
+- free(_this->arrays[i]);
+- }
+- free(_this->arrays);
+- free(_this);
+-}
+-
+-static void align_it(GoomHeap *_this, int alignment)
+-{
+- if ((alignment > 1) && (_this->number_of_arrays>0)) {
+- void *last_array = _this->arrays[_this->number_of_arrays - 1];
+- int last_address = (int)last_array + _this->consumed_in_last_array;
+- int decal = (last_address % alignment);
+- if (decal != 0) {
+- _this->consumed_in_last_array += alignment - decal;
+- }
+- }
+-}
+-
+-void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes,
+- int alignment, int prefix_bytes)
+-{
+- void *retval = NULL;
+-
+- /* d'abord on gere les problemes d'alignement */
+- _this->consumed_in_last_array += prefix_bytes;
+- align_it(_this, alignment);
+-
+- /* ensuite on verifie que la quantite de memoire demandee tient dans le buffer */
+- if ((_this->consumed_in_last_array + nb_bytes >= _this->size_of_each_array)
+- || (_this->number_of_arrays == 0)) {
+-
+- if (prefix_bytes + nb_bytes + alignment >= _this->size_of_each_array) {
+-
+- /* Si la zone demandee est plus grosse que la granularitee */
+- /* On alloue un buffer plus gros que les autres */
+- _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * (_this->number_of_arrays+2));
+-
+- _this->number_of_arrays += 1;
+- _this->consumed_in_last_array = prefix_bytes;
+-
+- _this->arrays[_this->number_of_arrays - 1] = malloc(prefix_bytes + nb_bytes + alignment);
+- align_it(_this,alignment);
+- retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array);
+-
+- /* puis on repart sur un nouveau buffer vide */
+- _this->number_of_arrays += 1;
+- _this->consumed_in_last_array = 0;
+- _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array);
+- return retval;
+- }
+- else {
+- _this->number_of_arrays += 1;
+- _this->consumed_in_last_array = prefix_bytes;
+- _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * _this->number_of_arrays);
+-
+- _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array);
+- align_it(_this,alignment);
+- }
+- }
+- retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array);
+- _this->consumed_in_last_array += nb_bytes;
+- return retval;
+-}
+-
+-void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment)
+-{
+- return goom_heap_malloc_with_alignment_prefixed(_this, nb_bytes, alignment, 0);
+-}
+-
+-void *goom_heap_malloc(GoomHeap *_this, int nb_bytes)
+-{
+- return goom_heap_malloc_with_alignment(_this,nb_bytes,1);
+-}
+-
+diff -Naur /home/d4rk/goom2k4-0/src/goomsl_heap.h /src/goomsl_heap.h
+--- /home/d4rk/goom2k4-0/src/goomsl_heap.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goomsl_heap.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,29 +0,0 @@
+-#ifndef GOOMSL_HEAP
+-#define GOOMSL_HEAP
+-
+-/**
+- * Resizable Array that guarranty that resizes don't change address of
+- * the stored datas.
+- *
+- * This is implemented as an array of arrays... granularity is the size
+- * of each arrays.
+- */
+-
+-typedef struct _GOOM_HEAP GoomHeap;
+-
+-/* Constructors / Destructor */
+-GoomHeap *goom_heap_new(void);
+-GoomHeap *goom_heap_new_with_granularity(int granularity);
+-void goom_heap_delete(GoomHeap *_this);
+-
+-/* This method behaves like malloc. */
+-void *goom_heap_malloc(GoomHeap *_this, int nb_bytes);
+-/* This adds an alignment constraint. */
+-void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment);
+-
+-/* Returns a pointeur on the bytes... prefix is before */
+-void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes,
+- int alignment, int prefix_bytes);
+-
+-#endif
+-
+diff -Naur /home/d4rk/goom2k4-0/src/goomsl_lex.c /src/goomsl_lex.c
+--- /home/d4rk/goom2k4-0/src/goomsl_lex.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/goomsl_lex.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,2108 +0,0 @@
+-#line 2 "goomsl_lex.c"
+-
+-#line 4 "goomsl_lex.c"
+-
+-#define YY_INT_ALIGNED short int
+-
+-/* A lexical scanner generated by flex */
+-
+-#define FLEX_SCANNER
+-#define YY_FLEX_MAJOR_VERSION 2
+-#define YY_FLEX_MINOR_VERSION 5
+-#define YY_FLEX_SUBMINOR_VERSION 31
+-#if YY_FLEX_SUBMINOR_VERSION > 0
+-#define FLEX_BETA
+-#endif
+-
+-/* First, we deal with platform-specific or compiler-specific issues. */
+-
+-/* begin standard C headers. */
+-#include <stdio.h>
+-#include <string.h>
+-#include <errno.h>
+-#include <stdlib.h>
+-
+-/* end standard C headers. */
+-
+-/* flex integer type definitions */
+-
+-#ifndef FLEXINT_H
+-#define FLEXINT_H
+-
+-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+-
+-#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+-#include <inttypes.h>
+-typedef int8_t flex_int8_t;
+-typedef uint8_t flex_uint8_t;
+-typedef int16_t flex_int16_t;
+-typedef uint16_t flex_uint16_t;
+-typedef int32_t flex_int32_t;
+-typedef uint32_t flex_uint32_t;
+-#else
+-typedef signed char flex_int8_t;
+-typedef short int flex_int16_t;
+-typedef int flex_int32_t;
+-typedef unsigned char flex_uint8_t;
+-typedef unsigned short int flex_uint16_t;
+-typedef unsigned int flex_uint32_t;
+-#endif /* ! C99 */
+-
+-/* Limits of integral types. */
+-#ifndef INT8_MIN
+-#define INT8_MIN (-128)
+-#endif
+-#ifndef INT16_MIN
+-#define INT16_MIN (-32767-1)
+-#endif
+-#ifndef INT32_MIN
+-#define INT32_MIN (-2147483647-1)
+-#endif
+-#ifndef INT8_MAX
+-#define INT8_MAX (127)
+-#endif
+-#ifndef INT16_MAX
+-#define INT16_MAX (32767)
+-#endif
+-#ifndef INT32_MAX
+-#define INT32_MAX (2147483647)
+-#endif
+-#ifndef UINT8_MAX
+-#define UINT8_MAX (255U)
+-#endif
+-#ifndef UINT16_MAX
+-#define UINT16_MAX (65535U)
+-#endif
+-#ifndef UINT32_MAX
+-#define UINT32_MAX (4294967295U)
+-#endif
+-
+-#endif /* ! FLEXINT_H */
+-
+-#ifdef __cplusplus
+-
+-/* The "const" storage-class-modifier is valid. */
+-#define YY_USE_CONST
+-
+-#else /* ! __cplusplus */
+-
+-#if __STDC__
+-
+-#define YY_USE_CONST
+-
+-#endif /* __STDC__ */
+-#endif /* ! __cplusplus */
+-
+-#ifdef YY_USE_CONST
+-#define yyconst const
+-#else
+-#define yyconst
+-#endif
+-
+-/* Returned upon end-of-file. */
+-#define YY_NULL 0
+-
+-/* Promotes a possibly negative, possibly signed char to an unsigned
+- * integer for use as an array index. If the signed char is negative,
+- * we want to instead treat it as an 8-bit unsigned char, hence the
+- * double cast.
+- */
+-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+-
+-/* Enter a start condition. This macro really ought to take a parameter,
+- * but we do it the disgusting crufty way forced on us by the ()-less
+- * definition of BEGIN.
+- */
+-#define BEGIN (yy_start) = 1 + 2 *
+-
+-/* Translate the current start state into a value that can be later handed
+- * to BEGIN to return to the state. The YYSTATE alias is for lex
+- * compatibility.
+- */
+-#define YY_START (((yy_start) - 1) / 2)
+-#define YYSTATE YY_START
+-
+-/* Action number for EOF rule of a given start state. */
+-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+-
+-/* Special action meaning "start processing a new file". */
+-#define YY_NEW_FILE yyrestart(yyin )
+-
+-#define YY_END_OF_BUFFER_CHAR 0
+-
+-/* Size of default input buffer. */
+-#ifndef YY_BUF_SIZE
+-#define YY_BUF_SIZE 16384
+-#endif
+-
+-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+-#define YY_TYPEDEF_YY_BUFFER_STATE
+-typedef struct yy_buffer_state *YY_BUFFER_STATE;
+-#endif
+-
+-extern int yyleng;
+-
+-extern FILE *yyin, *yyout;
+-
+-#define EOB_ACT_CONTINUE_SCAN 0
+-#define EOB_ACT_END_OF_FILE 1
+-#define EOB_ACT_LAST_MATCH 2
+-
+- /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
+- * access to the local variable yy_act. Since yyless() is a macro, it would break
+- * existing scanners that call yyless() from OUTSIDE yylex.
+- * One obvious solution it to make yy_act a global. I tried that, and saw
+- * a 5% performance hit in a non-yylineno scanner, because yy_act is
+- * normally declared as a register variable-- so it is not worth it.
+- */
+- #define YY_LESS_LINENO(n) \
+- do { \
+- int yyl;\
+- for ( yyl = n; yyl < yyleng; ++yyl )\
+- if ( yytext[yyl] == '\n' )\
+- --yylineno;\
+- }while(0)
+-
+-/* Return all but the first "n" matched characters back to the input stream. */
+-#define yyless(n) \
+- do \
+- { \
+- /* Undo effects of setting up yytext. */ \
+- int yyless_macro_arg = (n); \
+- YY_LESS_LINENO(yyless_macro_arg);\
+- *yy_cp = (yy_hold_char); \
+- YY_RESTORE_YY_MORE_OFFSET \
+- (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+- YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+- } \
+- while ( 0 )
+-
+-#define unput(c) yyunput( c, (yytext_ptr) )
+-
+-/* The following is because we cannot portably get our hands on size_t
+- * (without autoconf's help, which isn't available because we want
+- * flex-generated scanners to compile on their own).
+- */
+-
+-#ifndef YY_TYPEDEF_YY_SIZE_T
+-#define YY_TYPEDEF_YY_SIZE_T
+-typedef unsigned int yy_size_t;
+-#endif
+-
+-#ifndef YY_STRUCT_YY_BUFFER_STATE
+-#define YY_STRUCT_YY_BUFFER_STATE
+-struct yy_buffer_state
+- {
+- FILE *yy_input_file;
+-
+- char *yy_ch_buf; /* input buffer */
+- char *yy_buf_pos; /* current position in input buffer */
+-
+- /* Size of input buffer in bytes, not including room for EOB
+- * characters.
+- */
+- yy_size_t yy_buf_size;
+-
+- /* Number of characters read into yy_ch_buf, not including EOB
+- * characters.
+- */
+- int yy_n_chars;
+-
+- /* Whether we "own" the buffer - i.e., we know we created it,
+- * and can realloc() it to grow it, and should free() it to
+- * delete it.
+- */
+- int yy_is_our_buffer;
+-
+- /* Whether this is an "interactive" input source; if so, and
+- * if we're using stdio for input, then we want to use getc()
+- * instead of fread(), to make sure we stop fetching input after
+- * each newline.
+- */
+- int yy_is_interactive;
+-
+- /* Whether we're considered to be at the beginning of a line.
+- * If so, '^' rules will be active on the next match, otherwise
+- * not.
+- */
+- int yy_at_bol;
+-
+- int yy_bs_lineno; /**< The line count. */
+- int yy_bs_column; /**< The column count. */
+-
+- /* Whether to try to fill the input buffer when we reach the
+- * end of it.
+- */
+- int yy_fill_buffer;
+-
+- int yy_buffer_status;
+-
+-#define YY_BUFFER_NEW 0
+-#define YY_BUFFER_NORMAL 1
+- /* When an EOF's been seen but there's still some text to process
+- * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+- * shouldn't try reading from the input source any more. We might
+- * still have a bunch of tokens to match, though, because of
+- * possible backing-up.
+- *
+- * When we actually see the EOF, we change the status to "new"
+- * (via yyrestart()), so that the user can continue scanning by
+- * just pointing yyin at a new input file.
+- */
+-#define YY_BUFFER_EOF_PENDING 2
+-
+- };
+-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+-
+-/* Stack of input buffers. */
+-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+-
+-/* We provide macros for accessing buffer states in case in the
+- * future we want to put the buffer states in a more general
+- * "scanner state".
+- *
+- * Returns the top of the stack, or NULL.
+- */
+-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+- ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+- : NULL)
+-
+-/* Same as previous macro, but useful when we know that the buffer stack is not
+- * NULL or when we need an lvalue. For internal use only.
+- */
+-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+-
+-/* yy_hold_char holds the character lost when yytext is formed. */
+-static char yy_hold_char;
+-static int yy_n_chars; /* number of characters read into yy_ch_buf */
+-int yyleng;
+-
+-/* Points to current character in buffer. */
+-static char *yy_c_buf_p = (char *) 0;
+-static int yy_init = 1; /* whether we need to initialize */
+-static int yy_start = 0; /* start state number */
+-
+-/* Flag which is used to allow yywrap()'s to do buffer switches
+- * instead of setting up a fresh yyin. A bit of a hack ...
+- */
+-static int yy_did_buffer_switch_on_eof;
+-
+-void yyrestart (FILE *input_file );
+-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
+-void yy_delete_buffer (YY_BUFFER_STATE b );
+-void yy_flush_buffer (YY_BUFFER_STATE b );
+-void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
+-void yypop_buffer_state (void );
+-
+-static void yyensure_buffer_stack (void );
+-static void yy_load_buffer_state (void );
+-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
+-
+-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
+-
+-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
+-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
+-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
+-
+-void *yyalloc (yy_size_t );
+-void *yyrealloc (void *,yy_size_t );
+-void yyfree (void * );
+-
+-#define yy_new_buffer yy_create_buffer
+-
+-#define yy_set_interactive(is_interactive) \
+- { \
+- if ( ! YY_CURRENT_BUFFER ){ \
+- yyensure_buffer_stack (); \
+- YY_CURRENT_BUFFER_LVALUE = \
+- yy_create_buffer(yyin,YY_BUF_SIZE ); \
+- } \
+- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+- }
+-
+-#define yy_set_bol(at_bol) \
+- { \
+- if ( ! YY_CURRENT_BUFFER ){\
+- yyensure_buffer_stack (); \
+- YY_CURRENT_BUFFER_LVALUE = \
+- yy_create_buffer(yyin,YY_BUF_SIZE ); \
+- } \
+- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+- }
+-
+-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+-
+-/* Begin user sect3 */
+-
+-typedef unsigned char YY_CHAR;
+-
+-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+-
+-typedef int yy_state_type;
+-
+-#define YY_FLEX_LEX_COMPAT
+-extern int yylineno;
+-
+-int yylineno = 1;
+-
+-extern char yytext[];
+-
+-static yy_state_type yy_get_previous_state (void );
+-static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+-static int yy_get_next_buffer (void );
+-static void yy_fatal_error (yyconst char msg[] );
+-
+-/* Done after the current pattern has been matched and before the
+- * corresponding action - sets up yytext.
+- */
+-#define YY_DO_BEFORE_ACTION \
+- (yytext_ptr) = yy_bp; \
+- yyleng = (size_t) (yy_cp - yy_bp); \
+- (yy_hold_char) = *yy_cp; \
+- *yy_cp = '\0'; \
+- if ( yyleng + (yy_more_offset) >= YYLMAX ) \
+- YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \
+- yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \
+- yyleng += (yy_more_offset); \
+- (yy_prev_more_offset) = (yy_more_offset); \
+- (yy_more_offset) = 0; \
+- (yy_c_buf_p) = yy_cp;
+-
+-#define YY_NUM_RULES 49
+-#define YY_END_OF_BUFFER 50
+-/* This struct is not used in this scanner,
+- but its presence is necessary. */
+-struct yy_trans_info
+- {
+- flex_int32_t yy_verify;
+- flex_int32_t yy_nxt;
+- };
+-static yyconst flex_int16_t yy_acclist[214] =
+- { 0,
+- 50, 48, 49, 47, 48, 49, 4, 49, 48, 49,
+- 13, 48, 49, 10, 48, 49, 33, 48, 49, 48,
+- 49, 48, 49, 48, 49, 48, 49, 48, 49, 34,
+- 48, 49, 34, 48, 49, 48, 49, 48, 49, 33,
+- 48, 49, 33, 48, 49, 33, 48, 49, 33, 48,
+- 49, 33, 48, 49, 33, 48, 49, 33, 48, 49,
+- 33, 48, 49, 33, 48, 49, 33, 48, 49, 47,
+- 48, 49, 1, 4, 49, 48, 49, 7, 49, 6,
+- 49, 7, 49, 7, 49, 1, 6, 49, 7, 49,
+- 3, 49, 1, 3, 49, 17, 49, 49, 16, 17,
+-
+- 49, 17, 49, 47, 45, 10, 10, 10, 33, 40,
+- 39, 41, 11, 12, 42, 38, 37, 34, 43, 46,
+- 44, 33, 33, 28, 33, 33, 33, 33, 33, 30,
+- 33, 33, 33, 33, 33, 33, 47, 1, 12, 5,
+- 15, 14, 10, 10, 35, 37, 36, 33, 33, 33,
+- 33, 33, 29, 33, 19, 33, 26, 33, 21, 33,
+- 33, 33, 33, 2, 10, 10, 33, 33, 33, 33,
+- 33, 33, 33, 31, 33, 33, 10, 10, 33, 33,
+- 33, 32, 33, 18, 33, 33, 33, 27, 33, 10,
+- 10, 33, 33, 33, 22, 33, 25, 33, 10, 9,
+-
+- 10, 10, 20, 33, 23, 33, 33, 10, 24, 33,
+- 10, 8, 10
+- } ;
+-
+-static yyconst flex_int16_t yy_accept[152] =
+- { 0,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+- 4, 7, 9, 11, 14, 17, 20, 22, 24, 26,
+- 28, 30, 33, 36, 38, 40, 43, 46, 49, 52,
+- 55, 58, 61, 64, 67, 70, 73, 76, 78, 80,
+- 82, 84, 86, 89, 91, 93, 96, 98, 99, 102,
+- 104, 105, 106, 107, 108, 109, 110, 110, 111, 112,
+- 113, 114, 115, 116, 117, 118, 119, 119, 120, 121,
+- 122, 123, 124, 126, 127, 128, 129, 130, 132, 133,
+- 134, 135, 136, 137, 138, 139, 139, 140, 141, 141,
+- 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
+-
+- 151, 152, 153, 155, 157, 159, 161, 162, 163, 164,
+- 164, 165, 166, 167, 168, 169, 170, 171, 172, 173,
+- 174, 176, 177, 178, 179, 180, 181, 182, 184, 186,
+- 187, 188, 190, 191, 192, 193, 194, 195, 197, 199,
+- 200, 202, 203, 205, 207, 208, 209, 211, 212, 214,
+- 214
+- } ;
+-
+-static yyconst flex_int32_t yy_ec[256] =
+- { 0,
+- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 4, 5, 6, 7, 1, 8, 9, 10, 1,
+- 1, 11, 12, 1, 13, 14, 15, 16, 17, 17,
+- 17, 17, 17, 17, 17, 17, 17, 1, 1, 18,
+- 19, 20, 1, 9, 21, 21, 21, 21, 22, 23,
+- 21, 21, 24, 21, 21, 25, 21, 26, 21, 21,
+- 21, 27, 28, 29, 21, 21, 21, 21, 21, 21,
+- 1, 30, 1, 1, 31, 1, 32, 33, 34, 35,
+-
+- 36, 37, 38, 39, 40, 21, 21, 41, 21, 42,
+- 43, 44, 21, 45, 46, 47, 48, 21, 49, 50,
+- 21, 21, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+-
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1
+- } ;
+-
+-static yyconst flex_int32_t yy_meta[51] =
+- { 0,
+- 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 3, 1, 4, 4, 1, 1, 1,
+- 3, 3, 3, 3, 3, 3, 3, 3, 3, 1,
+- 3, 4, 4, 4, 4, 4, 4, 3, 3, 3,
+- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
+- } ;
+-
+-static yyconst flex_int16_t yy_base[159] =
+- { 0,
+- 0, 49, 51, 54, 221, 57, 60, 64, 223, 225,
+- 69, 225, 203, 225, 51, 0, 0, 202, 201, 200,
+- 64, 68, 72, 72, 199, 174, 57, 166, 55, 173,
+- 171, 166, 165, 166, 171, 99, 225, 93, 225, 225,
+- 194, 107, 225, 193, 225, 225, 225, 225, 225, 71,
+- 93, 225, 0, 183, 178, 0, 195, 225, 225, 225,
+- 225, 225, 225, 225, 89, 107, 0, 225, 225, 225,
+- 161, 169, 0, 155, 160, 157, 154, 151, 150, 151,
+- 150, 146, 153, 123, 225, 177, 188, 225, 126, 187,
+- 225, 225, 164, 159, 225, 100, 0, 146, 145, 149,
+-
+- 138, 151, 0, 0, 0, 0, 59, 146, 140, 177,
+- 225, 157, 147, 141, 144, 130, 138, 126, 130, 137,
+- 0, 134, 165, 143, 133, 112, 109, 0, 0, 102,
+- 92, 0, 130, 112, 93, 98, 101, 0, 0, 125,
+- 124, 94, 0, 0, 78, 59, 0, 61, 0, 225,
+- 141, 145, 149, 151, 155, 51, 159, 163
+- } ;
+-
+-static yyconst flex_int16_t yy_def[159] =
+- { 0,
+- 150, 1, 151, 151, 151, 151, 152, 152, 150, 150,
+- 150, 150, 150, 150, 153, 154, 155, 150, 150, 150,
+- 150, 150, 150, 150, 150, 154, 154, 154, 154, 154,
+- 154, 154, 154, 154, 154, 150, 150, 150, 150, 150,
+- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+- 150, 150, 153, 153, 153, 154, 150, 150, 150, 150,
+- 150, 150, 150, 150, 150, 150, 156, 150, 150, 150,
+- 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+- 154, 154, 154, 150, 150, 150, 157, 150, 150, 157,
+- 150, 150, 153, 153, 150, 150, 156, 154, 154, 154,
+-
+- 154, 154, 154, 154, 154, 154, 154, 154, 154, 157,
+- 150, 153, 153, 154, 154, 154, 154, 154, 154, 154,
+- 154, 154, 153, 153, 154, 154, 154, 154, 154, 154,
+- 154, 154, 158, 153, 154, 154, 154, 154, 154, 158,
+- 158, 153, 154, 154, 154, 153, 154, 153, 153, 0,
+- 150, 150, 150, 150, 150, 150, 150, 150
+- } ;
+-
+-static yyconst flex_int16_t yy_nxt[276] =
+- { 0,
+- 10, 11, 12, 11, 13, 14, 15, 10, 16, 17,
+- 18, 19, 20, 10, 21, 22, 23, 24, 10, 25,
+- 16, 16, 16, 16, 16, 16, 16, 16, 16, 10,
+- 16, 16, 26, 16, 27, 28, 29, 16, 16, 30,
+- 16, 31, 16, 32, 16, 33, 34, 16, 35, 16,
+- 36, 37, 36, 40, 97, 42, 43, 42, 42, 46,
+- 42, 41, 48, 38, 41, 49, 48, 149, 44, 49,
+- 51, 44, 51, 54, 61, 64, 91, 55, 62, 64,
+- 148, 65, 63, 66, 66, 65, 75, 66, 66, 50,
+- 68, 69, 72, 50, 51, 76, 51, 77, 119, 73,
+-
+- 84, 85, 84, 61, 96, 96, 120, 87, 89, 85,
+- 89, 63, 92, 86, 64, 96, 96, 67, 147, 146,
+- 65, 86, 66, 66, 84, 85, 84, 89, 85, 89,
+- 141, 141, 145, 144, 143, 142, 141, 86, 139, 138,
+- 86, 39, 39, 39, 39, 47, 47, 47, 47, 53,
+- 137, 53, 53, 56, 56, 57, 136, 57, 57, 110,
+- 110, 110, 110, 140, 135, 140, 140, 134, 133, 132,
+- 131, 130, 129, 128, 127, 126, 125, 124, 123, 111,
+- 122, 121, 118, 117, 116, 115, 114, 113, 112, 111,
+- 111, 90, 109, 108, 107, 106, 105, 104, 103, 102,
+-
+- 101, 100, 99, 98, 95, 94, 93, 90, 88, 83,
+- 82, 81, 80, 79, 78, 74, 71, 70, 60, 59,
+- 58, 52, 150, 45, 9, 150, 150, 150, 150, 150,
+- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+- 150, 150, 150, 150, 150
+- } ;
+-
+-static yyconst flex_int16_t yy_chk[276] =
+- { 0,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 2, 2, 2, 3, 156, 4, 4, 4, 6, 6,
+- 6, 3, 7, 2, 4, 7, 8, 148, 4, 8,
+- 11, 6, 11, 15, 21, 22, 50, 15, 21, 23,
+- 146, 22, 21, 22, 22, 23, 29, 23, 23, 7,
+- 24, 24, 27, 8, 51, 29, 51, 29, 107, 27,
+-
+- 36, 36, 36, 38, 65, 65, 107, 38, 42, 42,
+- 42, 38, 50, 36, 66, 96, 96, 22, 145, 142,
+- 66, 42, 66, 66, 84, 84, 84, 89, 89, 89,
+- 141, 140, 137, 136, 135, 134, 133, 84, 131, 130,
+- 89, 151, 151, 151, 151, 152, 152, 152, 152, 153,
+- 127, 153, 153, 154, 154, 155, 126, 155, 155, 157,
+- 157, 157, 157, 158, 125, 158, 158, 124, 123, 122,
+- 120, 119, 118, 117, 116, 115, 114, 113, 112, 110,
+- 109, 108, 102, 101, 100, 99, 98, 94, 93, 90,
+- 87, 86, 83, 82, 81, 80, 79, 78, 77, 76,
+-
+- 75, 74, 72, 71, 57, 55, 54, 44, 41, 35,
+- 34, 33, 32, 31, 30, 28, 26, 25, 20, 19,
+- 18, 13, 9, 5, 150, 150, 150, 150, 150, 150,
+- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+- 150, 150, 150, 150, 150
+- } ;
+-
+-/* Table of booleans, true if rule could match eol. */
+-static yyconst flex_int32_t yy_rule_can_match_eol[50] =
+- { 0,
+-1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
+-
+-extern int yy_flex_debug;
+-int yy_flex_debug = 0;
+-
+-static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+-static char *yy_full_match;
+-static int yy_lp;
+-#define REJECT \
+-{ \
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \
+-yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+-++(yy_lp); \
+-goto find_rule; \
+-}
+-
+-static int yy_more_offset = 0;
+-static int yy_prev_more_offset = 0;
+-#define yymore() ((yy_more_offset) = yy_flex_strlen( yytext ))
+-#define YY_NEED_STRLEN
+-#define YY_MORE_ADJ 0
+-#define YY_RESTORE_YY_MORE_OFFSET \
+- { \
+- (yy_more_offset) = (yy_prev_more_offset); \
+- yyleng -= (yy_more_offset); \
+- }
+-#ifndef YYLMAX
+-#define YYLMAX 8192
+-#endif
+-
+-char yytext[YYLMAX];
+-char *yytext_ptr;
+-#line 1 "goomsl_lex.l"
+-#line 2 "goomsl_lex.l"
+-
+-#include <math.h>
+-#include <stdlib.h>
+-#include <string.h>
+-#include "goomsl.h"
+-#include "goomsl_private.h"
+-#include "goomsl_yacc.h"
+-void yyerror(char *);
+-void yyparse(void);
+-
+-GoomSL *currentGoomSL;
+-static int string_size;
+-static char string[1024];
+-
+-
+-
+-#line 639 "goomsl_lex.c"
+-
+-#define INITIAL 0
+-#define C_COMMENT 1
+-#define LINE_COMMENT 2
+-#define STRING 3
+-
+-/* Special case for "unistd.h", since it is non-ANSI. We include it way
+- * down here because we want the user's section 1 to have been scanned first.
+- * The user has a chance to override it with an option.
+- */
+-#include <unistd.h>
+-
+-#ifndef YY_EXTRA_TYPE
+-#define YY_EXTRA_TYPE void *
+-#endif
+-
+-/* Macros after this point can all be overridden by user definitions in
+- * section 1.
+- */
+-
+-#ifndef YY_SKIP_YYWRAP
+-#ifdef __cplusplus
+-extern "C" int yywrap (void );
+-#else
+-extern int yywrap (void );
+-#endif
+-#endif
+-
+- static void yyunput (int c,char *buf_ptr );
+-
+-#ifndef yytext_ptr
+-static void yy_flex_strncpy (char *,yyconst char *,int );
+-#endif
+-
+-#ifdef YY_NEED_STRLEN
+-static int yy_flex_strlen (yyconst char * );
+-#endif
+-
+-#ifndef YY_NO_INPUT
+-
+-#ifdef __cplusplus
+-static int yyinput (void );
+-#else
+-static int input (void );
+-#endif
+-
+-#endif
+-
+-/* Amount of stuff to slurp up with each read. */
+-#ifndef YY_READ_BUF_SIZE
+-#define YY_READ_BUF_SIZE 8192
+-#endif
+-
+-/* Copy whatever the last rule matched to the standard output. */
+-#ifndef ECHO
+-/* This used to be an fputs(), but since the string might contain NUL's,
+- * we now use fwrite().
+- */
+-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+-#endif
+-
+-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+- * is returned in "result".
+- */
+-#ifndef YY_INPUT
+-#define YY_INPUT(buf,result,max_size) \
+- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+- { \
+- int c = '*'; \
+- size_t n; \
+- for ( n = 0; n < max_size && \
+- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+- buf[n] = (char) c; \
+- if ( c == '\n' ) \
+- buf[n++] = (char) c; \
+- if ( c == EOF && ferror( yyin ) ) \
+- YY_FATAL_ERROR( "input in flex scanner failed" ); \
+- result = n; \
+- } \
+- else \
+- { \
+- errno=0; \
+- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+- { \
+- if( errno != EINTR) \
+- { \
+- YY_FATAL_ERROR( "input in flex scanner failed" ); \
+- break; \
+- } \
+- errno=0; \
+- clearerr(yyin); \
+- } \
+- }\
+-\
+-
+-#endif
+-
+-/* No semi-colon after return; correct usage is to write "yyterminate();" -
+- * we don't want an extra ';' after the "return" because that will cause
+- * some compilers to complain about unreachable statements.
+- */
+-#ifndef yyterminate
+-#define yyterminate() return YY_NULL
+-#endif
+-
+-/* Number of entries by which start-condition stack grows. */
+-#ifndef YY_START_STACK_INCR
+-#define YY_START_STACK_INCR 25
+-#endif
+-
+-/* Report a fatal error. */
+-#ifndef YY_FATAL_ERROR
+-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+-#endif
+-
+-/* end tables serialization structures and prototypes */
+-
+-/* Default declaration of generated scanner - a define so the user can
+- * easily add parameters.
+- */
+-#ifndef YY_DECL
+-#define YY_DECL_IS_OURS 1
+-
+-extern int yylex (void);
+-
+-#define YY_DECL int yylex (void)
+-#endif /* !YY_DECL */
+-
+-/* Code executed at the beginning of each rule, after yytext and yyleng
+- * have been set up.
+- */
+-#ifndef YY_USER_ACTION
+-#define YY_USER_ACTION
+-#endif
+-
+-/* Code executed at the end of each rule. */
+-#ifndef YY_BREAK
+-#define YY_BREAK break;
+-#endif
+-
+-#define YY_RULE_SETUP \
+- if ( yyleng > 0 ) \
+- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+- (yytext[yyleng - 1] == '\n'); \
+- YY_USER_ACTION
+-
+-/** The main scanner function which does all the work.
+- */
+-YY_DECL
+-{
+- register yy_state_type yy_current_state;
+- register char *yy_cp, *yy_bp;
+- register int yy_act;
+-
+-#line 25 "goomsl_lex.l"
+-
+-
+-#line 797 "goomsl_lex.c"
+-
+- if ( (yy_init) )
+- {
+- (yy_init) = 0;
+-
+-#ifdef YY_USER_INIT
+- YY_USER_INIT;
+-#endif
+-
+- if ( ! (yy_state_buf) )
+- (yy_state_buf) = (yy_state_type *)yyalloc(YY_BUF_SIZE + 2 );
+-
+- if ( ! (yy_start) )
+- (yy_start) = 1; /* first start state */
+-
+- if ( ! yyin )
+- yyin = stdin;
+-
+- if ( ! yyout )
+- yyout = stdout;
+-
+- if ( ! YY_CURRENT_BUFFER ) {
+- yyensure_buffer_stack ();
+- YY_CURRENT_BUFFER_LVALUE =
+- yy_create_buffer(yyin,YY_BUF_SIZE );
+- }
+-
+- yy_load_buffer_state( );
+- }
+-
+- while ( 1 ) /* loops until end-of-file is reached */
+- {
+- yy_cp = (yy_c_buf_p);
+-
+- /* Support of yytext. */
+- *yy_cp = (yy_hold_char);
+-
+- /* yy_bp points to the position in yy_ch_buf of the start of
+- * the current run.
+- */
+- yy_bp = yy_cp;
+-
+- yy_current_state = (yy_start);
+- yy_current_state += YY_AT_BOL();
+-
+- (yy_state_ptr) = (yy_state_buf);
+- *(yy_state_ptr)++ = yy_current_state;
+-
+-yy_match:
+- do
+- {
+- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+- {
+- yy_current_state = (int) yy_def[yy_current_state];
+- if ( yy_current_state >= 151 )
+- yy_c = yy_meta[(unsigned int) yy_c];
+- }
+- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+- *(yy_state_ptr)++ = yy_current_state;
+- ++yy_cp;
+- }
+- while ( yy_base[yy_current_state] != 225 );
+-
+-yy_find_action:
+- yy_current_state = *--(yy_state_ptr);
+- (yy_lp) = yy_accept[yy_current_state];
+-find_rule: /* we branch to this label when backing up */
+- for ( ; ; ) /* until we find what rule we matched */
+- {
+- if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+- {
+- yy_act = yy_acclist[(yy_lp)];
+- {
+- (yy_full_match) = yy_cp;
+- break;
+- }
+- }
+- --yy_cp;
+- yy_current_state = *--(yy_state_ptr);
+- (yy_lp) = yy_accept[yy_current_state];
+- }
+-
+- YY_DO_BEFORE_ACTION;
+-
+- if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
+- {
+- int yyl;
+- for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl )
+- if ( yytext[yyl] == '\n' )
+-
+- yylineno++;
+-;
+- }
+-
+-do_action: /* This label is used only to access EOF actions. */
+-
+- switch ( yy_act )
+- { /* beginning of action switch */
+-case 1:
+-/* rule 1 can match eol */
+-YY_RULE_SETUP
+-#line 27 "goomsl_lex.l"
+-{ ++currentGoomSL->num_lines; /* Ignore empty lines */ }
+- YY_BREAK
+-case 2:
+-/* rule 2 can match eol */
+-YY_RULE_SETUP
+-#line 28 "goomsl_lex.l"
+-{ ++currentGoomSL->num_lines; /* Ignore empty lines */ }
+- YY_BREAK
+-case 3:
+-/* rule 3 can match eol */
+-YY_RULE_SETUP
+-#line 30 "goomsl_lex.l"
+-{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; }
+- YY_BREAK
+-case 4:
+-/* rule 4 can match eol */
+-YY_RULE_SETUP
+-#line 31 "goomsl_lex.l"
+-{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; }
+- YY_BREAK
+-case 5:
+-YY_RULE_SETUP
+-#line 33 "goomsl_lex.l"
+-{ BEGIN INITIAL; }
+- YY_BREAK
+-case 6:
+-/* rule 6 can match eol */
+-YY_RULE_SETUP
+-#line 34 "goomsl_lex.l"
+-{ ++currentGoomSL->num_lines; }
+- YY_BREAK
+-case 7:
+-YY_RULE_SETUP
+-#line 35 "goomsl_lex.l"
+-{ /* eat up comment */ }
+- YY_BREAK
+-case 8:
+-YY_RULE_SETUP
+-#line 37 "goomsl_lex.l"
+-{ currentGoomSL->num_lines = 0; }
+- YY_BREAK
+-case 9:
+-YY_RULE_SETUP
+-#line 38 "goomsl_lex.l"
+-{ currentGoomSL->num_lines = 0; printf("%s\n", yytext); }
+- YY_BREAK
+-case 10:
+-YY_RULE_SETUP
+-#line 39 "goomsl_lex.l"
+-{ /* ignore preprocessor lines */ }
+- YY_BREAK
+-case 11:
+-YY_RULE_SETUP
+-#line 41 "goomsl_lex.l"
+-{ BEGIN C_COMMENT; }
+- YY_BREAK
+-case 12:
+-YY_RULE_SETUP
+-#line 42 "goomsl_lex.l"
+-{ BEGIN LINE_COMMENT; }
+- YY_BREAK
+-case 13:
+-YY_RULE_SETUP
+-#line 43 "goomsl_lex.l"
+-{ BEGIN STRING; string_size=0; }
+- YY_BREAK
+-case 14:
+-YY_RULE_SETUP
+-#line 45 "goomsl_lex.l"
+-{ string[string_size++] = '\n'; }
+- YY_BREAK
+-case 15:
+-YY_RULE_SETUP
+-#line 46 "goomsl_lex.l"
+-{ string[string_size++] = '\"'; }
+- YY_BREAK
+-case 16:
+-YY_RULE_SETUP
+-#line 47 "goomsl_lex.l"
+-{ /* fin de la chaine: on cree le pointeur qui va bien */
+- unsigned int tmp;
+- BEGIN INITIAL;
+- string[string_size]=0;
+- tmp = gsl_malloc(currentGoomSL, string_size+1);
+- strcpy((char*)currentGoomSL->ptrArray[tmp],string);
+- sprintf(yylval.strValue, "0x%08x", tmp);
+- return LTYPE_PTR;
+- }
+- YY_BREAK
+-case 17:
+-YY_RULE_SETUP
+-#line 56 "goomsl_lex.l"
+-{ string[string_size++] = *yytext; }
+- YY_BREAK
+-case 18:
+-YY_RULE_SETUP
+-#line 58 "goomsl_lex.l"
+-{ return FLOAT_TK; }
+- YY_BREAK
+-case 19:
+-YY_RULE_SETUP
+-#line 59 "goomsl_lex.l"
+-{ return INT_TK; }
+- YY_BREAK
+-case 20:
+-YY_RULE_SETUP
+-#line 60 "goomsl_lex.l"
+-{ return INT_TK; }
+- YY_BREAK
+-case 21:
+-YY_RULE_SETUP
+-#line 61 "goomsl_lex.l"
+-{ return PTR_TK; }
+- YY_BREAK
+-case 22:
+-YY_RULE_SETUP
+-#line 62 "goomsl_lex.l"
+-{ return PTR_TK; }
+- YY_BREAK
+-case 23:
+-YY_RULE_SETUP
+-#line 63 "goomsl_lex.l"
+-{ return DECLARE; }
+- YY_BREAK
+-case 24:
+-YY_RULE_SETUP
+-#line 64 "goomsl_lex.l"
+-{ return EXTERNAL; }
+- YY_BREAK
+-case 25:
+-YY_RULE_SETUP
+-#line 65 "goomsl_lex.l"
+-{ return STRUCT; }
+- YY_BREAK
+-case 26:
+-YY_RULE_SETUP
+-#line 66 "goomsl_lex.l"
+-{ return NOT; }
+- YY_BREAK
+-case 27:
+-YY_RULE_SETUP
+-#line 67 "goomsl_lex.l"
+-{ return WHILE; }
+- YY_BREAK
+-case 28:
+-YY_RULE_SETUP
+-#line 68 "goomsl_lex.l"
+-{ return DO; }
+- YY_BREAK
+-case 29:
+-YY_RULE_SETUP
+-#line 69 "goomsl_lex.l"
+-{ return FOR; }
+- YY_BREAK
+-case 30:
+-YY_RULE_SETUP
+-#line 70 "goomsl_lex.l"
+-{ return IN; }
+- YY_BREAK
+-case 31:
+-YY_RULE_SETUP
+-#line 71 "goomsl_lex.l"
+-{ strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; }
+- YY_BREAK
+-case 32:
+-YY_RULE_SETUP
+-#line 72 "goomsl_lex.l"
+-{ strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; }
+- YY_BREAK
+-case 33:
+-YY_RULE_SETUP
+-#line 73 "goomsl_lex.l"
+-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; }
+- YY_BREAK
+-case 34:
+-YY_RULE_SETUP
+-#line 74 "goomsl_lex.l"
+-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; }
+- YY_BREAK
+-case 35:
+-YY_RULE_SETUP
+-#line 75 "goomsl_lex.l"
+-{ sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; }
+- YY_BREAK
+-case 36:
+-YY_RULE_SETUP
+-#line 76 "goomsl_lex.l"
+-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; }
+- YY_BREAK
+-case 37:
+-YY_RULE_SETUP
+-#line 77 "goomsl_lex.l"
+-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; }
+- YY_BREAK
+-case 38:
+-YY_RULE_SETUP
+-#line 78 "goomsl_lex.l"
+-{ sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; }
+- YY_BREAK
+-case 39:
+-YY_RULE_SETUP
+-#line 79 "goomsl_lex.l"
+-{ return PLUS_EQ; }
+- YY_BREAK
+-case 40:
+-YY_RULE_SETUP
+-#line 80 "goomsl_lex.l"
+-{ return MUL_EQ; }
+- YY_BREAK
+-case 41:
+-YY_RULE_SETUP
+-#line 81 "goomsl_lex.l"
+-{ return SUB_EQ; }
+- YY_BREAK
+-case 42:
+-YY_RULE_SETUP
+-#line 82 "goomsl_lex.l"
+-{ return DIV_EQ; }
+- YY_BREAK
+-case 43:
+-YY_RULE_SETUP
+-#line 83 "goomsl_lex.l"
+-{ return LOW_EQ; }
+- YY_BREAK
+-case 44:
+-YY_RULE_SETUP
+-#line 84 "goomsl_lex.l"
+-{ return SUP_EQ; }
+- YY_BREAK
+-case 45:
+-YY_RULE_SETUP
+-#line 85 "goomsl_lex.l"
+-{ return NOT_EQ; }
+- YY_BREAK
+-case 46:
+-YY_RULE_SETUP
+-#line 86 "goomsl_lex.l"
+-{ return NOT_EQ; }
+- YY_BREAK
+-case 47:
+-YY_RULE_SETUP
+-#line 87 "goomsl_lex.l"
+-/* eat up whitespace */
+- YY_BREAK
+-case 48:
+-YY_RULE_SETUP
+-#line 88 "goomsl_lex.l"
+-{ yylval.charValue = *yytext; return *yytext; }
+- YY_BREAK
+-case 49:
+-YY_RULE_SETUP
+-#line 90 "goomsl_lex.l"
+-ECHO;
+- YY_BREAK
+-#line 1155 "goomsl_lex.c"
+- case YY_STATE_EOF(INITIAL):
+- case YY_STATE_EOF(C_COMMENT):
+- case YY_STATE_EOF(LINE_COMMENT):
+- case YY_STATE_EOF(STRING):
+- yyterminate();
+-
+- case YY_END_OF_BUFFER:
+- {
+- /* Amount of text matched not including the EOB char. */
+- int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+-
+- /* Undo the effects of YY_DO_BEFORE_ACTION. */
+- *yy_cp = (yy_hold_char);
+- YY_RESTORE_YY_MORE_OFFSET
+-
+- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+- {
+- /* We're scanning a new file or input source. It's
+- * possible that this happened because the user
+- * just pointed yyin at a new source and called
+- * yylex(). If so, then we have to assure
+- * consistency between YY_CURRENT_BUFFER and our
+- * globals. Here is the right place to do so, because
+- * this is the first action (other than possibly a
+- * back-up) that will match for the new input source.
+- */
+- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+- }
+-
+- /* Note that here we test for yy_c_buf_p "<=" to the position
+- * of the first EOB in the buffer, since yy_c_buf_p will
+- * already have been incremented past the NUL character
+- * (since all states make transitions on EOB to the
+- * end-of-buffer state). Contrast this with the test
+- * in input().
+- */
+- if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+- { /* This was really a NUL. */
+- yy_state_type yy_next_state;
+-
+- (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+-
+- yy_current_state = yy_get_previous_state( );
+-
+- /* Okay, we're now positioned to make the NUL
+- * transition. We couldn't have
+- * yy_get_previous_state() go ahead and do it
+- * for us because it doesn't know how to deal
+- * with the possibility of jamming (and we don't
+- * want to build jamming into it because then it
+- * will run more slowly).
+- */
+-
+- yy_next_state = yy_try_NUL_trans( yy_current_state );
+-
+- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+-
+- if ( yy_next_state )
+- {
+- /* Consume the NUL. */
+- yy_cp = ++(yy_c_buf_p);
+- yy_current_state = yy_next_state;
+- goto yy_match;
+- }
+-
+- else
+- {
+- yy_cp = (yy_c_buf_p);
+- goto yy_find_action;
+- }
+- }
+-
+- else switch ( yy_get_next_buffer( ) )
+- {
+- case EOB_ACT_END_OF_FILE:
+- {
+- (yy_did_buffer_switch_on_eof) = 0;
+-
+- if ( yywrap( ) )
+- {
+- /* Note: because we've taken care in
+- * yy_get_next_buffer() to have set up
+- * yytext, we can now set up
+- * yy_c_buf_p so that if some total
+- * hoser (like flex itself) wants to
+- * call the scanner after we return the
+- * YY_NULL, it'll still work - another
+- * YY_NULL will get returned.
+- */
+- (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+-
+- yy_act = YY_STATE_EOF(YY_START);
+- goto do_action;
+- }
+-
+- else
+- {
+- if ( ! (yy_did_buffer_switch_on_eof) )
+- YY_NEW_FILE;
+- }
+- break;
+- }
+-
+- case EOB_ACT_CONTINUE_SCAN:
+- (yy_c_buf_p) =
+- (yytext_ptr) + yy_amount_of_matched_text;
+-
+- yy_current_state = yy_get_previous_state( );
+-
+- yy_cp = (yy_c_buf_p);
+- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+- goto yy_match;
+-
+- case EOB_ACT_LAST_MATCH:
+- (yy_c_buf_p) =
+- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+-
+- yy_current_state = yy_get_previous_state( );
+-
+- yy_cp = (yy_c_buf_p);
+- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+- goto yy_find_action;
+- }
+- break;
+- }
+-
+- default:
+- YY_FATAL_ERROR(
+- "fatal flex scanner internal error--no action found" );
+- } /* end of action switch */
+- } /* end of scanning one token */
+-} /* end of yylex */
+-
+-/* yy_get_next_buffer - try to read in a new buffer
+- *
+- * Returns a code representing an action:
+- * EOB_ACT_LAST_MATCH -
+- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+- * EOB_ACT_END_OF_FILE - end of file
+- */
+-static int yy_get_next_buffer (void)
+-{
+- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+- register char *source = (yytext_ptr);
+- register int number_to_move, i;
+- int ret_val;
+-
+- if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+- YY_FATAL_ERROR(
+- "fatal flex scanner internal error--end of buffer missed" );
+-
+- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+- { /* Don't try to fill the buffer, so this is an EOF. */
+- if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+- {
+- /* We matched a single character, the EOB, so
+- * treat this as a final EOF.
+- */
+- return EOB_ACT_END_OF_FILE;
+- }
+-
+- else
+- {
+- /* We matched some text prior to the EOB, first
+- * process it.
+- */
+- return EOB_ACT_LAST_MATCH;
+- }
+- }
+-
+- /* Try to read more data. */
+-
+- /* First move last chars to start of buffer. */
+- number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+-
+- for ( i = 0; i < number_to_move; ++i )
+- *(dest++) = *(source++);
+-
+- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+- /* don't do the read, it's not guaranteed to return an EOF,
+- * just force an EOF
+- */
+- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+-
+- else
+- {
+- size_t num_to_read =
+- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+-
+- while ( num_to_read <= 0 )
+- { /* Not enough room in the buffer - grow it. */
+-
+- YY_FATAL_ERROR(
+-"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+-
+- }
+-
+- if ( num_to_read > YY_READ_BUF_SIZE )
+- num_to_read = YY_READ_BUF_SIZE;
+-
+- /* Read in more data. */
+- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+- (yy_n_chars), num_to_read );
+-
+- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+- }
+-
+- if ( (yy_n_chars) == 0 )
+- {
+- if ( number_to_move == YY_MORE_ADJ )
+- {
+- ret_val = EOB_ACT_END_OF_FILE;
+- yyrestart(yyin );
+- }
+-
+- else
+- {
+- ret_val = EOB_ACT_LAST_MATCH;
+- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+- YY_BUFFER_EOF_PENDING;
+- }
+- }
+-
+- else
+- ret_val = EOB_ACT_CONTINUE_SCAN;
+-
+- (yy_n_chars) += number_to_move;
+- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+-
+- (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+-
+- return ret_val;
+-}
+-
+-/* yy_get_previous_state - get the state just before the EOB char was reached */
+-
+- static yy_state_type yy_get_previous_state (void)
+-{
+- register yy_state_type yy_current_state;
+- register char *yy_cp;
+-
+- yy_current_state = (yy_start);
+- yy_current_state += YY_AT_BOL();
+-
+- (yy_state_ptr) = (yy_state_buf);
+- *(yy_state_ptr)++ = yy_current_state;
+-
+- for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+- {
+- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+- {
+- yy_current_state = (int) yy_def[yy_current_state];
+- if ( yy_current_state >= 151 )
+- yy_c = yy_meta[(unsigned int) yy_c];
+- }
+- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+- *(yy_state_ptr)++ = yy_current_state;
+- }
+-
+- return yy_current_state;
+-}
+-
+-/* yy_try_NUL_trans - try to make a transition on the NUL character
+- *
+- * synopsis
+- * next_state = yy_try_NUL_trans( current_state );
+- */
+- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+-{
+- register int yy_is_jam;
+-
+- register YY_CHAR yy_c = 1;
+- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+- {
+- yy_current_state = (int) yy_def[yy_current_state];
+- if ( yy_current_state >= 151 )
+- yy_c = yy_meta[(unsigned int) yy_c];
+- }
+- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+- yy_is_jam = (yy_current_state == 150);
+- if ( ! yy_is_jam )
+- *(yy_state_ptr)++ = yy_current_state;
+-
+- return yy_is_jam ? 0 : yy_current_state;
+-}
+-
+- static void yyunput (int c, register char * yy_bp )
+-{
+- register char *yy_cp;
+-
+- yy_cp = (yy_c_buf_p);
+-
+- /* undo effects of setting up yytext */
+- *yy_cp = (yy_hold_char);
+-
+- if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+- { /* need to shift things up to make room */
+- /* +2 for EOB chars. */
+- register int number_to_move = (yy_n_chars) + 2;
+- register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+- YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+- register char *source =
+- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+-
+- while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+- *--dest = *--source;
+-
+- yy_cp += (int) (dest - source);
+- yy_bp += (int) (dest - source);
+- YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+-
+- if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+- YY_FATAL_ERROR( "flex scanner push-back overflow" );
+- }
+-
+- *--yy_cp = (char) c;
+-
+- if ( c == '\n' ){
+- --yylineno;
+- }
+-
+- (yytext_ptr) = yy_bp;
+- (yy_hold_char) = *yy_cp;
+- (yy_c_buf_p) = yy_cp;
+-}
+-
+-#ifndef YY_NO_INPUT
+-#ifdef __cplusplus
+- static int yyinput (void)
+-#else
+- static int input (void)
+-#endif
+-
+-{
+- int c;
+-
+- *(yy_c_buf_p) = (yy_hold_char);
+-
+- if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+- {
+- /* yy_c_buf_p now points to the character we want to return.
+- * If this occurs *before* the EOB characters, then it's a
+- * valid NUL; if not, then we've hit the end of the buffer.
+- */
+- if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+- /* This was really a NUL. */
+- *(yy_c_buf_p) = '\0';
+-
+- else
+- { /* need more input */
+- int offset = (yy_c_buf_p) - (yytext_ptr);
+- ++(yy_c_buf_p);
+-
+- switch ( yy_get_next_buffer( ) )
+- {
+- case EOB_ACT_LAST_MATCH:
+- /* This happens because yy_g_n_b()
+- * sees that we've accumulated a
+- * token and flags that we need to
+- * try matching the token before
+- * proceeding. But for input(),
+- * there's no matching to consider.
+- * So convert the EOB_ACT_LAST_MATCH
+- * to EOB_ACT_END_OF_FILE.
+- */
+-
+- /* Reset buffer status. */
+- yyrestart(yyin );
+-
+- /*FALLTHROUGH*/
+-
+- case EOB_ACT_END_OF_FILE:
+- {
+- if ( yywrap( ) )
+- return EOF;
+-
+- if ( ! (yy_did_buffer_switch_on_eof) )
+- YY_NEW_FILE;
+-#ifdef __cplusplus
+- return yyinput();
+-#else
+- return input();
+-#endif
+- }
+-
+- case EOB_ACT_CONTINUE_SCAN:
+- (yy_c_buf_p) = (yytext_ptr) + offset;
+- break;
+- }
+- }
+- }
+-
+- c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+- *(yy_c_buf_p) = '\0'; /* preserve yytext */
+- (yy_hold_char) = *++(yy_c_buf_p);
+-
+- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+- if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )
+-
+- yylineno++;
+-;
+-
+- return c;
+-}
+-#endif /* ifndef YY_NO_INPUT */
+-
+-/** Immediately switch to a different input stream.
+- * @param input_file A readable stream.
+- *
+- * @note This function does not reset the start condition to @c INITIAL .
+- */
+- void yyrestart (FILE * input_file )
+-{
+-
+- if ( ! YY_CURRENT_BUFFER ){
+- yyensure_buffer_stack ();
+- YY_CURRENT_BUFFER_LVALUE =
+- yy_create_buffer(yyin,YY_BUF_SIZE );
+- }
+-
+- yy_init_buffer(YY_CURRENT_BUFFER,input_file );
+- yy_load_buffer_state( );
+-}
+-
+-/** Switch to a different input buffer.
+- * @param new_buffer The new input buffer.
+- *
+- */
+- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+-{
+-
+- /* TODO. We should be able to replace this entire function body
+- * with
+- * yypop_buffer_state();
+- * yypush_buffer_state(new_buffer);
+- */
+- yyensure_buffer_stack ();
+- if ( YY_CURRENT_BUFFER == new_buffer )
+- return;
+-
+- if ( YY_CURRENT_BUFFER )
+- {
+- /* Flush out information for old buffer. */
+- *(yy_c_buf_p) = (yy_hold_char);
+- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+- }
+-
+- YY_CURRENT_BUFFER_LVALUE = new_buffer;
+- yy_load_buffer_state( );
+-
+- /* We don't actually know whether we did this switch during
+- * EOF (yywrap()) processing, but the only time this flag
+- * is looked at is after yywrap() is called, so it's safe
+- * to go ahead and always set it.
+- */
+- (yy_did_buffer_switch_on_eof) = 1;
+-}
+-
+-static void yy_load_buffer_state (void)
+-{
+- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+- (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+- (yy_hold_char) = *(yy_c_buf_p);
+-}
+-
+-/** Allocate and initialize an input buffer state.
+- * @param file A readable stream.
+- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+- *
+- * @return the allocated buffer state.
+- */
+- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
+-{
+- YY_BUFFER_STATE b;
+-
+- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
+- if ( ! b )
+- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+-
+- b->yy_buf_size = size;
+-
+- /* yy_ch_buf has to be 2 characters longer than the size given because
+- * we need to put in 2 end-of-buffer characters.
+- */
+- b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 );
+- if ( ! b->yy_ch_buf )
+- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+-
+- b->yy_is_our_buffer = 1;
+-
+- yy_init_buffer(b,file );
+-
+- return b;
+-}
+-
+-/** Destroy the buffer.
+- * @param b a buffer created with yy_create_buffer()
+- *
+- */
+- void yy_delete_buffer (YY_BUFFER_STATE b )
+-{
+-
+- if ( ! b )
+- return;
+-
+- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+-
+- if ( b->yy_is_our_buffer )
+- yyfree((void *) b->yy_ch_buf );
+-
+- yyfree((void *) b );
+-}
+-
+-#ifndef __cplusplus
+-extern int isatty (int );
+-#endif /* __cplusplus */
+-
+-/* Initializes or reinitializes a buffer.
+- * This function is sometimes called more than once on the same buffer,
+- * such as during a yyrestart() or at EOF.
+- */
+- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
+-
+-{
+- int oerrno = errno;
+-
+- yy_flush_buffer(b );
+-
+- b->yy_input_file = file;
+- b->yy_fill_buffer = 1;
+-
+- /* If b is the current buffer, then yy_init_buffer was _probably_
+- * called from yyrestart() or through yy_get_next_buffer.
+- * In that case, we don't want to reset the lineno or column.
+- */
+- if (b != YY_CURRENT_BUFFER){
+- b->yy_bs_lineno = 1;
+- b->yy_bs_column = 0;
+- }
+-
+- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+-
+- errno = oerrno;
+-}
+-
+-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+- *
+- */
+- void yy_flush_buffer (YY_BUFFER_STATE b )
+-{
+- if ( ! b )
+- return;
+-
+- b->yy_n_chars = 0;
+-
+- /* We always need two end-of-buffer characters. The first causes
+- * a transition to the end-of-buffer state. The second causes
+- * a jam in that state.
+- */
+- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+-
+- b->yy_buf_pos = &b->yy_ch_buf[0];
+-
+- b->yy_at_bol = 1;
+- b->yy_buffer_status = YY_BUFFER_NEW;
+-
+- if ( b == YY_CURRENT_BUFFER )
+- yy_load_buffer_state( );
+-}
+-
+-/** Pushes the new state onto the stack. The new state becomes
+- * the current state. This function will allocate the stack
+- * if necessary.
+- * @param new_buffer The new state.
+- *
+- */
+-void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+-{
+- if (new_buffer == NULL)
+- return;
+-
+- yyensure_buffer_stack();
+-
+- /* This block is copied from yy_switch_to_buffer. */
+- if ( YY_CURRENT_BUFFER )
+- {
+- /* Flush out information for old buffer. */
+- *(yy_c_buf_p) = (yy_hold_char);
+- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+- }
+-
+- /* Only push if top exists. Otherwise, replace top. */
+- if (YY_CURRENT_BUFFER)
+- (yy_buffer_stack_top)++;
+- YY_CURRENT_BUFFER_LVALUE = new_buffer;
+-
+- /* copied from yy_switch_to_buffer. */
+- yy_load_buffer_state( );
+- (yy_did_buffer_switch_on_eof) = 1;
+-}
+-
+-/** Removes and deletes the top of the stack, if present.
+- * The next element becomes the new top.
+- *
+- */
+-void yypop_buffer_state (void)
+-{
+- if (!YY_CURRENT_BUFFER)
+- return;
+-
+- yy_delete_buffer(YY_CURRENT_BUFFER );
+- YY_CURRENT_BUFFER_LVALUE = NULL;
+- if ((yy_buffer_stack_top) > 0)
+- --(yy_buffer_stack_top);
+-
+- if (YY_CURRENT_BUFFER) {
+- yy_load_buffer_state( );
+- (yy_did_buffer_switch_on_eof) = 1;
+- }
+-}
+-
+-/* Allocates the stack if it does not exist.
+- * Guarantees space for at least one push.
+- */
+-static void yyensure_buffer_stack (void)
+-{
+- int num_to_alloc;
+-
+- if (!(yy_buffer_stack)) {
+-
+- /* First allocation is just for 2 elements, since we don't know if this
+- * scanner will even need a stack. We use 2 instead of 1 to avoid an
+- * immediate realloc on the next call.
+- */
+- num_to_alloc = 1;
+- (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+- (num_to_alloc * sizeof(struct yy_buffer_state*)
+- );
+-
+- memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+-
+- (yy_buffer_stack_max) = num_to_alloc;
+- (yy_buffer_stack_top) = 0;
+- return;
+- }
+-
+- if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+-
+- /* Increase the buffer to prepare for a possible push. */
+- int grow_size = 8 /* arbitrary grow size */;
+-
+- num_to_alloc = (yy_buffer_stack_max) + grow_size;
+- (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+- ((yy_buffer_stack),
+- num_to_alloc * sizeof(struct yy_buffer_state*)
+- );
+-
+- /* zero only the new slots.*/
+- memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+- (yy_buffer_stack_max) = num_to_alloc;
+- }
+-}
+-
+-/** Setup the input buffer state to scan directly from a user-specified character buffer.
+- * @param base the character buffer
+- * @param size the size in bytes of the character buffer
+- *
+- * @return the newly allocated buffer state object.
+- */
+-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
+-{
+- YY_BUFFER_STATE b;
+-
+- if ( size < 2 ||
+- base[size-2] != YY_END_OF_BUFFER_CHAR ||
+- base[size-1] != YY_END_OF_BUFFER_CHAR )
+- /* They forgot to leave room for the EOB's. */
+- return 0;
+-
+- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
+- if ( ! b )
+- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+-
+- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+- b->yy_buf_pos = b->yy_ch_buf = base;
+- b->yy_is_our_buffer = 0;
+- b->yy_input_file = 0;
+- b->yy_n_chars = b->yy_buf_size;
+- b->yy_is_interactive = 0;
+- b->yy_at_bol = 1;
+- b->yy_fill_buffer = 0;
+- b->yy_buffer_status = YY_BUFFER_NEW;
+-
+- yy_switch_to_buffer(b );
+-
+- return b;
+-}
+-
+-/** Setup the input buffer state to scan a string. The next call to yylex() will
+- * scan from a @e copy of @a str.
+- * @param str a NUL-terminated string to scan
+- *
+- * @return the newly allocated buffer state object.
+- * @note If you want to scan bytes that may contain NUL values, then use
+- * yy_scan_bytes() instead.
+- */
+-YY_BUFFER_STATE yy_scan_string (yyconst char * str )
+-{
+-
+- return yy_scan_bytes(str,strlen(str) );
+-}
+-
+-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+- * scan from a @e copy of @a bytes.
+- * @param bytes the byte buffer to scan
+- * @param len the number of bytes in the buffer pointed to by @a bytes.
+- *
+- * @return the newly allocated buffer state object.
+- */
+-YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len )
+-{
+- YY_BUFFER_STATE b;
+- char *buf;
+- yy_size_t n;
+- int i;
+-
+- /* Get memory for full buffer, including space for trailing EOB's. */
+- n = len + 2;
+- buf = (char *) yyalloc(n );
+- if ( ! buf )
+- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+-
+- for ( i = 0; i < len; ++i )
+- buf[i] = bytes[i];
+-
+- buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+-
+- b = yy_scan_buffer(buf,n );
+- if ( ! b )
+- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+-
+- /* It's okay to grow etc. this buffer, and we should throw it
+- * away when we're done.
+- */
+- b->yy_is_our_buffer = 1;
+-
+- return b;
+-}
+-
+-#ifndef YY_EXIT_FAILURE
+-#define YY_EXIT_FAILURE 2
+-#endif
+-
+-static void yy_fatal_error (yyconst char* msg )
+-{
+- (void) fprintf( stderr, "%s\n", msg );
+- exit( YY_EXIT_FAILURE );
+-}
+-
+-/* Redefine yyless() so it works in section 3 code. */
+-
+-#undef yyless
+-#define yyless(n) \
+- do \
+- { \
+- /* Undo effects of setting up yytext. */ \
+- int yyless_macro_arg = (n); \
+- YY_LESS_LINENO(yyless_macro_arg);\
+- yytext[yyleng] = (yy_hold_char); \
+- (yy_c_buf_p) = yytext + yyless_macro_arg; \
+- (yy_hold_char) = *(yy_c_buf_p); \
+- *(yy_c_buf_p) = '\0'; \
+- yyleng = yyless_macro_arg; \
+- } \
+- while ( 0 )
+-
+-/* Accessor methods (get/set functions) to struct members. */
+-
+-/** Get the current line number.
+- *
+- */
+-int yyget_lineno (void)
+-{
+-
+- return yylineno;
+-}
+-
+-/** Get the input stream.
+- *
+- */
+-FILE *yyget_in (void)
+-{
+- return yyin;
+-}
+-
+-/** Get the output stream.
+- *
+- */
+-FILE *yyget_out (void)
+-{
+- return yyout;
+-}
+-
+-/** Get the length of the current token.
+- *
+- */
+-int yyget_leng (void)
+-{
+- return yyleng;
+-}
+-
+-/** Get the current token.
+- *
+- */
+-
+-char *yyget_text (void)
+-{
+- return yytext;
+-}
+-
+-/** Set the current line number.
+- * @param line_number
+- *
+- */
+-void yyset_lineno (int line_number )
+-{
+-
+- yylineno = line_number;
+-}
+-
+-/** Set the input stream. This does not discard the current
+- * input buffer.
+- * @param in_str A readable stream.
+- *
+- * @see yy_switch_to_buffer
+- */
+-void yyset_in (FILE * in_str )
+-{
+- yyin = in_str ;
+-}
+-
+-void yyset_out (FILE * out_str )
+-{
+- yyout = out_str ;
+-}
+-
+-int yyget_debug (void)
+-{
+- return yy_flex_debug;
+-}
+-
+-void yyset_debug (int bdebug )
+-{
+- yy_flex_debug = bdebug ;
+-}
+-
+-/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+-int yylex_destroy (void)
+-{
+-
+- /* Pop the buffer stack, destroying each element. */
+- while(YY_CURRENT_BUFFER){
+- yy_delete_buffer(YY_CURRENT_BUFFER );
+- YY_CURRENT_BUFFER_LVALUE = NULL;
+- yypop_buffer_state();
+- }
+-
+- /* Destroy the stack itself. */
+- yyfree((yy_buffer_stack) );
+- (yy_buffer_stack) = NULL;
+-
+- yyfree ( (yy_state_buf) );
+-
+- return 0;
+-}
+-
+-/*
+- * Internal utility routines.
+- */
+-
+-#ifndef yytext_ptr
+-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+-{
+- register int i;
+- for ( i = 0; i < n; ++i )
+- s1[i] = s2[i];
+-}
+-#endif
+-
+-#ifdef YY_NEED_STRLEN
+-static int yy_flex_strlen (yyconst char * s )
+-{
+- register int n;
+- for ( n = 0; s[n]; ++n )
+- ;
+-
+- return n;
+-}
+-#endif
+-
+-void *yyalloc (yy_size_t size )
+-{
+- return (void *) malloc( size );
+-}
+-
+-void *yyrealloc (void * ptr, yy_size_t size )
+-{
+- /* The cast to (char *) in the following accommodates both
+- * implementations that use char* generic pointers, and those
+- * that use void* generic pointers. It works with the latter
+- * because both ANSI C and C++ allow castless assignment from
+- * any pointer type to void*, and deal with argument conversions
+- * as though doing an assignment.
+- */
+- return (void *) realloc( (char *) ptr, size );
+-}
+-
+-void yyfree (void * ptr )
+-{
+- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+-}
+-
+-#define YYTABLES_NAME "yytables"
+-
+-#undef YY_NEW_FILE
+-#undef YY_FLUSH_BUFFER
+-#undef yy_set_bol
+-#undef yy_new_buffer
+-#undef yy_set_interactive
+-#undef YY_DO_BEFORE_ACTION
+-
+-#ifdef YY_DECL_IS_OURS
+-#undef YY_DECL_IS_OURS
+-#undef YY_DECL
+-#endif
+-#line 90 "goomsl_lex.l"
+-
+-
+-
+-
+-int yywrap(void) { return 1; yyunput(0,0); }
+-
+-
+diff -Naur /home/d4rk/goom2k4-0/src/goomsl_lex.l /src/goomsl_lex.l
+--- /home/d4rk/goom2k4-0/src/goomsl_lex.l 2005-02-07 06:46:41.000000000 -0700
++++ /src/goomsl_lex.l 1969-12-31 17:00:00.000000000 -0700
+@@ -1,94 +0,0 @@
+-%{
+-
+-#include <math.h>
+-#include <stdlib.h>
+-#include <string.h>
+-#include "goomsl.h"
+-#include "goomsl_private.h"
+-#include "goomsl_yacc.h"
+-void yyerror(char *);
+-void yyparse(void);
+-
+-GoomSL *currentGoomSL;
+-static int string_size;
+-static char string[1024];
+-%}
+-
+-DIGIT [0-9]
+-XDIGIT [0-9a-f]
+-ID [a-zA-Z_@&][a-zA-Z0-9_\.]*
+-
+-%S C_COMMENT
+-%S LINE_COMMENT
+-%S STRING
+-
+-%%
+-
+-<LINE_COMMENT,C_COMMENT,INITIAL>^[ \t]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ }
+-<LINE_COMMENT,C_COMMENT,INITIAL>^[ \t]*"//"[^\n]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ }
+-
+-<LINE_COMMENT>\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; }
+-<INITIAL>\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; }
+-
+-<C_COMMENT>"*/" { BEGIN INITIAL; }
+-<C_COMMENT>\n { ++currentGoomSL->num_lines; }
+-<C_COMMENT,LINE_COMMENT>. { /* eat up comment */ }
+-
+-<INITIAL>"#RST_LINE#" { currentGoomSL->num_lines = 0; }
+-<INITIAL>"#FILE ".*"#" { currentGoomSL->num_lines = 0; printf("%s\n", yytext); }
+-<INITIAL>"#"[^\n]* { /* ignore preprocessor lines */ }
+-
+-<INITIAL>"/*" { BEGIN C_COMMENT; }
+-<INITIAL>"//" { BEGIN LINE_COMMENT; }
+-<INITIAL>\" { BEGIN STRING; string_size=0; }
+-
+-<STRING>"\\n" { string[string_size++] = '\n'; }
+-<STRING>"\\\"" { string[string_size++] = '\"'; }
+-<STRING>\" { /* fin de la chaine: on cree le pointeur qui va bien */
+- unsigned int tmp;
+- BEGIN INITIAL;
+- string[string_size]=0;
+- tmp = gsl_malloc(currentGoomSL, string_size+1);
+- strcpy((char*)currentGoomSL->ptrArray[tmp],string);
+- sprintf(yylval.strValue, "0x%08x", tmp);
+- return LTYPE_PTR;
+- }
+-<STRING>. { string[string_size++] = *yytext; }
+-
+-<INITIAL>"float" { return FLOAT_TK; }
+-<INITIAL>"int" { return INT_TK; }
+-<INITIAL>"boolean" { return INT_TK; }
+-<INITIAL>"ptr" { return PTR_TK; }
+-<INITIAL>"string" { return PTR_TK; }
+-<INITIAL>"declare" { return DECLARE; }
+-<INITIAL>"external" { return EXTERNAL; }
+-<INITIAL>"struct" { return STRUCT; }
+-<INITIAL>"not" { return NOT; }
+-<INITIAL>"while" { return WHILE; }
+-<INITIAL>"do" { return DO; }
+-<INITIAL>"for" { return FOR; }
+-<INITIAL>"in" { return IN; }
+-<INITIAL>"true" { strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; }
+-<INITIAL>"false" { strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; }
+-<INITIAL>{ID} { strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; }
+-<INITIAL>{DIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; }
+-<INITIAL>\'.\' { sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; }
+-<INITIAL>"0x"{XDIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; }
+-<INITIAL>{DIGIT}+"."{DIGIT}* { strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; }
+-<INITIAL>{DIGIT}+"%" { sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; }
+-<INITIAL>"+=" { return PLUS_EQ; }
+-<INITIAL>"*=" { return MUL_EQ; }
+-<INITIAL>"-=" { return SUB_EQ; }
+-<INITIAL>"/=" { return DIV_EQ; }
+-<INITIAL>"<=" { return LOW_EQ; }
+-<INITIAL>">=" { return SUP_EQ; }
+-<INITIAL>"!=" { return NOT_EQ; }
+-<INITIAL>"<>" { return NOT_EQ; }
+-<INITIAL>[ \t]+ /* eat up whitespace */
+-<INITIAL>. { yylval.charValue = *yytext; return *yytext; }
+-
+-%%
+-
+-
+-int yywrap(void) { return 1; yyunput(0,0); }
+-
+diff -Naur /home/d4rk/goom2k4-0/src/goomsl_private.h /src/goomsl_private.h
+--- /home/d4rk/goom2k4-0/src/goomsl_private.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goomsl_private.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,251 +0,0 @@
+-#ifndef _GSL_PRIVATE_H
+-#define _GSL_PRIVATE_H
+-
+-/* -- internal use -- */
+-
+-#include "goomsl.h"
+-
+-#ifdef USE_JITC_X86
+-#include "jitc_x86.h"
+-#endif
+-
+-#include "goomsl_heap.h"
+-
+-/* {{{ type of nodes */
+-#define EMPTY_NODE 0
+-#define CONST_INT_NODE 1
+-#define CONST_FLOAT_NODE 2
+-#define CONST_PTR_NODE 3
+-#define VAR_NODE 4
+-#define PARAM_NODE 5
+-#define READ_PARAM_NODE 6
+-#define OPR_NODE 7
+-/* }}} */
+-/* {{{ type of operations */
+-#define OPR_SET 1
+-#define OPR_IF 2
+-#define OPR_WHILE 3
+-#define OPR_BLOCK 4
+-#define OPR_ADD 5
+-#define OPR_MUL 6
+-#define OPR_EQU 7
+-#define OPR_NOT 8
+-#define OPR_LOW 9
+-#define OPR_DIV 10
+-#define OPR_SUB 11
+-#define OPR_FUNC_INTRO 12
+-#define OPR_FUNC_OUTRO 13
+-#define OPR_CALL 14
+-#define OPR_EXT_CALL 15
+-#define OPR_PLUS_EQ 16
+-#define OPR_SUB_EQ 17
+-#define OPR_MUL_EQ 18
+-#define OPR_DIV_EQ 19
+-#define OPR_CALL_EXPR 20
+-#define OPR_AFFECT_LIST 21
+-#define OPR_FOREACH 22
+-#define OPR_VAR_LIST 23
+-
+-/* }}} */
+-
+-typedef struct _ConstIntNodeType { /* {{{ */
+- int val;
+-} ConstIntNodeType; /* }}} */
+-typedef struct _ConstFloatNodeType { /* {{{ */
+- float val;
+-} ConstFloatNodeType; /* }}} */
+-typedef struct _ConstPtrNodeType { /* {{{ */
+- int id;
+-} ConstPtrNodeType; /* }}} */
+-typedef struct _OprNodeType { /* {{{ */
+- int type;
+- int nbOp;
+- struct _NODE_TYPE *op[3]; /* maximal number of operand needed */
+- struct _NODE_TYPE *next;
+-} OprNodeType; /* }}} */
+-typedef struct _NODE_TYPE { /* {{{ */
+- int type;
+- char *str;
+- GoomHash *vnamespace;
+- int line_number;
+- union {
+- ConstIntNodeType constInt;
+- ConstFloatNodeType constFloat;
+- ConstPtrNodeType constPtr;
+- OprNodeType opr;
+- } unode;
+-} NodeType; /* }}} */
+-typedef struct _INSTRUCTION_DATA { /* {{{ */
+-
+- union {
+- void *var;
+- int *var_int;
+- int *var_ptr;
+- float *var_float;
+- int jump_offset;
+- struct _ExternalFunctionStruct *external_function;
+- } udest;
+-
+- union {
+- void *var;
+- int *var_int;
+- int *var_ptr;
+- float *var_float;
+- int value_int;
+- int value_ptr;
+- float value_float;
+- } usrc;
+-} InstructionData;
+-/* }}} */
+-typedef struct _INSTRUCTION { /* {{{ */
+-
+- int id;
+- InstructionData data;
+- GoomSL *parent;
+- const char *name; /* name of the instruction */
+-
+- char **params; /* parametres de l'instruction */
+- GoomHash **vnamespace;
+- int *types; /* type des parametres de l'instruction */
+- int cur_param;
+- int nb_param;
+-
+- int address;
+- char *jump_label;
+- char *nop_label;
+-
+- int line_number;
+-
+-} Instruction;
+-/* }}} */
+-typedef struct _INSTRUCTION_FLOW { /* {{{ */
+-
+- Instruction **instr;
+- int number;
+- int tabsize;
+- GoomHash *labels;
+-} InstructionFlow;
+-/* }}} */
+-typedef struct _FAST_INSTRUCTION { /* {{{ */
+- int id;
+- InstructionData data;
+- Instruction *proto;
+-} FastInstruction;
+-/* }}} */
+-typedef struct _FastInstructionFlow { /* {{{ */
+- int number;
+- FastInstruction *instr;
+- void *mallocedInstr;
+-} FastInstructionFlow;
+-/* }}} */
+-typedef struct _ExternalFunctionStruct { /* {{{ */
+- GoomSL_ExternalFunction function;
+- GoomHash *vars;
+- int is_extern;
+-} ExternalFunctionStruct;
+-/* }}} */
+-typedef struct _Block {
+- int data;
+- int size;
+-} Block;
+-typedef struct _GSL_StructField { /* {{{ */
+- int type;
+- char name[256];
+- int offsetInStruct; /* Where this field is stored... */
+-} GSL_StructField;
+- /* }}} */
+-typedef struct _GSL_Struct { /* {{{ */
+- int nbFields;
+- GSL_StructField *fields[64];
+- int size;
+- Block iBlock[64];
+- Block fBlock[64];
+-} GSL_Struct;
+- /* }}} */
+-struct _GoomSL { /* {{{ */
+- int num_lines;
+- Instruction *instr; /* instruction en cours de construction */
+-
+- InstructionFlow *iflow; /* flow d'instruction 'normal' */
+- FastInstructionFlow *fastiflow; /* flow d'instruction optimise */
+-
+- GoomHash *vars; /* table de variables */
+- int currentNS;
+- GoomHash *namespaces[16];
+-
+- GoomHash *functions; /* table des fonctions externes */
+-
+- GoomHeap *data_heap; /* GSL Heap-like memory space */
+-
+- int nbStructID;
+- GoomHash *structIDS;
+- GSL_Struct **gsl_struct;
+- int gsl_struct_size;
+-
+- int nbPtr;
+- int ptrArraySize;
+- void **ptrArray;
+-
+- int compilationOK;
+-#ifdef USE_JITC_X86
+- JitcX86Env *jitc;
+- JitcFunc jitc_func;
+-#endif
+-}; /* }}} */
+-
+-extern GoomSL *currentGoomSL;
+-
+-Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number);
+-void gsl_instr_add_param(Instruction *_this, char *param, int type);
+-void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns);
+-
+-void gsl_declare_task(const char *name);
+-void gsl_declare_external_task(const char *name);
+-
+-int gsl_type_of_var(GoomHash *namespace, const char *name);
+-
+-void gsl_enternamespace(const char *name);
+-void gsl_reenternamespace(GoomHash *ns);
+-GoomHash *gsl_leavenamespace(void);
+-GoomHash *gsl_find_namespace(const char *name);
+-
+-void gsl_commit_compilation(void);
+-
+-/* #define TYPE_PARAM 1 */
+-
+-#define FIRST_RESERVED 0x80000
+-
+-#define TYPE_INTEGER 0x90001
+-#define TYPE_FLOAT 0x90002
+-#define TYPE_VAR 0x90003
+-#define TYPE_PTR 0x90004
+-#define TYPE_LABEL 0x90005
+-
+-#define TYPE_OP_EQUAL 6
+-#define TYPE_IVAR 0xa0001
+-#define TYPE_FVAR 0xa0002
+-#define TYPE_PVAR 0xa0003
+-#define TYPE_SVAR 0xa0004
+-
+-#define INSTR_JUMP 6
+-#define INSTR_JZERO 29
+-#define INSTR_CALL 36
+-#define INSTR_RET 37
+-#define INSTR_EXT_CALL 38
+-#define INSTR_JNZERO 40
+-
+-#define INSTR_SET 0x80001
+-#define INSTR_INT 0x80002
+-#define INSTR_FLOAT 0x80003
+-#define INSTR_PTR 0x80004
+-#define INSTR_LABEL 0x80005
+-#define INSTR_ISLOWER 0x80006
+-#define INSTR_ADD 0x80007
+-#define INSTR_MUL 0x80008
+-#define INSTR_DIV 0x80009
+-#define INSTR_SUB 0x80010
+-#define INSTR_ISEQUAL 0x80011
+-#define INSTR_NOT 0x80012
+-
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/goomsl_yacc.c /src/goomsl_yacc.c
+--- /home/d4rk/goom2k4-0/src/goomsl_yacc.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/goomsl_yacc.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,2997 +0,0 @@
+-/* A Bison parser, made by GNU Bison 1.875. */
+-
+-/* Skeleton parser for Yacc-like parsing with Bison,
+- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
+-
+- This program is free software; you can redistribute it and/or modify
+- it under the terms of the GNU General Public License as published by
+- the Free Software Foundation; either version 2, or (at your option)
+- any later version.
+-
+- This program is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU General Public License for more details.
+-
+- You should have received a copy of the GNU General Public License
+- along with this program; if not, write to the Free Software
+- Foundation, Inc., 59 Temple Place - Suite 330,
+- Boston, MA 02111-1307, USA. */
+-
+-/* As a special exception, when this file is copied by Bison into a
+- Bison output file, you may use that output file without restriction.
+- This special exception was added by the Free Software Foundation
+- in version 1.24 of Bison. */
+-
+-/* Written by Richard Stallman by simplifying the original so called
+- ``semantic'' parser. */
+-
+-/* All symbols defined below should begin with yy or YY, to avoid
+- infringing on user name space. This should be done even for local
+- variables, as they might otherwise be expanded by user macros.
+- There are some unavoidable exceptions within include files to
+- define necessary library symbols; they are noted "INFRINGES ON
+- USER NAME SPACE" below. */
+-
+-/* Identify Bison output. */
+-#define YYBISON 1
+-
+-/* Skeleton name. */
+-#define YYSKELETON_NAME "yacc.c"
+-
+-/* Pure parsers. */
+-#define YYPURE 0
+-
+-/* Using locations. */
+-#define YYLSP_NEEDED 0
+-
+-
+-
+-/* Tokens. */
+-#ifndef YYTOKENTYPE
+-# define YYTOKENTYPE
+- /* Put the tokens into the symbol table, so that GDB and other debuggers
+- know about them. */
+- enum yytokentype {
+- LTYPE_INTEGER = 258,
+- LTYPE_FLOAT = 259,
+- LTYPE_VAR = 260,
+- LTYPE_PTR = 261,
+- PTR_TK = 262,
+- INT_TK = 263,
+- FLOAT_TK = 264,
+- DECLARE = 265,
+- EXTERNAL = 266,
+- WHILE = 267,
+- DO = 268,
+- NOT = 269,
+- PLUS_EQ = 270,
+- SUB_EQ = 271,
+- DIV_EQ = 272,
+- MUL_EQ = 273,
+- SUP_EQ = 274,
+- LOW_EQ = 275,
+- NOT_EQ = 276,
+- STRUCT = 277,
+- FOR = 278,
+- IN = 279
+- };
+-#endif
+-#define LTYPE_INTEGER 258
+-#define LTYPE_FLOAT 259
+-#define LTYPE_VAR 260
+-#define LTYPE_PTR 261
+-#define PTR_TK 262
+-#define INT_TK 263
+-#define FLOAT_TK 264
+-#define DECLARE 265
+-#define EXTERNAL 266
+-#define WHILE 267
+-#define DO 268
+-#define NOT 269
+-#define PLUS_EQ 270
+-#define SUB_EQ 271
+-#define DIV_EQ 272
+-#define MUL_EQ 273
+-#define SUP_EQ 274
+-#define LOW_EQ 275
+-#define NOT_EQ 276
+-#define STRUCT 277
+-#define FOR 278
+-#define IN 279
+-
+-
+-
+-
+-/* Copy the first part of user declarations. */
+-#line 6 "goomsl_yacc.y"
+-
+- #include <stdio.h>
+- #include <stdlib.h>
+- #include <string.h>
+- #include "goomsl.h"
+- #include "goomsl_private.h"
+-
+-#define STRUCT_ALIGNMENT 16
+-/* #define VERBOSE */
+-
+- int yylex(void);
+- void yyerror(char *);
+- extern GoomSL *currentGoomSL;
+-
+- static NodeType *nodeNew(const char *str, int type, int line_number);
+- static NodeType *nodeClone(NodeType *node);
+- static void nodeFreeInternals(NodeType *node);
+- static void nodeFree(NodeType *node);
+-
+- static void commit_node(NodeType *node, int releaseIfTemp);
+- static void precommit_node(NodeType *node);
+-
+- static NodeType *new_constInt(const char *str, int line_number);
+- static NodeType *new_constFloat(const char *str, int line_number);
+- static NodeType *new_constPtr(const char *str, int line_number);
+- static NodeType *new_var(const char *str, int line_number);
+- static NodeType *new_nop(const char *str);
+- static NodeType *new_op(const char *str, int type, int nbOp);
+-
+- static int allocateLabel();
+- static int allocateTemp();
+- static void releaseTemp(int n);
+- static void releaseAllTemps();
+-
+- static int is_tmp_expr(NodeType *node) {
+- if (node->str) {
+- return (!strncmp(node->str,"_i_tmp_",7))
+- || (!strncmp(node->str,"_f_tmp_",7))
+- || (!strncmp(node->str,"_p_tmp",7));
+- }
+- return 0;
+- }
+- /* pre: is_tmp_expr(node); */
+- static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); }
+-
+- static int is_commutative_expr(int itype)
+- { /* {{{ */
+- return (itype == INSTR_ADD)
+- || (itype == INSTR_MUL)
+- || (itype == INSTR_ISEQUAL);
+- } /* }}} */
+-
+- static void GSL_PUT_LABEL(char *name, int line_number)
+- { /* {{{ */
+-#ifdef VERBOSE
+- printf("label %s\n", name);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number);
+- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL);
+- } /* }}} */
+- static void GSL_PUT_JUMP(char *name, int line_number)
+- { /* {{{ */
+-#ifdef VERBOSE
+- printf("jump %s\n", name);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number);
+- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL);
+- } /* }}} */
+-
+- static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number)
+- { /* {{{ */
+-#ifdef VERBOSE
+- printf("%s %s\n", iname, name);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number);
+- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL);
+- } /* }}} */
+- static void GSL_PUT_JZERO(char *name,int line_number)
+- { /* {{{ */
+- GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number);
+- } /* }}} */
+- static void GSL_PUT_JNZERO(char *name, int line_number)
+- { /* {{{ */
+- GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number);
+- } /* }}} */
+-
+- /* Structures Management */
+-
+-#define ALIGN_ADDR(_addr,_align) {\
+- if (_align>1) {\
+- int _dec = (_addr%_align);\
+- if (_dec != 0) _addr += _align - _dec;\
+- }}
+-
+- /* */
+- void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align)
+- {
+- int i;
+- int consumed = 0;
+- int iblk=0, fblk=0;
+-
+- s->iBlock[0].size = 0;
+- s->iBlock[0].data = 0;
+- s->fBlock[0].size = 0;
+- s->fBlock[0].data = 0;
+-
+- /* Prepare sub-struct and calculate space needed for their storage */
+- for (i = 0; i < s->nbFields; ++i)
+- {
+- if (s->fields[i]->type < FIRST_RESERVED)
+- {
+- int j=0;
+- GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type];
+- consumed += sizeof(int); /* stocke le prefix */
+- ALIGN_ADDR(consumed, s_align);
+- s->fields[i]->offsetInStruct = consumed;
+- gsl_prepare_struct(substruct, s_align, i_align, f_align);
+- for(j=0;substruct->iBlock[j].size>0;++j) {
+- s->iBlock[iblk].data = consumed + substruct->iBlock[j].data;
+- s->iBlock[iblk].size = substruct->iBlock[j].size;
+- iblk++;
+- }
+- for(j=0;substruct->fBlock[j].size>0;++j) {
+- s->fBlock[fblk].data = consumed + substruct->fBlock[j].data;
+- s->fBlock[fblk].size = substruct->fBlock[j].size;
+- fblk++;
+- }
+- consumed += substruct->size;
+- }
+- }
+-
+- /* Then prepare integers */
+- ALIGN_ADDR(consumed, i_align);
+- for (i = 0; i < s->nbFields; ++i)
+- {
+- if (s->fields[i]->type == INSTR_INT)
+- {
+- if (s->iBlock[iblk].size == 0) {
+- s->iBlock[iblk].size = 1;
+- s->iBlock[iblk].data = consumed;
+- } else {
+- s->iBlock[iblk].size += 1;
+- }
+- s->fields[i]->offsetInStruct = consumed;
+- consumed += sizeof(int);
+- }
+- }
+-
+- iblk++;
+- s->iBlock[iblk].size = 0;
+- s->iBlock[iblk].data = 0;
+-
+- /* Then prepare floats */
+- ALIGN_ADDR(consumed, f_align);
+- for (i = 0; i < s->nbFields; ++i)
+- {
+- if (s->fields[i]->type == INSTR_FLOAT)
+- {
+- if (s->fBlock[fblk].size == 0) {
+- s->fBlock[fblk].size = 1;
+- s->fBlock[fblk].data = consumed;
+- } else {
+- s->fBlock[fblk].size += 1;
+- }
+- s->fields[i]->offsetInStruct = consumed;
+- consumed += sizeof(int);
+- }
+- }
+-
+- fblk++;
+- s->fBlock[fblk].size = 0;
+- s->fBlock[fblk].data = 0;
+-
+- /* Finally prepare pointers */
+- ALIGN_ADDR(consumed, i_align);
+- for (i = 0; i < s->nbFields; ++i)
+- {
+- if (s->fields[i]->type == INSTR_PTR)
+- {
+- s->fields[i]->offsetInStruct = consumed;
+- consumed += sizeof(int);
+- }
+- }
+- s->size = consumed;
+- }
+-
+- /* Returns the ID of a struct from its name */
+- int gsl_get_struct_id(const char *name) /* {{{ */
+- {
+- HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name);
+- if (ret != NULL) return ret->i;
+- return -1;
+- } /* }}} */
+-
+- /* Adds the definition of a struct */
+- void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */
+- {
+- /* Prepare the struct: ie calculate internal storage format */
+- gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT);
+-
+- /* If the struct does not already exists */
+- if (gsl_get_struct_id(name) < 0)
+- {
+- /* adds it */
+- int id = currentGoomSL->nbStructID++;
+- goom_hash_put_int(currentGoomSL->structIDS, name, id);
+- if (currentGoomSL->gsl_struct_size <= id) {
+- currentGoomSL->gsl_struct_size *= 2;
+- currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct,
+- sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size);
+- }
+- currentGoomSL->gsl_struct[id] = gsl_struct;
+- }
+- } /* }}} */
+-
+- /* Creates a field for a struct */
+- GSL_StructField *gsl_new_struct_field(const char *name, int type)
+- {
+- GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField));
+- strcpy(field->name, name);
+- field->type = type;
+- return field;
+- }
+-
+- /* Create as field for a struct which will be a struct itself */
+- GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type)
+- {
+- GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type));
+- if (field->type < 0) {
+- fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n",
+- currentGoomSL->num_lines, type);
+- exit(1);
+- }
+- return field;
+- }
+-
+- /* Creates a Struct */
+- GSL_Struct *gsl_new_struct(GSL_StructField *field)
+- {
+- GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct));
+- s->nbFields = 1;
+- s->fields[0] = field;
+- return s;
+- }
+-
+- /* Adds a field to a struct */
+- void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field)
+- {
+- s->fields[s->nbFields++] = field;
+- }
+-
+- int gsl_type_of_var(GoomHash *ns, const char *name)
+- {
+- char type_of[256];
+- HashValue *hv;
+- sprintf(type_of, "__type_of_%s", name);
+- hv = goom_hash_get(ns, type_of);
+- if (hv != NULL)
+- return hv->i;
+- fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name);
+- return -1;
+- }
+-
+- static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space)
+- {
+- char type_of[256];
+- if (name[0] == '@') { ns = currentGoomSL->vars; }
+-
+- if (space == NULL) {
+- switch (type) {
+- case INSTR_INT:
+- case INSTR_FLOAT:
+- case INSTR_PTR:
+- space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap,
+- sizeof(int), sizeof(int));
+- break;
+- case -1:
+- fprintf(stderr, "What the fuck!\n");
+- exit(1);
+- default: /* On a un struct_id */
+- space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap,
+- currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int));
+- }
+- }
+- goom_hash_put_ptr(ns, name, (void*)space);
+- sprintf(type_of, "__type_of_%s", name);
+- goom_hash_put_int(ns, type_of, type);
+-
+- /* Ensuite le hack: on ajoute les champs en tant que variables. */
+- if (type < FIRST_RESERVED)
+- {
+- int i;
+- GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type];
+- ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */
+- for (i = 0; i < gsl_struct->nbFields; ++i)
+- {
+- char full_name[256];
+- char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct;
+- sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name);
+- gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace);
+- }
+- }
+- }
+-
+- /* Declare a variable which will be a struct */
+- static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name)
+- {
+- int struct_id = gsl_get_struct_id(struct_name);
+- gsl_declare_var(namespace, name, struct_id, NULL);
+- }
+-
+- static void gsl_float_decl_global(const char *name)
+- {
+- gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL);
+- }
+- static void gsl_int_decl_global(const char *name)
+- {
+- gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL);
+- }
+- static void gsl_ptr_decl_global(const char *name)
+- {
+- gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL);
+- }
+- static void gsl_struct_decl_global_from_id(const char *name, int id)
+- {
+- gsl_declare_var(currentGoomSL->vars, name, id, NULL);
+- }
+-
+- /* FLOAT */
+- static void gsl_float_decl_local(const char *name)
+- {
+- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL);
+- }
+- /* INT */
+- static void gsl_int_decl_local(const char *name)
+- {
+- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL);
+- }
+- /* PTR */
+- static void gsl_ptr_decl_local(const char *name)
+- {
+- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL);
+- }
+- /* STRUCT */
+- static void gsl_struct_decl_local(const char *struct_name, const char *name)
+- {
+- gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name);
+- }
+-
+-
+- static void commit_test2(NodeType *set,const char *type, int instr);
+- static NodeType *new_call(const char *name, NodeType *affect_list);
+-
+- /* SETTER */
+- static NodeType *new_set(NodeType *lvalue, NodeType *expression)
+- { /* {{{ */
+- NodeType *set = new_op("set", OPR_SET, 2);
+- set->unode.opr.op[0] = lvalue;
+- set->unode.opr.op[1] = expression;
+- return set;
+- } /* }}} */
+- static void commit_set(NodeType *set)
+- { /* {{{ */
+- commit_test2(set,"set",INSTR_SET);
+- } /* }}} */
+-
+- /* PLUS_EQ */
+- static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+- {
+- NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2);
+- set->unode.opr.op[0] = lvalue;
+- set->unode.opr.op[1] = expression;
+- return set;
+- }
+- static void commit_plus_eq(NodeType *set)
+- {
+- precommit_node(set->unode.opr.op[1]);
+-#ifdef VERBOSE
+- printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number);
+- commit_node(set->unode.opr.op[0],0);
+- commit_node(set->unode.opr.op[1],1);
+- } /* }}} */
+-
+- /* SUB_EQ */
+- static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+- {
+- NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2);
+- set->unode.opr.op[0] = lvalue;
+- set->unode.opr.op[1] = expression;
+- return set;
+- }
+- static void commit_sub_eq(NodeType *set)
+- {
+- precommit_node(set->unode.opr.op[1]);
+-#ifdef VERBOSE
+- printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number);
+- commit_node(set->unode.opr.op[0],0);
+- commit_node(set->unode.opr.op[1],1);
+- } /* }}} */
+-
+- /* MUL_EQ */
+- static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+- {
+- NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2);
+- set->unode.opr.op[0] = lvalue;
+- set->unode.opr.op[1] = expression;
+- return set;
+- }
+- static void commit_mul_eq(NodeType *set)
+- {
+- precommit_node(set->unode.opr.op[1]);
+-#ifdef VERBOSE
+- printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number);
+- commit_node(set->unode.opr.op[0],0);
+- commit_node(set->unode.opr.op[1],1);
+- } /* }}} */
+-
+- /* DIV_EQ */
+- static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+- {
+- NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2);
+- set->unode.opr.op[0] = lvalue;
+- set->unode.opr.op[1] = expression;
+- return set;
+- }
+- static void commit_div_eq(NodeType *set)
+- {
+- precommit_node(set->unode.opr.op[1]);
+-#ifdef VERBOSE
+- printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number);
+- commit_node(set->unode.opr.op[0],0);
+- commit_node(set->unode.opr.op[1],1);
+- } /* }}} */
+-
+- /* commodity method for add, mult, ... */
+-
+- static void precommit_expr(NodeType *expr, const char *type, int instr_id)
+- { /* {{{ */
+- NodeType *tmp, *tmpcpy;
+- int toAdd;
+-
+- /* compute "left" and "right" */
+- switch (expr->unode.opr.nbOp) {
+- case 2:
+- precommit_node(expr->unode.opr.op[1]);
+- case 1:
+- precommit_node(expr->unode.opr.op[0]);
+- }
+-
+- if (is_tmp_expr(expr->unode.opr.op[0])) {
+- tmp = expr->unode.opr.op[0];
+- toAdd = 1;
+- }
+- else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) {
+- tmp = expr->unode.opr.op[1];
+- toAdd = 0;
+- }
+- else {
+- char stmp[256];
+- /* declare a temporary variable to store the result */
+- if (expr->unode.opr.op[0]->type == CONST_INT_NODE) {
+- sprintf(stmp,"_i_tmp_%i",allocateTemp());
+- gsl_int_decl_global(stmp);
+- }
+- else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) {
+- sprintf(stmp,"_f_tmp%i",allocateTemp());
+- gsl_float_decl_global(stmp);
+- }
+- else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) {
+- sprintf(stmp,"_p_tmp%i",allocateTemp());
+- gsl_ptr_decl_global(stmp);
+- }
+- else {
+- int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str);
+- if (type == INSTR_FLOAT) {
+- sprintf(stmp,"_f_tmp_%i",allocateTemp());
+- gsl_float_decl_global(stmp);
+- }
+- else if (type == INSTR_PTR) {
+- sprintf(stmp,"_p_tmp_%i",allocateTemp());
+- gsl_ptr_decl_global(stmp);
+- }
+- else if (type == INSTR_INT) {
+- sprintf(stmp,"_i_tmp_%i",allocateTemp());
+- gsl_int_decl_global(stmp);
+- }
+- else if (type == -1) {
+- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n",
+- expr->line_number, expr->unode.opr.op[0]->str);
+- exit(1);
+- }
+- else { /* type is a struct_id */
+- sprintf(stmp,"_s_tmp_%i",allocateTemp());
+- gsl_struct_decl_global_from_id(stmp,type);
+- }
+- }
+- tmp = new_var(stmp,expr->line_number);
+-
+- /* set the tmp to the value of "op1" */
+- tmpcpy = nodeClone(tmp);
+- commit_node(new_set(tmp,expr->unode.opr.op[0]),0);
+- toAdd = 1;
+-
+- tmp = tmpcpy;
+- }
+-
+- /* add op2 to tmp */
+-#ifdef VERBOSE
+- if (expr->unode.opr.nbOp == 2)
+- printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str);
+- else
+- printf("%s %s\n", type, tmp->str);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number);
+- tmpcpy = nodeClone(tmp);
+- commit_node(tmp,0);
+- if (expr->unode.opr.nbOp == 2) {
+- commit_node(expr->unode.opr.op[toAdd],1);
+- }
+-
+- /* redefine the ADD node now as the computed variable */
+- nodeFreeInternals(expr);
+- *expr = *tmpcpy;
+- free(tmpcpy);
+- } /* }}} */
+-
+- static NodeType *new_expr1(const char *name, int id, NodeType *expr1)
+- { /* {{{ */
+- NodeType *add = new_op(name, id, 1);
+- add->unode.opr.op[0] = expr1;
+- return add;
+- } /* }}} */
+-
+- static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2)
+- { /* {{{ */
+- NodeType *add = new_op(name, id, 2);
+- add->unode.opr.op[0] = expr1;
+- add->unode.opr.op[1] = expr2;
+- return add;
+- } /* }}} */
+-
+- /* ADD */
+- static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */
+- return new_expr2("add", OPR_ADD, expr1, expr2);
+- }
+- static void precommit_add(NodeType *add) {
+- precommit_expr(add,"add",INSTR_ADD);
+- } /* }}} */
+-
+- /* SUB */
+- static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */
+- return new_expr2("sub", OPR_SUB, expr1, expr2);
+- }
+- static void precommit_sub(NodeType *sub) {
+- precommit_expr(sub,"sub",INSTR_SUB);
+- } /* }}} */
+-
+- /* NEG */
+- static NodeType *new_neg(NodeType *expr) { /* {{{ */
+- NodeType *zeroConst = NULL;
+- if (expr->type == CONST_INT_NODE)
+- zeroConst = new_constInt("0", currentGoomSL->num_lines);
+- else if (expr->type == CONST_FLOAT_NODE)
+- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines);
+- else if (expr->type == CONST_PTR_NODE) {
+- fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n",
+- currentGoomSL->num_lines);
+- exit(1);
+- }
+- else {
+- int type = gsl_type_of_var(expr->vnamespace, expr->str);
+- if (type == INSTR_FLOAT)
+- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines);
+- else if (type == INSTR_PTR) {
+- fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n",
+- currentGoomSL->num_lines);
+- exit(1);
+- }
+- else if (type == INSTR_INT)
+- zeroConst = new_constInt("0", currentGoomSL->num_lines);
+- else if (type == -1) {
+- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n",
+- expr->line_number, expr->unode.opr.op[0]->str);
+- exit(1);
+- }
+- else { /* type is a struct_id */
+- fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n",
+- expr->line_number, expr->str);
+- exit(1);
+- }
+- }
+- return new_expr2("sub", OPR_SUB, zeroConst, expr);
+- }
+- /* }}} */
+-
+- /* MUL */
+- static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */
+- return new_expr2("mul", OPR_MUL, expr1, expr2);
+- }
+- static void precommit_mul(NodeType *mul) {
+- precommit_expr(mul,"mul",INSTR_MUL);
+- } /* }}} */
+-
+- /* DIV */
+- static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */
+- return new_expr2("div", OPR_DIV, expr1, expr2);
+- }
+- static void precommit_div(NodeType *mul) {
+- precommit_expr(mul,"div",INSTR_DIV);
+- } /* }}} */
+-
+- /* CALL EXPRESSION */
+- static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */
+- NodeType *call = new_call(name,affect_list);
+- NodeType *node = new_expr1(name, OPR_CALL_EXPR, call);
+- node->vnamespace = gsl_find_namespace(name);
+- if (node->vnamespace == NULL)
+- fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name);
+- return node;
+- }
+- static void precommit_call_expr(NodeType *call) {
+- char stmp[256];
+- NodeType *tmp,*tmpcpy;
+- int type = gsl_type_of_var(call->vnamespace, call->str);
+- if (type == INSTR_FLOAT) {
+- sprintf(stmp,"_f_tmp_%i",allocateTemp());
+- gsl_float_decl_global(stmp);
+- }
+- else if (type == INSTR_PTR) {
+- sprintf(stmp,"_p_tmp_%i",allocateTemp());
+- gsl_ptr_decl_global(stmp);
+- }
+- else if (type == INSTR_INT) {
+- sprintf(stmp,"_i_tmp_%i",allocateTemp());
+- gsl_int_decl_global(stmp);
+- }
+- else if (type == -1) {
+- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n",
+- call->line_number, call->str);
+- exit(1);
+- }
+- else { /* type is a struct_id */
+- sprintf(stmp,"_s_tmp_%i",allocateTemp());
+- gsl_struct_decl_global_from_id(stmp,type);
+- }
+- tmp = new_var(stmp,call->line_number);
+- commit_node(call->unode.opr.op[0],0);
+- tmpcpy = nodeClone(tmp);
+- commit_node(new_set(tmp,new_var(call->str,call->line_number)),0);
+-
+- nodeFreeInternals(call);
+- *call = *tmpcpy;
+- free(tmpcpy);
+- } /* }}} */
+-
+- static void commit_test2(NodeType *set,const char *type, int instr)
+- { /* {{{ */
+- NodeType *tmp;
+- char stmp[256];
+- precommit_node(set->unode.opr.op[0]);
+- precommit_node(set->unode.opr.op[1]);
+- tmp = set->unode.opr.op[0];
+-
+- stmp[0] = 0;
+- if (set->unode.opr.op[0]->type == CONST_INT_NODE) {
+- sprintf(stmp,"_i_tmp_%i",allocateTemp());
+- gsl_int_decl_global(stmp);
+- }
+- else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) {
+- sprintf(stmp,"_f_tmp%i",allocateTemp());
+- gsl_float_decl_global(stmp);
+- }
+- else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) {
+- sprintf(stmp,"_p_tmp%i",allocateTemp());
+- gsl_ptr_decl_global(stmp);
+- }
+- if (stmp[0]) {
+- NodeType *tmpcpy;
+- tmp = new_var(stmp, set->line_number);
+- tmpcpy = nodeClone(tmp);
+- commit_node(new_set(tmp,set->unode.opr.op[0]),0);
+- tmp = tmpcpy;
+- }
+-
+-#ifdef VERBOSE
+- printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number);
+- commit_node(tmp,instr!=INSTR_SET);
+- commit_node(set->unode.opr.op[1],1);
+- } /* }}} */
+-
+- /* NOT */
+- static NodeType *new_not(NodeType *expr1) { /* {{{ */
+- return new_expr1("not", OPR_NOT, expr1);
+- }
+- static void commit_not(NodeType *set)
+- {
+- commit_node(set->unode.opr.op[0],0);
+-#ifdef VERBOSE
+- printf("not\n");
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL);
+- } /* }}} */
+-
+- /* EQU */
+- static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */
+- return new_expr2("isequal", OPR_EQU, expr1, expr2);
+- }
+- static void commit_equ(NodeType *mul) {
+- commit_test2(mul,"isequal",INSTR_ISEQUAL);
+- } /* }}} */
+-
+- /* INF */
+- static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */
+- return new_expr2("islower", OPR_LOW, expr1, expr2);
+- }
+- static void commit_low(NodeType *mul) {
+- commit_test2(mul,"islower",INSTR_ISLOWER);
+- } /* }}} */
+-
+- /* WHILE */
+- static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */
+- NodeType *node = new_op("while", OPR_WHILE, 2);
+- node->unode.opr.op[0] = expression;
+- node->unode.opr.op[1] = instr;
+- return node;
+- }
+-
+- static void commit_while(NodeType *node)
+- {
+- int lbl = allocateLabel();
+- char start_while[1024], test_while[1024];
+- sprintf(start_while, "|start_while_%d|", lbl);
+- sprintf(test_while, "|test_while_%d|", lbl);
+-
+- GSL_PUT_JUMP(test_while,node->line_number);
+- GSL_PUT_LABEL(start_while,node->line_number);
+-
+- /* code */
+- commit_node(node->unode.opr.op[1],0);
+-
+- GSL_PUT_LABEL(test_while,node->line_number);
+- commit_node(node->unode.opr.op[0],0);
+- GSL_PUT_JNZERO(start_while,node->line_number);
+- } /* }}} */
+-
+- /* FOR EACH */
+- static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */
+- NodeType *node = new_op("for", OPR_FOREACH, 3);
+- node->unode.opr.op[0] = var;
+- node->unode.opr.op[1] = var_list;
+- node->unode.opr.op[2] = instr;
+- node->line_number = currentGoomSL->num_lines;
+- return node;
+- }
+- static void commit_foreach(NodeType *node)
+- {
+- NodeType *cur = node->unode.opr.op[1];
+- char tmp_func[256], tmp_loop[256];
+- int lbl = allocateLabel();
+- sprintf(tmp_func, "|foreach_func_%d|", lbl);
+- sprintf(tmp_loop, "|foreach_loop_%d|", lbl);
+-
+- GSL_PUT_JUMP(tmp_loop, node->line_number);
+- GSL_PUT_LABEL(tmp_func, node->line_number);
+-
+- precommit_node(node->unode.opr.op[2]);
+- commit_node(node->unode.opr.op[2], 0);
+-
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL);
+-#ifdef VERBOSE
+- printf("ret\n");
+-#endif
+-
+- GSL_PUT_LABEL(tmp_loop, node->line_number);
+-
+- while (cur != NULL)
+- {
+- NodeType *x, *var;
+-
+- /* 1: x=var */
+- x = nodeClone(node->unode.opr.op[0]);
+- var = nodeClone(cur->unode.opr.op[0]);
+- commit_node(new_set(x, var),0);
+-
+- /* 2: instr */
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL);
+-#ifdef VERBOSE
+- printf("call %s\n", tmp_func);
+-#endif
+-
+- /* 3: var=x */
+- x = nodeClone(node->unode.opr.op[0]);
+- var = cur->unode.opr.op[0];
+- commit_node(new_set(var, x),0);
+- cur = cur->unode.opr.op[1];
+- }
+- nodeFree(node->unode.opr.op[0]);
+- } /* }}} */
+-
+- /* IF */
+- static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */
+- NodeType *node = new_op("if", OPR_IF, 2);
+- node->unode.opr.op[0] = expression;
+- node->unode.opr.op[1] = instr;
+- return node;
+- }
+- static void commit_if(NodeType *node) {
+-
+- char slab[1024];
+- sprintf(slab, "|eif%d|", allocateLabel());
+- commit_node(node->unode.opr.op[0],0);
+- GSL_PUT_JZERO(slab,node->line_number);
+- /* code */
+- commit_node(node->unode.opr.op[1],0);
+- GSL_PUT_LABEL(slab,node->line_number);
+- } /* }}} */
+-
+- /* BLOCK */
+- static NodeType *new_block(NodeType *lastNode) { /* {{{ */
+- NodeType *blk = new_op("block", OPR_BLOCK, 2);
+- blk->unode.opr.op[0] = new_nop("start_of_block");
+- blk->unode.opr.op[1] = lastNode;
+- return blk;
+- }
+- static void commit_block(NodeType *node) {
+- commit_node(node->unode.opr.op[0]->unode.opr.next,0);
+- } /* }}} */
+-
+- /* FUNCTION INTRO */
+- static NodeType *new_function_intro(const char *name) { /* {{{ */
+- char stmp[256];
+- if (strlen(name) < 200) {
+- sprintf(stmp, "|__func_%s|", name);
+- }
+- return new_op(stmp, OPR_FUNC_INTRO, 0);
+- }
+- static void commit_function_intro(NodeType *node) {
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL);
+-#ifdef VERBOSE
+- printf("label %s\n", node->str);
+-#endif
+- } /* }}} */
+-
+- /* FUNCTION OUTRO */
+- static NodeType *new_function_outro() { /* {{{ */
+- return new_op("ret", OPR_FUNC_OUTRO, 0);
+- }
+- static void commit_function_outro(NodeType *node) {
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL);
+- releaseAllTemps();
+-#ifdef VERBOSE
+- printf("ret\n");
+-#endif
+- } /* }}} */
+-
+- /* AFFECTATION LIST */
+- static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */
+- {
+- NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2);
+- node->unode.opr.op[0] = set;
+- node->unode.opr.op[1] = next;
+- return node;
+- }
+- static NodeType *new_affect_list_after(NodeType *affect_list)
+- {
+- NodeType *ret = NULL;
+- NodeType *cur = affect_list;
+- while(cur != NULL) {
+- NodeType *set = cur->unode.opr.op[0];
+- NodeType *next = cur->unode.opr.op[1];
+- NodeType *lvalue = set->unode.opr.op[0];
+- NodeType *expression = set->unode.opr.op[1];
+- if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) {
+- NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue));
+- ret = new_affec_list(nset, ret);
+- }
+- cur = next;
+- }
+- return ret;
+- }
+- static void commit_affect_list(NodeType *node)
+- {
+- NodeType *cur = node;
+- while(cur != NULL) {
+- NodeType *set = cur->unode.opr.op[0];
+- precommit_node(set->unode.opr.op[0]);
+- precommit_node(set->unode.opr.op[1]);
+- cur = cur->unode.opr.op[1];
+- }
+- cur = node;
+- while(cur != NULL) {
+- NodeType *set = cur->unode.opr.op[0];
+- commit_node(set,0);
+- cur = cur->unode.opr.op[1];
+- }
+- } /* }}} */
+-
+- /* VAR LIST */
+- static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */
+- {
+- NodeType *node = new_op("var_list", OPR_VAR_LIST, 2);
+- node->unode.opr.op[0] = var;
+- node->unode.opr.op[1] = next;
+- return node;
+- }
+- static void commit_var_list(NodeType *node)
+- {
+- } /* }}} */
+-
+- /* FUNCTION CALL */
+- static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */
+- HashValue *fval;
+- fval = goom_hash_get(currentGoomSL->functions, name);
+- if (!fval) {
+- gsl_declare_task(name);
+- fval = goom_hash_get(currentGoomSL->functions, name);
+- }
+- if (!fval) {
+- fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name);
+- exit(1);
+- return NULL;
+- }
+- else {
+- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr;
+- if (gef->is_extern) {
+- NodeType *node = new_op(name, OPR_EXT_CALL, 1);
+- node->unode.opr.op[0] = affect_list;
+- return node;
+- }
+- else {
+- NodeType *node;
+- char stmp[256];
+- if (strlen(name) < 200) {
+- sprintf(stmp, "|__func_%s|", name);
+- }
+- node = new_op(stmp, OPR_CALL, 1);
+- node->unode.opr.op[0] = affect_list;
+- return node;
+- }
+- }
+- }
+- static void commit_ext_call(NodeType *node) {
+- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]);
+- commit_node(node->unode.opr.op[0],0);
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR);
+-#ifdef VERBOSE
+- printf("extcall %s\n", node->str);
+-#endif
+- commit_node(alafter,0);
+- }
+- static void commit_call(NodeType *node) {
+- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]);
+- commit_node(node->unode.opr.op[0],0);
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL);
+-#ifdef VERBOSE
+- printf("call %s\n", node->str);
+-#endif
+- commit_node(alafter,0);
+- } /* }}} */
+-
+- /** **/
+-
+- static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */
+- static NodeType *lastNode = 0;
+- static NodeType *gsl_append(NodeType *curNode) {
+- if (curNode == 0) return 0; /* {{{ */
+- if (lastNode)
+- lastNode->unode.opr.next = curNode;
+- lastNode = curNode;
+- while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next;
+- if (rootNode == 0)
+- rootNode = curNode;
+- return curNode;
+- } /* }}} */
+-
+-#if 1
+- int allocateTemp() {
+- return allocateLabel();
+- }
+- void releaseAllTemps() {}
+- void releaseTemp(int n) {}
+-#else
+- static int nbTemp = 0;
+- static int *tempArray = 0;
+- static int tempArraySize = 0;
+- int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */
+- int i = 0; /* {{{ */
+- if (tempArray == 0) {
+- tempArraySize = 256;
+- tempArray = (int*)malloc(tempArraySize * sizeof(int));
+- }
+- while (1) {
+- int j;
+- for (j=0;j<nbTemp;++j) {
+- if (tempArray[j] == i) break;
+- }
+- if (j == nbTemp) {
+- if (nbTemp == tempArraySize) {
+- tempArraySize *= 2;
+- tempArray = (int*)realloc(tempArray,tempArraySize * sizeof(int));
+- }
+- tempArray[nbTemp++] = i;
+- return i;
+- }
+- i++;
+- }
+- } /* }}} */
+- void releaseAllTemps() {
+- nbTemp = 0; /* {{{ */
+- } /* }}} */
+- void releaseTemp(int n) {
+- int j; /* {{{ */
+- for (j=0;j<nbTemp;++j) {
+- if (tempArray[j] == n) {
+- tempArray[j] = tempArray[--nbTemp];
+- break;
+- }
+- }
+- } /* }}} */
+-#endif
+-
+- static int lastLabel = 0;
+- int allocateLabel() {
+- return ++lastLabel; /* {{{ */
+- } /* }}} */
+-
+- void gsl_commit_compilation()
+- { /* {{{ */
+- commit_node(rootNode,0);
+- rootNode = 0;
+- lastNode = 0;
+- } /* }}} */
+-
+- void precommit_node(NodeType *node)
+- { /* {{{ */
+- /* do here stuff for expression.. for exemple */
+- if (node->type == OPR_NODE)
+- switch(node->unode.opr.type) {
+- case OPR_ADD: precommit_add(node); break;
+- case OPR_SUB: precommit_sub(node); break;
+- case OPR_MUL: precommit_mul(node); break;
+- case OPR_DIV: precommit_div(node); break;
+- case OPR_CALL_EXPR: precommit_call_expr(node); break;
+- }
+- } /* }}} */
+-
+- void commit_node(NodeType *node, int releaseIfTmp)
+- { /* {{{ */
+- if (node == 0) return;
+-
+- switch(node->type) {
+- case OPR_NODE:
+- switch(node->unode.opr.type) {
+- case OPR_SET: commit_set(node); break;
+- case OPR_PLUS_EQ: commit_plus_eq(node); break;
+- case OPR_SUB_EQ: commit_sub_eq(node); break;
+- case OPR_MUL_EQ: commit_mul_eq(node); break;
+- case OPR_DIV_EQ: commit_div_eq(node); break;
+- case OPR_IF: commit_if(node); break;
+- case OPR_WHILE: commit_while(node); break;
+- case OPR_BLOCK: commit_block(node); break;
+- case OPR_FUNC_INTRO: commit_function_intro(node); break;
+- case OPR_FUNC_OUTRO: commit_function_outro(node); break;
+- case OPR_CALL: commit_call(node); break;
+- case OPR_EXT_CALL: commit_ext_call(node); break;
+- case OPR_EQU: commit_equ(node); break;
+- case OPR_LOW: commit_low(node); break;
+- case OPR_NOT: commit_not(node); break;
+- case OPR_AFFECT_LIST: commit_affect_list(node); break;
+- case OPR_FOREACH: commit_foreach(node); break;
+- case OPR_VAR_LIST: commit_var_list(node); break;
+-#ifdef VERBOSE
+- case EMPTY_NODE: printf("NOP\n"); break;
+-#endif
+- }
+-
+- commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */
+- break;
+-
+- case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace);
+- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break;
+- case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break;
+- case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break;
+- case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break;
+- }
+- if (releaseIfTmp && is_tmp_expr(node))
+- releaseTemp(get_tmp_id(node));
+-
+- nodeFree(node);
+- } /* }}} */
+-
+- NodeType *nodeNew(const char *str, int type, int line_number) {
+- NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */
+- node->type = type;
+- node->str = (char*)malloc(strlen(str)+1);
+- node->vnamespace = NULL;
+- node->line_number = line_number;
+- strcpy(node->str, str);
+- return node;
+- } /* }}} */
+- static NodeType *nodeClone(NodeType *node) {
+- NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */
+- ret->vnamespace = node->vnamespace;
+- ret->unode = node->unode;
+- return ret;
+- } /* }}} */
+-
+- void nodeFreeInternals(NodeType *node) {
+- free(node->str); /* {{{ */
+- } /* }}} */
+-
+- void nodeFree(NodeType *node) {
+- nodeFreeInternals(node); /* {{{ */
+- free(node);
+- } /* }}} */
+-
+- NodeType *new_constInt(const char *str, int line_number) {
+- NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */
+- node->unode.constInt.val = atoi(str);
+- return node;
+- } /* }}} */
+-
+- NodeType *new_constPtr(const char *str, int line_number) {
+- NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */
+- node->unode.constPtr.id = strtol(str,NULL,0);
+- return node;
+- } /* }}} */
+-
+- NodeType *new_constFloat(const char *str, int line_number) {
+- NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */
+- node->unode.constFloat.val = atof(str);
+- return node;
+- } /* }}} */
+-
+- NodeType *new_var(const char *str, int line_number) {
+- NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */
+- node->vnamespace = gsl_find_namespace(str);
+- if (node->vnamespace == 0) {
+- fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str);
+- exit(1);
+- }
+- return node;
+- } /* }}} */
+-
+- NodeType *new_nop(const char *str) {
+- NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */
+- return node;
+- } /* }}} */
+-
+- NodeType *new_op(const char *str, int type, int nbOp) {
+- int i; /* {{{ */
+- NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines);
+- node->unode.opr.next = 0;
+- node->unode.opr.type = type;
+- node->unode.opr.nbOp = nbOp;
+- for (i=0;i<nbOp;++i) node->unode.opr.op[i] = 0;
+- return node;
+- } /* }}} */
+-
+-
+- void gsl_declare_global_variable(int type, char *name) {
+- switch(type){
+- case -1: break;
+- case FLOAT_TK:gsl_float_decl_global(name);break;
+- case INT_TK: gsl_int_decl_global(name);break;
+- case PTR_TK: gsl_ptr_decl_global(name);break;
+- default:
+- {
+- int id = type - 1000;
+- gsl_struct_decl_global_from_id(name,id);
+- }
+- }
+- }
+-
+-
+-
+-/* Enabling traces. */
+-#ifndef YYDEBUG
+-# define YYDEBUG 0
+-#endif
+-
+-/* Enabling verbose error messages. */
+-#ifdef YYERROR_VERBOSE
+-# undef YYERROR_VERBOSE
+-# define YYERROR_VERBOSE 1
+-#else
+-# define YYERROR_VERBOSE 0
+-#endif
+-
+-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+-#line 1199 "goomsl_yacc.y"
+-typedef union YYSTYPE {
+- int intValue;
+- float floatValue;
+- char charValue;
+- char strValue[2048];
+- NodeType *nPtr;
+- GoomHash *namespace;
+- GSL_Struct *gsl_struct;
+- GSL_StructField *gsl_struct_field;
+- } YYSTYPE;
+-/* Line 191 of yacc.c. */
+-#line 1327 "goomsl_yacc.c"
+-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+-# define YYSTYPE_IS_DECLARED 1
+-# define YYSTYPE_IS_TRIVIAL 1
+-#endif
+-
+-
+-
+-/* Copy the second part of user declarations. */
+-
+-
+-/* Line 214 of yacc.c. */
+-#line 1339 "goomsl_yacc.c"
+-
+-#if ! defined (yyoverflow) || YYERROR_VERBOSE
+-
+-/* The parser invokes alloca or malloc; define the necessary symbols. */
+-
+-# if YYSTACK_USE_ALLOCA
+-# define YYSTACK_ALLOC alloca
+-# else
+-# ifndef YYSTACK_USE_ALLOCA
+-# if defined (alloca) || defined (_ALLOCA_H)
+-# define YYSTACK_ALLOC alloca
+-# else
+-# ifdef __GNUC__
+-# define YYSTACK_ALLOC __builtin_alloca
+-# endif
+-# endif
+-# endif
+-# endif
+-
+-# ifdef YYSTACK_ALLOC
+- /* Pacify GCC's `empty if-body' warning. */
+-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+-# else
+-# if defined (__STDC__) || defined (__cplusplus)
+-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+-# define YYSIZE_T size_t
+-# endif
+-# define YYSTACK_ALLOC malloc
+-# define YYSTACK_FREE free
+-# endif
+-#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+-
+-
+-#if (! defined (yyoverflow) \
+- && (! defined (__cplusplus) \
+- || (YYSTYPE_IS_TRIVIAL)))
+-
+-/* A type that is properly aligned for any stack member. */
+-union yyalloc
+-{
+- short yyss;
+- YYSTYPE yyvs;
+- };
+-
+-/* The size of the maximum gap between one aligned stack and the next. */
+-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+-
+-/* The size of an array large to enough to hold all stacks, each with
+- N elements. */
+-# define YYSTACK_BYTES(N) \
+- ((N) * (sizeof (short) + sizeof (YYSTYPE)) \
+- + YYSTACK_GAP_MAXIMUM)
+-
+-/* Copy COUNT objects from FROM to TO. The source and destination do
+- not overlap. */
+-# ifndef YYCOPY
+-# if 1 < __GNUC__
+-# define YYCOPY(To, From, Count) \
+- __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+-# else
+-# define YYCOPY(To, From, Count) \
+- do \
+- { \
+- register YYSIZE_T yyi; \
+- for (yyi = 0; yyi < (Count); yyi++) \
+- (To)[yyi] = (From)[yyi]; \
+- } \
+- while (0)
+-# endif
+-# endif
+-
+-/* Relocate STACK from its old location to the new one. The
+- local variables YYSIZE and YYSTACKSIZE give the old and new number of
+- elements in the stack, and YYPTR gives the new location of the
+- stack. Advance YYPTR to a properly aligned location for the next
+- stack. */
+-# define YYSTACK_RELOCATE(Stack) \
+- do \
+- { \
+- YYSIZE_T yynewbytes; \
+- YYCOPY (&yyptr->Stack, Stack, yysize); \
+- Stack = &yyptr->Stack; \
+- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+- yyptr += yynewbytes / sizeof (*yyptr); \
+- } \
+- while (0)
+-
+-#endif
+-
+-#if defined (__STDC__) || defined (__cplusplus)
+- typedef signed char yysigned_char;
+-#else
+- typedef short yysigned_char;
+-#endif
+-
+-/* YYFINAL -- State number of the termination state. */
+-#define YYFINAL 3
+-/* YYLAST -- Last index in YYTABLE. */
+-#define YYLAST 229
+-
+-/* YYNTOKENS -- Number of terminals. */
+-#define YYNTOKENS 42
+-/* YYNNTS -- Number of nonterminals. */
+-#define YYNNTS 30
+-/* YYNRULES -- Number of rules. */
+-#define YYNRULES 89
+-/* YYNRULES -- Number of states. */
+-#define YYNSTATES 217
+-
+-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+-#define YYUNDEFTOK 2
+-#define YYMAXUTOK 279
+-
+-#define YYTRANSLATE(YYX) \
+- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+-
+-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+-static const unsigned char yytranslate[] =
+-{
+- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 25, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 35, 36, 32, 29, 34, 30, 2, 31, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 33, 2,
+- 27, 26, 28, 37, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 40, 2, 41, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 38, 2, 39, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24
+-};
+-
+-#if YYDEBUG
+-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+- YYRHS. */
+-static const unsigned short yyprhs[] =
+-{
+- 0, 0, 3, 7, 10, 19, 30, 39, 50, 53,
+- 56, 57, 65, 68, 73, 76, 79, 82, 85, 87,
+- 89, 90, 93, 96, 99, 102, 104, 108, 111, 112,
+- 116, 122, 130, 131, 132, 137, 142, 147, 152, 154,
+- 157, 160, 163, 166, 169, 172, 179, 186, 193, 195,
+- 199, 203, 207, 211, 218, 222, 224, 227, 231, 232,
+- 234, 236, 240, 244, 248, 252, 255, 259, 261, 265,
+- 269, 273, 277, 281, 285, 288, 290, 292, 294, 298,
+- 304, 310, 318, 323, 330, 333, 335, 340, 344, 346
+-};
+-
+-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+-static const yysigned_char yyrhs[] =
+-{
+- 43, 0, -1, 44, 55, 52, -1, 44, 59, -1,
+- 44, 11, 27, 48, 28, 50, 25, 56, -1, 44,
+- 11, 27, 48, 33, 51, 28, 50, 25, 56, -1,
+- 44, 10, 27, 49, 28, 50, 25, 56, -1, 44,
+- 10, 27, 49, 33, 51, 28, 50, 25, 56, -1,
+- 44, 45, -1, 44, 25, -1, -1, 22, 27, 5,
+- 33, 46, 28, 25, -1, 71, 47, -1, 46, 34,
+- 71, 47, -1, 8, 5, -1, 9, 5, -1, 7,
+- 5, -1, 5, 5, -1, 5, -1, 5, -1, -1,
+- 33, 8, -1, 33, 9, -1, 33, 7, -1, 33,
+- 5, -1, 58, -1, 58, 34, 51, -1, 52, 53,
+- -1, -1, 54, 44, 55, -1, 27, 49, 28, 50,
+- 25, -1, 27, 49, 33, 51, 28, 50, 25, -1,
+- -1, -1, 9, 5, 26, 64, -1, 8, 5, 26,
+- 64, -1, 7, 5, 26, 64, -1, 5, 5, 26,
+- 64, -1, 58, -1, 9, 5, -1, 8, 5, -1,
+- 7, 5, -1, 5, 5, -1, 62, 25, -1, 57,
+- 25, -1, 35, 65, 36, 37, 71, 59, -1, 12,
+- 65, 71, 13, 71, 59, -1, 38, 25, 63, 44,
+- 39, 25, -1, 67, -1, 5, 15, 64, -1, 5,
+- 16, 64, -1, 5, 18, 64, -1, 5, 17, 64,
+- -1, 23, 5, 24, 60, 13, 59, -1, 35, 61,
+- 36, -1, 5, -1, 5, 61, -1, 5, 26, 64,
+- -1, -1, 5, -1, 66, -1, 64, 32, 64, -1,
+- 64, 31, 64, -1, 64, 29, 64, -1, 64, 30,
+- 64, -1, 30, 64, -1, 35, 64, 36, -1, 68,
+- -1, 64, 26, 64, -1, 64, 27, 64, -1, 64,
+- 28, 64, -1, 64, 19, 64, -1, 64, 20, 64,
+- -1, 64, 21, 64, -1, 14, 65, -1, 4, -1,
+- 3, -1, 6, -1, 49, 25, 56, -1, 49, 33,
+- 69, 25, 56, -1, 40, 49, 41, 25, 56, -1,
+- 40, 49, 33, 69, 41, 25, 56, -1, 40, 49,
+- 56, 41, -1, 40, 49, 33, 69, 41, 56, -1,
+- 70, 69, -1, 70, -1, 5, 26, 56, 64, -1,
+- 33, 56, 64, -1, 25, -1, -1
+-};
+-
+-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+-static const unsigned short yyrline[] =
+-{
+- 0, 1236, 1236, 1238, 1239, 1240, 1241, 1242, 1243, 1244,
+- 1245, 1250, 1253, 1254, 1257, 1258, 1259, 1260, 1265, 1267,
+- 1270, 1271, 1272, 1273, 1274, 1277, 1278, 1283, 1284, 1287,
+- 1289, 1291, 1294, 1296, 1300, 1301, 1302, 1303, 1304, 1307,
+- 1308, 1309, 1310, 1315, 1316, 1317, 1318, 1319, 1320, 1321,
+- 1322, 1323, 1324, 1325, 1328, 1330, 1331, 1334, 1336, 1339,
+- 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1350, 1351,
+- 1352, 1353, 1354, 1355, 1356, 1359, 1360, 1361, 1366, 1367,
+- 1368, 1369, 1373, 1374, 1377, 1378, 1380, 1384, 1393, 1393
+-};
+-#endif
+-
+-#if YYDEBUG || YYERROR_VERBOSE
+-/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+- First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+-static const char *const yytname[] =
+-{
+- "$end", "error", "$undefined", "LTYPE_INTEGER", "LTYPE_FLOAT",
+- "LTYPE_VAR", "LTYPE_PTR", "PTR_TK", "INT_TK", "FLOAT_TK", "DECLARE",
+- "EXTERNAL", "WHILE", "DO", "NOT", "PLUS_EQ", "SUB_EQ", "DIV_EQ",
+- "MUL_EQ", "SUP_EQ", "LOW_EQ", "NOT_EQ", "STRUCT", "FOR", "IN", "'\\n'",
+- "'='", "'<'", "'>'", "'+'", "'-'", "'/'", "'*'", "':'", "','", "'('",
+- "')'", "'?'", "'{'", "'}'", "'['", "']'", "$accept", "gsl", "gsl_code",
+- "struct_declaration", "struct_members", "struct_member",
+- "ext_task_name", "task_name", "return_type", "arglist",
+- "gsl_def_functions", "function", "function_intro", "function_outro",
+- "leave_namespace", "declaration", "empty_declaration", "instruction",
+- "var_list", "var_list_content", "affectation", "start_block",
+- "expression", "test", "constValue", "func_call", "func_call_expression",
+- "affectation_list", "affectation_in_list", "opt_nl", 0
+-};
+-#endif
+-
+-# ifdef YYPRINT
+-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+- token YYLEX-NUM. */
+-static const unsigned short yytoknum[] =
+-{
+- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+- 275, 276, 277, 278, 279, 10, 61, 60, 62, 43,
+- 45, 47, 42, 58, 44, 40, 41, 63, 123, 125,
+- 91, 93
+-};
+-# endif
+-
+-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+-static const unsigned char yyr1[] =
+-{
+- 0, 42, 43, 44, 44, 44, 44, 44, 44, 44,
+- 44, 45, 46, 46, 47, 47, 47, 47, 48, 49,
+- 50, 50, 50, 50, 50, 51, 51, 52, 52, 53,
+- 54, 54, 55, 56, 57, 57, 57, 57, 57, 58,
+- 58, 58, 58, 59, 59, 59, 59, 59, 59, 59,
+- 59, 59, 59, 59, 60, 61, 61, 62, 63, 64,
+- 64, 64, 64, 64, 64, 64, 64, 64, 65, 65,
+- 65, 65, 65, 65, 65, 66, 66, 66, 67, 67,
+- 67, 67, 68, 68, 69, 69, 70, 70, 71, 71
+-};
+-
+-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+-static const unsigned char yyr2[] =
+-{
+- 0, 2, 3, 2, 8, 10, 8, 10, 2, 2,
+- 0, 7, 2, 4, 2, 2, 2, 2, 1, 1,
+- 0, 2, 2, 2, 2, 1, 3, 2, 0, 3,
+- 5, 7, 0, 0, 4, 4, 4, 4, 1, 2,
+- 2, 2, 2, 2, 2, 6, 6, 6, 1, 3,
+- 3, 3, 3, 6, 3, 1, 2, 3, 0, 1,
+- 1, 3, 3, 3, 3, 2, 3, 1, 3, 3,
+- 3, 3, 3, 3, 2, 1, 1, 1, 3, 5,
+- 5, 7, 4, 6, 2, 1, 4, 3, 1, 0
+-};
+-
+-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+- STATE-NUM when YYTABLE doesn't specify something else to do. Zero
+- means the default is an error. */
+-static const unsigned char yydefact[] =
+-{
+- 10, 0, 32, 1, 19, 0, 0, 0, 0, 0,
+- 0, 0, 0, 9, 0, 0, 0, 8, 0, 28,
+- 0, 38, 3, 0, 48, 42, 0, 0, 0, 0,
+- 0, 41, 40, 39, 0, 0, 76, 75, 59, 77,
+- 0, 0, 0, 0, 0, 89, 60, 67, 0, 0,
+- 0, 58, 19, 0, 33, 0, 2, 44, 43, 0,
+- 49, 50, 52, 51, 57, 0, 0, 0, 0, 18,
+- 0, 74, 65, 0, 33, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 88, 0, 0, 0, 0,
+- 10, 0, 0, 78, 0, 33, 0, 85, 0, 27,
+- 10, 37, 36, 35, 34, 20, 0, 20, 0, 66,
+- 0, 0, 71, 72, 73, 68, 69, 70, 63, 64,
+- 62, 61, 89, 89, 0, 0, 89, 0, 0, 33,
+- 33, 0, 33, 84, 0, 32, 0, 0, 0, 0,
+- 0, 0, 0, 25, 0, 0, 0, 82, 0, 0,
+- 0, 55, 0, 0, 0, 0, 0, 80, 0, 87,
+- 79, 20, 0, 29, 24, 23, 21, 22, 33, 42,
+- 41, 40, 39, 20, 0, 33, 20, 33, 46, 0,
+- 89, 0, 0, 0, 0, 12, 56, 54, 53, 45,
+- 47, 33, 86, 0, 0, 6, 0, 26, 4, 0,
+- 83, 11, 0, 17, 16, 14, 15, 81, 30, 20,
+- 33, 33, 13, 0, 7, 5, 31
+-};
+-
+-/* YYDEFGOTO[NTERM-NUM]. */
+-static const short yydefgoto[] =
+-{
+- -1, 1, 2, 17, 149, 185, 70, 18, 137, 142,
+- 56, 99, 100, 19, 93, 20, 21, 22, 125, 152,
+- 23, 90, 44, 45, 46, 24, 47, 96, 97, 86
+-};
+-
+-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+- STATE-NUM. */
+-#define YYPACT_NINF -116
+-static const short yypact[] =
+-{
+- -116, 40, 136, -116, 103, 39, 66, 68, 61, 65,
+- 1, 77, 101, -116, 1, 84, 109, -116, 12, -116,
+- 91, -116, -116, 97, -116, 98, 72, 72, 72, 72,
+- 72, 99, 104, 113, 109, 130, -116, -116, -116, -116,
+- 1, 72, 72, 109, 166, 115, -116, -116, 145, 131,
+- 118, -116, -116, -24, -116, -3, 138, -116, -116, 72,
+- 159, 159, 159, 159, 159, 72, 72, 72, 14, -116,
+- 51, -116, 22, 102, 124, 72, 72, 72, 72, 72,
+- 72, 72, 72, 72, 72, -116, 160, 139, 140, 141,
+- -116, -3, 152, -116, 154, -116, 156, -3, 109, -116,
+- -116, 159, 159, 159, 159, 150, 82, 150, 82, -116,
+- -3, 158, 159, 159, 159, 159, 159, 159, 22, 22,
+- -116, -116, 115, 115, 195, 188, 115, 88, 162, -116,
+- -116, 72, -116, -116, 52, 136, 155, 177, 199, 200,
+- 201, 202, 180, 175, 185, 183, 171, -116, 144, 18,
+- 161, 195, 178, 144, 144, 190, 191, -116, 72, 159,
+- -116, 150, 82, -116, -116, -116, -116, -116, -116, -116,
+- -116, -116, -116, 150, 82, -116, 150, -116, -116, 192,
+- 115, 208, 213, 214, 215, -116, -116, -116, -116, -116,
+- -116, -116, 159, 196, 194, -116, 198, -116, -116, 203,
+- -116, -116, 161, -116, -116, -116, -116, -116, -116, 150,
+- -116, -116, -116, 204, -116, -116, -116
+-};
+-
+-/* YYPGOTO[NTERM-NUM]. */
+-static const yysigned_char yypgoto[] =
+-{
+- -116, -116, -68, -116, -116, 23, -116, -15, -104, -92,
+- -116, -116, -116, 89, -74, -116, -88, -115, -116, 75,
+- -116, -116, -16, -6, -116, -116, -116, -62, -116, -99
+-};
+-
+-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+- positive, shift that token. If negative, reduce the rule which
+- number is the opposite. If zero, do what YYDEFACT says.
+- If YYTABLE_NINF, syntax error. */
+-#define YYTABLE_NINF -1
+-static const unsigned char yytable[] =
+-{
+- 111, 53, 94, 144, 36, 37, 38, 39, 50, 91,
+- 60, 61, 62, 63, 64, 40, 145, 92, 143, 68,
+- 143, 131, 127, 148, 150, 72, 73, 154, 74, 128,
+- 95, 41, 135, 178, 71, 133, 42, 54, 188, 189,
+- 3, 43, 105, 101, 31, 55, 179, 106, 146, 102,
+- 103, 104, 180, 83, 84, 157, 158, 193, 160, 112,
+- 113, 114, 115, 116, 117, 118, 119, 120, 121, 196,
+- 194, 32, 199, 33, 143, 36, 37, 38, 39, 107,
+- 161, 202, 197, 134, 108, 162, 143, 138, 34, 139,
+- 140, 141, 35, 4, 195, 5, 6, 7, 8, 9,
+- 10, 198, 41, 200, 48, 213, 49, 42, 25, 51,
+- 11, 12, 43, 13, 52, 159, 57, 207, 26, 27,
+- 28, 29, 58, 14, 59, 65, 15, 155, 16, 30,
+- 66, 81, 82, 83, 84, 69, 214, 215, 109, 67,
+- 85, 4, 192, 5, 6, 7, 8, 9, 10, 4,
+- 87, 5, 6, 7, 89, 88, 10, 110, 11, 12,
+- 164, 13, 165, 166, 167, 98, 181, 12, 182, 183,
+- 184, 14, 123, 122, 15, 124, 16, 129, 126, 14,
+- 130, 132, 15, 136, 16, 75, 76, 77, 81, 82,
+- 83, 84, 78, 79, 80, 81, 82, 83, 84, 147,
+- 151, 153, 168, 156, 169, 170, 171, 172, 173, 174,
+- 175, 176, 177, 203, 187, 190, 191, 201, 204, 205,
+- 206, 208, 209, 210, 163, 212, 186, 0, 211, 216
+-};
+-
+-static const short yycheck[] =
+-{
+- 74, 16, 5, 107, 3, 4, 5, 6, 14, 33,
+- 26, 27, 28, 29, 30, 14, 108, 41, 106, 34,
+- 108, 95, 90, 122, 123, 41, 42, 126, 43, 91,
+- 33, 30, 100, 148, 40, 97, 35, 25, 153, 154,
+- 0, 40, 28, 59, 5, 33, 28, 33, 110, 65,
+- 66, 67, 34, 31, 32, 129, 130, 161, 132, 75,
+- 76, 77, 78, 79, 80, 81, 82, 83, 84, 173,
+- 162, 5, 176, 5, 162, 3, 4, 5, 6, 28,
+- 28, 180, 174, 98, 33, 33, 174, 5, 27, 7,
+- 8, 9, 27, 5, 168, 7, 8, 9, 10, 11,
+- 12, 175, 30, 177, 27, 209, 5, 35, 5, 25,
+- 22, 23, 40, 25, 5, 131, 25, 191, 15, 16,
+- 17, 18, 25, 35, 26, 26, 38, 39, 40, 26,
+- 26, 29, 30, 31, 32, 5, 210, 211, 36, 26,
+- 25, 5, 158, 7, 8, 9, 10, 11, 12, 5,
+- 5, 7, 8, 9, 36, 24, 12, 33, 22, 23,
+- 5, 25, 7, 8, 9, 27, 5, 23, 7, 8,
+- 9, 35, 33, 13, 38, 35, 40, 25, 37, 35,
+- 26, 25, 38, 33, 40, 19, 20, 21, 29, 30,
+- 31, 32, 26, 27, 28, 29, 30, 31, 32, 41,
+- 5, 13, 25, 41, 5, 5, 5, 5, 28, 34,
+- 25, 28, 41, 5, 36, 25, 25, 25, 5, 5,
+- 5, 25, 28, 25, 135, 202, 151, -1, 25, 25
+-};
+-
+-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+- symbol of state STATE-NUM. */
+-static const unsigned char yystos[] =
+-{
+- 0, 43, 44, 0, 5, 7, 8, 9, 10, 11,
+- 12, 22, 23, 25, 35, 38, 40, 45, 49, 55,
+- 57, 58, 59, 62, 67, 5, 15, 16, 17, 18,
+- 26, 5, 5, 5, 27, 27, 3, 4, 5, 6,
+- 14, 30, 35, 40, 64, 65, 66, 68, 27, 5,
+- 65, 25, 5, 49, 25, 33, 52, 25, 25, 26,
+- 64, 64, 64, 64, 64, 26, 26, 26, 49, 5,
+- 48, 65, 64, 64, 49, 19, 20, 21, 26, 27,
+- 28, 29, 30, 31, 32, 25, 71, 5, 24, 36,
+- 63, 33, 41, 56, 5, 33, 69, 70, 27, 53,
+- 54, 64, 64, 64, 64, 28, 33, 28, 33, 36,
+- 33, 56, 64, 64, 64, 64, 64, 64, 64, 64,
+- 64, 64, 13, 33, 35, 60, 37, 44, 69, 25,
+- 26, 56, 25, 69, 49, 44, 33, 50, 5, 7,
+- 8, 9, 51, 58, 50, 51, 69, 41, 71, 46,
+- 71, 5, 61, 13, 71, 39, 41, 56, 56, 64,
+- 56, 28, 33, 55, 5, 7, 8, 9, 25, 5,
+- 5, 5, 5, 28, 34, 25, 28, 41, 59, 28,
+- 34, 5, 7, 8, 9, 47, 61, 36, 59, 59,
+- 25, 25, 64, 50, 51, 56, 50, 51, 56, 50,
+- 56, 25, 71, 5, 5, 5, 5, 56, 25, 28,
+- 25, 25, 47, 50, 56, 56, 25
+-};
+-
+-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+-# define YYSIZE_T __SIZE_TYPE__
+-#endif
+-#if ! defined (YYSIZE_T) && defined (size_t)
+-# define YYSIZE_T size_t
+-#endif
+-#if ! defined (YYSIZE_T)
+-# if defined (__STDC__) || defined (__cplusplus)
+-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+-# define YYSIZE_T size_t
+-# endif
+-#endif
+-#if ! defined (YYSIZE_T)
+-# define YYSIZE_T unsigned int
+-#endif
+-
+-#define yyerrok (yyerrstatus = 0)
+-#define yyclearin (yychar = YYEMPTY)
+-#define YYEMPTY (-2)
+-#define YYEOF 0
+-
+-#define YYACCEPT goto yyacceptlab
+-#define YYABORT goto yyabortlab
+-#define YYERROR goto yyerrlab1
+-
+-
+-/* Like YYERROR except do call yyerror. This remains here temporarily
+- to ease the transition to the new meaning of YYERROR, for GCC.
+- Once GCC version 2 has supplanted version 1, this can go. */
+-
+-#define YYFAIL goto yyerrlab
+-
+-#define YYRECOVERING() (!!yyerrstatus)
+-
+-#define YYBACKUP(Token, Value) \
+-do \
+- if (yychar == YYEMPTY && yylen == 1) \
+- { \
+- yychar = (Token); \
+- yylval = (Value); \
+- yytoken = YYTRANSLATE (yychar); \
+- YYPOPSTACK; \
+- goto yybackup; \
+- } \
+- else \
+- { \
+- yyerror ("syntax error: cannot back up");\
+- YYERROR; \
+- } \
+-while (0)
+-
+-#define YYTERROR 1
+-#define YYERRCODE 256
+-
+-/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+- are run). */
+-
+-#ifndef YYLLOC_DEFAULT
+-# define YYLLOC_DEFAULT(Current, Rhs, N) \
+- Current.first_line = Rhs[1].first_line; \
+- Current.first_column = Rhs[1].first_column; \
+- Current.last_line = Rhs[N].last_line; \
+- Current.last_column = Rhs[N].last_column;
+-#endif
+-
+-/* YYLEX -- calling `yylex' with the right arguments. */
+-
+-#ifdef YYLEX_PARAM
+-# define YYLEX yylex (YYLEX_PARAM)
+-#else
+-# define YYLEX yylex ()
+-#endif
+-
+-/* Enable debugging if requested. */
+-#if YYDEBUG
+-
+-# ifndef YYFPRINTF
+-# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+-# define YYFPRINTF fprintf
+-# endif
+-
+-# define YYDPRINTF(Args) \
+-do { \
+- if (yydebug) \
+- YYFPRINTF Args; \
+-} while (0)
+-
+-# define YYDSYMPRINT(Args) \
+-do { \
+- if (yydebug) \
+- yysymprint Args; \
+-} while (0)
+-
+-# define YYDSYMPRINTF(Title, Token, Value, Location) \
+-do { \
+- if (yydebug) \
+- { \
+- YYFPRINTF (stderr, "%s ", Title); \
+- yysymprint (stderr, \
+- Token, Value); \
+- YYFPRINTF (stderr, "\n"); \
+- } \
+-} while (0)
+-
+-/*------------------------------------------------------------------.
+-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+-| TOP (cinluded). |
+-`------------------------------------------------------------------*/
+-
+-#if defined (__STDC__) || defined (__cplusplus)
+-static void
+-yy_stack_print (short *bottom, short *top)
+-#else
+-static void
+-yy_stack_print (bottom, top)
+- short *bottom;
+- short *top;
+-#endif
+-{
+- YYFPRINTF (stderr, "Stack now");
+- for (/* Nothing. */; bottom <= top; ++bottom)
+- YYFPRINTF (stderr, " %d", *bottom);
+- YYFPRINTF (stderr, "\n");
+-}
+-
+-# define YY_STACK_PRINT(Bottom, Top) \
+-do { \
+- if (yydebug) \
+- yy_stack_print ((Bottom), (Top)); \
+-} while (0)
+-
+-
+-/*------------------------------------------------.
+-| Report that the YYRULE is going to be reduced. |
+-`------------------------------------------------*/
+-
+-#if defined (__STDC__) || defined (__cplusplus)
+-static void
+-yy_reduce_print (int yyrule)
+-#else
+-static void
+-yy_reduce_print (yyrule)
+- int yyrule;
+-#endif
+-{
+- int yyi;
+- unsigned int yylineno = yyrline[yyrule];
+- YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+- yyrule - 1, yylineno);
+- /* Print the symbols being reduced, and their result. */
+- for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+- YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+- YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+-}
+-
+-# define YY_REDUCE_PRINT(Rule) \
+-do { \
+- if (yydebug) \
+- yy_reduce_print (Rule); \
+-} while (0)
+-
+-/* Nonzero means print parse trace. It is left uninitialized so that
+- multiple parsers can coexist. */
+-int yydebug;
+-#else /* !YYDEBUG */
+-# define YYDPRINTF(Args)
+-# define YYDSYMPRINT(Args)
+-# define YYDSYMPRINTF(Title, Token, Value, Location)
+-# define YY_STACK_PRINT(Bottom, Top)
+-# define YY_REDUCE_PRINT(Rule)
+-#endif /* !YYDEBUG */
+-
+-
+-/* YYINITDEPTH -- initial size of the parser's stacks. */
+-#ifndef YYINITDEPTH
+-# define YYINITDEPTH 200
+-#endif
+-
+-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+- if the built-in stack extension method is used).
+-
+- Do not make this value too large; the results are undefined if
+- SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+- evaluated with infinite-precision integer arithmetic. */
+-
+-#if YYMAXDEPTH == 0
+-# undef YYMAXDEPTH
+-#endif
+-
+-#ifndef YYMAXDEPTH
+-# define YYMAXDEPTH 10000
+-#endif
+-
+-
+-
+-#if YYERROR_VERBOSE
+-
+-# ifndef yystrlen
+-# if defined (__GLIBC__) && defined (_STRING_H)
+-# define yystrlen strlen
+-# else
+-/* Return the length of YYSTR. */
+-static YYSIZE_T
+-# if defined (__STDC__) || defined (__cplusplus)
+-yystrlen (const char *yystr)
+-# else
+-yystrlen (yystr)
+- const char *yystr;
+-# endif
+-{
+- register const char *yys = yystr;
+-
+- while (*yys++ != '\0')
+- continue;
+-
+- return yys - yystr - 1;
+-}
+-# endif
+-# endif
+-
+-# ifndef yystpcpy
+-# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+-# define yystpcpy stpcpy
+-# else
+-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+- YYDEST. */
+-static char *
+-# if defined (__STDC__) || defined (__cplusplus)
+-yystpcpy (char *yydest, const char *yysrc)
+-# else
+-yystpcpy (yydest, yysrc)
+- char *yydest;
+- const char *yysrc;
+-# endif
+-{
+- register char *yyd = yydest;
+- register const char *yys = yysrc;
+-
+- while ((*yyd++ = *yys++) != '\0')
+- continue;
+-
+- return yyd - 1;
+-}
+-# endif
+-# endif
+-
+-#endif /* !YYERROR_VERBOSE */
+-
+-
+-
+-#if YYDEBUG
+-/*--------------------------------.
+-| Print this symbol on YYOUTPUT. |
+-`--------------------------------*/
+-
+-#if defined (__STDC__) || defined (__cplusplus)
+-static void
+-yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+-#else
+-static void
+-yysymprint (yyoutput, yytype, yyvaluep)
+- FILE *yyoutput;
+- int yytype;
+- YYSTYPE *yyvaluep;
+-#endif
+-{
+- /* Pacify ``unused variable'' warnings. */
+- (void) yyvaluep;
+-
+- if (yytype < YYNTOKENS)
+- {
+- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+-# ifdef YYPRINT
+- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+-# endif
+- }
+- else
+- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+-
+- switch (yytype)
+- {
+- default:
+- break;
+- }
+- YYFPRINTF (yyoutput, ")");
+-}
+-
+-#endif /* ! YYDEBUG */
+-/*-----------------------------------------------.
+-| Release the memory associated to this symbol. |
+-`-----------------------------------------------*/
+-
+-#if defined (__STDC__) || defined (__cplusplus)
+-static void
+-yydestruct (int yytype, YYSTYPE *yyvaluep)
+-#else
+-static void
+-yydestruct (yytype, yyvaluep)
+- int yytype;
+- YYSTYPE *yyvaluep;
+-#endif
+-{
+- /* Pacify ``unused variable'' warnings. */
+- (void) yyvaluep;
+-
+- switch (yytype)
+- {
+-
+- default:
+- break;
+- }
+-}
+-
+-
+-/* Prevent warnings from -Wmissing-prototypes. */
+-
+-#ifdef YYPARSE_PARAM
+-# if defined (__STDC__) || defined (__cplusplus)
+-int yyparse (void *YYPARSE_PARAM);
+-# else
+-int yyparse ();
+-# endif
+-#else /* ! YYPARSE_PARAM */
+-#if defined (__STDC__) || defined (__cplusplus)
+-int yyparse (void);
+-#else
+-int yyparse ();
+-#endif
+-#endif /* ! YYPARSE_PARAM */
+-
+-
+-
+-/* The lookahead symbol. */
+-int yychar;
+-
+-/* The semantic value of the lookahead symbol. */
+-YYSTYPE yylval;
+-
+-/* Number of syntax errors so far. */
+-int yynerrs;
+-
+-
+-
+-/*----------.
+-| yyparse. |
+-`----------*/
+-
+-#ifdef YYPARSE_PARAM
+-# if defined (__STDC__) || defined (__cplusplus)
+-int yyparse (void *YYPARSE_PARAM)
+-# else
+-int yyparse (YYPARSE_PARAM)
+- void *YYPARSE_PARAM;
+-# endif
+-#else /* ! YYPARSE_PARAM */
+-#if defined (__STDC__) || defined (__cplusplus)
+-int
+-yyparse (void)
+-#else
+-int
+-yyparse ()
+-
+-#endif
+-#endif
+-{
+-
+- register int yystate;
+- register int yyn;
+- int yyresult;
+- /* Number of tokens to shift before error messages enabled. */
+- int yyerrstatus;
+- /* Lookahead token as an internal (translated) token number. */
+- int yytoken = 0;
+-
+- /* Three stacks and their tools:
+- `yyss': related to states,
+- `yyvs': related to semantic values,
+- `yyls': related to locations.
+-
+- Refer to the stacks thru separate pointers, to allow yyoverflow
+- to reallocate them elsewhere. */
+-
+- /* The state stack. */
+- short yyssa[YYINITDEPTH];
+- short *yyss = yyssa;
+- register short *yyssp;
+-
+- /* The semantic value stack. */
+- YYSTYPE yyvsa[YYINITDEPTH];
+- YYSTYPE *yyvs = yyvsa;
+- register YYSTYPE *yyvsp;
+-
+-
+-
+-#define YYPOPSTACK (yyvsp--, yyssp--)
+-
+- YYSIZE_T yystacksize = YYINITDEPTH;
+-
+- /* The variables used to return semantic value and location from the
+- action routines. */
+- YYSTYPE yyval;
+-
+-
+- /* When reducing, the number of symbols on the RHS of the reduced
+- rule. */
+- int yylen;
+-
+- YYDPRINTF ((stderr, "Starting parse\n"));
+-
+- yystate = 0;
+- yyerrstatus = 0;
+- yynerrs = 0;
+- yychar = YYEMPTY; /* Cause a token to be read. */
+-
+- /* Initialize stack pointers.
+- Waste one element of value and location stack
+- so that they stay on the same level as the state stack.
+- The wasted elements are never initialized. */
+-
+- yyssp = yyss;
+- yyvsp = yyvs;
+-
+- goto yysetstate;
+-
+-/*------------------------------------------------------------.
+-| yynewstate -- Push a new state, which is found in yystate. |
+-`------------------------------------------------------------*/
+- yynewstate:
+- /* In all cases, when you get here, the value and location stacks
+- have just been pushed. so pushing a state here evens the stacks.
+- */
+- yyssp++;
+-
+- yysetstate:
+- *yyssp = yystate;
+-
+- if (yyss + yystacksize - 1 <= yyssp)
+- {
+- /* Get the current used size of the three stacks, in elements. */
+- YYSIZE_T yysize = yyssp - yyss + 1;
+-
+-#ifdef yyoverflow
+- {
+- /* Give user a chance to reallocate the stack. Use copies of
+- these so that the &'s don't force the real ones into
+- memory. */
+- YYSTYPE *yyvs1 = yyvs;
+- short *yyss1 = yyss;
+-
+-
+- /* Each stack pointer address is followed by the size of the
+- data in use in that stack, in bytes. This used to be a
+- conditional around just the two extra args, but that might
+- be undefined if yyoverflow is a macro. */
+- yyoverflow ("parser stack overflow",
+- &yyss1, yysize * sizeof (*yyssp),
+- &yyvs1, yysize * sizeof (*yyvsp),
+-
+- &yystacksize);
+-
+- yyss = yyss1;
+- yyvs = yyvs1;
+- }
+-#else /* no yyoverflow */
+-# ifndef YYSTACK_RELOCATE
+- goto yyoverflowlab;
+-# else
+- /* Extend the stack our own way. */
+- if (YYMAXDEPTH <= yystacksize)
+- goto yyoverflowlab;
+- yystacksize *= 2;
+- if (YYMAXDEPTH < yystacksize)
+- yystacksize = YYMAXDEPTH;
+-
+- {
+- short *yyss1 = yyss;
+- union yyalloc *yyptr =
+- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+- if (! yyptr)
+- goto yyoverflowlab;
+- YYSTACK_RELOCATE (yyss);
+- YYSTACK_RELOCATE (yyvs);
+-
+-# undef YYSTACK_RELOCATE
+- if (yyss1 != yyssa)
+- YYSTACK_FREE (yyss1);
+- }
+-# endif
+-#endif /* no yyoverflow */
+-
+- yyssp = yyss + yysize - 1;
+- yyvsp = yyvs + yysize - 1;
+-
+-
+- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+- (unsigned long int) yystacksize));
+-
+- if (yyss + yystacksize - 1 <= yyssp)
+- YYABORT;
+- }
+-
+- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+-
+- goto yybackup;
+-
+-/*-----------.
+-| yybackup. |
+-`-----------*/
+-yybackup:
+-
+-/* Do appropriate processing given the current state. */
+-/* Read a lookahead token if we need one and don't already have one. */
+-/* yyresume: */
+-
+- /* First try to decide what to do without reference to lookahead token. */
+-
+- yyn = yypact[yystate];
+- if (yyn == YYPACT_NINF)
+- goto yydefault;
+-
+- /* Not known => get a lookahead token if don't already have one. */
+-
+- /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
+- if (yychar == YYEMPTY)
+- {
+- YYDPRINTF ((stderr, "Reading a token: "));
+- yychar = YYLEX;
+- }
+-
+- if (yychar <= YYEOF)
+- {
+- yychar = yytoken = YYEOF;
+- YYDPRINTF ((stderr, "Now at end of input.\n"));
+- }
+- else
+- {
+- yytoken = YYTRANSLATE (yychar);
+- YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
+- }
+-
+- /* If the proper action on seeing token YYTOKEN is to reduce or to
+- detect an error, take that action. */
+- yyn += yytoken;
+- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+- goto yydefault;
+- yyn = yytable[yyn];
+- if (yyn <= 0)
+- {
+- if (yyn == 0 || yyn == YYTABLE_NINF)
+- goto yyerrlab;
+- yyn = -yyn;
+- goto yyreduce;
+- }
+-
+- if (yyn == YYFINAL)
+- YYACCEPT;
+-
+- /* Shift the lookahead token. */
+- YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
+-
+- /* Discard the token being shifted unless it is eof. */
+- if (yychar != YYEOF)
+- yychar = YYEMPTY;
+-
+- *++yyvsp = yylval;
+-
+-
+- /* Count tokens shifted since error; after three, turn off error
+- status. */
+- if (yyerrstatus)
+- yyerrstatus--;
+-
+- yystate = yyn;
+- goto yynewstate;
+-
+-
+-/*-----------------------------------------------------------.
+-| yydefault -- do the default action for the current state. |
+-`-----------------------------------------------------------*/
+-yydefault:
+- yyn = yydefact[yystate];
+- if (yyn == 0)
+- goto yyerrlab;
+- goto yyreduce;
+-
+-
+-/*-----------------------------.
+-| yyreduce -- Do a reduction. |
+-`-----------------------------*/
+-yyreduce:
+- /* yyn is the number of a rule to reduce with. */
+- yylen = yyr2[yyn];
+-
+- /* If YYLEN is nonzero, implement the default value of the action:
+- `$$ = $1'.
+-
+- Otherwise, the following line sets YYVAL to garbage.
+- This behavior is undocumented and Bison
+- users should not rely upon it. Assigning to YYVAL
+- unconditionally makes the parser a bit smaller, and it avoids a
+- GCC warning that YYVAL may be used uninitialized. */
+- yyval = yyvsp[1-yylen];
+-
+-
+- YY_REDUCE_PRINT (yyn);
+- switch (yyn)
+- {
+- case 3:
+-#line 1238 "goomsl_yacc.y"
+- { gsl_append(yyvsp[0].nPtr); }
+- break;
+-
+- case 4:
+-#line 1239 "goomsl_yacc.y"
+- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); }
+- break;
+-
+- case 5:
+-#line 1240 "goomsl_yacc.y"
+- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); }
+- break;
+-
+- case 6:
+-#line 1241 "goomsl_yacc.y"
+- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); }
+- break;
+-
+- case 7:
+-#line 1242 "goomsl_yacc.y"
+- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); }
+- break;
+-
+- case 11:
+-#line 1250 "goomsl_yacc.y"
+- { gsl_add_struct(yyvsp[-4].strValue, yyvsp[-2].gsl_struct); }
+- break;
+-
+- case 12:
+-#line 1253 "goomsl_yacc.y"
+- { yyval.gsl_struct = gsl_new_struct(yyvsp[0].gsl_struct_field); }
+- break;
+-
+- case 13:
+-#line 1254 "goomsl_yacc.y"
+- { yyval.gsl_struct = yyvsp[-3].gsl_struct; gsl_add_struct_field(yyvsp[-3].gsl_struct, yyvsp[0].gsl_struct_field); }
+- break;
+-
+- case 14:
+-#line 1257 "goomsl_yacc.y"
+- { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_INT); }
+- break;
+-
+- case 15:
+-#line 1258 "goomsl_yacc.y"
+- { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_FLOAT); }
+- break;
+-
+- case 16:
+-#line 1259 "goomsl_yacc.y"
+- { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_PTR); }
+- break;
+-
+- case 17:
+-#line 1260 "goomsl_yacc.y"
+- { yyval.gsl_struct_field = gsl_new_struct_field_struct(yyvsp[0].strValue, yyvsp[-1].strValue); }
+- break;
+-
+- case 18:
+-#line 1265 "goomsl_yacc.y"
+- { gsl_declare_external_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); }
+- break;
+-
+- case 19:
+-#line 1267 "goomsl_yacc.y"
+- { gsl_declare_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); }
+- break;
+-
+- case 20:
+-#line 1270 "goomsl_yacc.y"
+- { yyval.intValue=-1; }
+- break;
+-
+- case 21:
+-#line 1271 "goomsl_yacc.y"
+- { yyval.intValue=INT_TK; }
+- break;
+-
+- case 22:
+-#line 1272 "goomsl_yacc.y"
+- { yyval.intValue=FLOAT_TK; }
+- break;
+-
+- case 23:
+-#line 1273 "goomsl_yacc.y"
+- { yyval.intValue=PTR_TK; }
+- break;
+-
+- case 24:
+-#line 1274 "goomsl_yacc.y"
+- { yyval.intValue= 1000 + gsl_get_struct_id(yyvsp[0].strValue); }
+- break;
+-
+- case 29:
+-#line 1287 "goomsl_yacc.y"
+- { gsl_leavenamespace(); }
+- break;
+-
+- case 30:
+-#line 1289 "goomsl_yacc.y"
+- { gsl_append(new_function_intro(yyvsp[-3].strValue));
+- gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-3].strValue); }
+- break;
+-
+- case 31:
+-#line 1291 "goomsl_yacc.y"
+- { gsl_append(new_function_intro(yyvsp[-5].strValue));
+- gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-5].strValue); }
+- break;
+-
+- case 32:
+-#line 1294 "goomsl_yacc.y"
+- { gsl_append(new_function_outro()); }
+- break;
+-
+- case 33:
+-#line 1296 "goomsl_yacc.y"
+- { yyval.namespace = gsl_leavenamespace(); }
+- break;
+-
+- case 34:
+-#line 1300 "goomsl_yacc.y"
+- { gsl_float_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); }
+- break;
+-
+- case 35:
+-#line 1301 "goomsl_yacc.y"
+- { gsl_int_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); }
+- break;
+-
+- case 36:
+-#line 1302 "goomsl_yacc.y"
+- { gsl_ptr_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); }
+- break;
+-
+- case 37:
+-#line 1303 "goomsl_yacc.y"
+- { gsl_struct_decl_local(yyvsp[-3].strValue,yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); }
+- break;
+-
+- case 38:
+-#line 1304 "goomsl_yacc.y"
+- { yyval.nPtr = 0; }
+- break;
+-
+- case 39:
+-#line 1307 "goomsl_yacc.y"
+- { gsl_float_decl_local(yyvsp[0].strValue); }
+- break;
+-
+- case 40:
+-#line 1308 "goomsl_yacc.y"
+- { gsl_int_decl_local(yyvsp[0].strValue); }
+- break;
+-
+- case 41:
+-#line 1309 "goomsl_yacc.y"
+- { gsl_ptr_decl_local(yyvsp[0].strValue); }
+- break;
+-
+- case 42:
+-#line 1310 "goomsl_yacc.y"
+- { gsl_struct_decl_local(yyvsp[-1].strValue,yyvsp[0].strValue); }
+- break;
+-
+- case 43:
+-#line 1315 "goomsl_yacc.y"
+- { yyval.nPtr = yyvsp[-1].nPtr; }
+- break;
+-
+- case 44:
+-#line 1316 "goomsl_yacc.y"
+- { yyval.nPtr = yyvsp[-1].nPtr; }
+- break;
+-
+- case 45:
+-#line 1317 "goomsl_yacc.y"
+- { yyval.nPtr = new_if(yyvsp[-4].nPtr,yyvsp[0].nPtr); }
+- break;
+-
+- case 46:
+-#line 1318 "goomsl_yacc.y"
+- { yyval.nPtr = new_while(yyvsp[-4].nPtr,yyvsp[0].nPtr); }
+- break;
+-
+- case 47:
+-#line 1319 "goomsl_yacc.y"
+- { lastNode = yyvsp[-3].nPtr->unode.opr.op[1]; yyval.nPtr=yyvsp[-3].nPtr; }
+- break;
+-
+- case 48:
+-#line 1320 "goomsl_yacc.y"
+- { yyval.nPtr = yyvsp[0].nPtr; }
+- break;
+-
+- case 49:
+-#line 1321 "goomsl_yacc.y"
+- { yyval.nPtr = new_plus_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); }
+- break;
+-
+- case 50:
+-#line 1322 "goomsl_yacc.y"
+- { yyval.nPtr = new_sub_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); }
+- break;
+-
+- case 51:
+-#line 1323 "goomsl_yacc.y"
+- { yyval.nPtr = new_mul_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); }
+- break;
+-
+- case 52:
+-#line 1324 "goomsl_yacc.y"
+- { yyval.nPtr = new_div_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); }
+- break;
+-
+- case 53:
+-#line 1325 "goomsl_yacc.y"
+- { yyval.nPtr = new_static_foreach(new_var(yyvsp[-4].strValue, currentGoomSL->num_lines), yyvsp[-2].nPtr, yyvsp[0].nPtr); }
+- break;
+-
+- case 54:
+-#line 1328 "goomsl_yacc.y"
+- { yyval.nPtr = yyvsp[-1].nPtr; }
+- break;
+-
+- case 55:
+-#line 1330 "goomsl_yacc.y"
+- { yyval.nPtr = new_var_list(new_var(yyvsp[0].strValue,currentGoomSL->num_lines), NULL); }
+- break;
+-
+- case 56:
+-#line 1331 "goomsl_yacc.y"
+- { yyval.nPtr = new_var_list(new_var(yyvsp[-1].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); }
+- break;
+-
+- case 57:
+-#line 1334 "goomsl_yacc.y"
+- { yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); }
+- break;
+-
+- case 58:
+-#line 1336 "goomsl_yacc.y"
+- { yyval.nPtr = new_block(lastNode); lastNode = yyval.nPtr->unode.opr.op[0]; }
+- break;
+-
+- case 59:
+-#line 1339 "goomsl_yacc.y"
+- { yyval.nPtr = new_var(yyvsp[0].strValue,currentGoomSL->num_lines); }
+- break;
+-
+- case 60:
+-#line 1340 "goomsl_yacc.y"
+- { yyval.nPtr = yyvsp[0].nPtr; }
+- break;
+-
+- case 61:
+-#line 1341 "goomsl_yacc.y"
+- { yyval.nPtr = new_mul(yyvsp[-2].nPtr,yyvsp[0].nPtr); }
+- break;
+-
+- case 62:
+-#line 1342 "goomsl_yacc.y"
+- { yyval.nPtr = new_div(yyvsp[-2].nPtr,yyvsp[0].nPtr); }
+- break;
+-
+- case 63:
+-#line 1343 "goomsl_yacc.y"
+- { yyval.nPtr = new_add(yyvsp[-2].nPtr,yyvsp[0].nPtr); }
+- break;
+-
+- case 64:
+-#line 1344 "goomsl_yacc.y"
+- { yyval.nPtr = new_sub(yyvsp[-2].nPtr,yyvsp[0].nPtr); }
+- break;
+-
+- case 65:
+-#line 1345 "goomsl_yacc.y"
+- { yyval.nPtr = new_neg(yyvsp[0].nPtr); }
+- break;
+-
+- case 66:
+-#line 1346 "goomsl_yacc.y"
+- { yyval.nPtr = yyvsp[-1].nPtr; }
+- break;
+-
+- case 67:
+-#line 1347 "goomsl_yacc.y"
+- { yyval.nPtr = yyvsp[0].nPtr; }
+- break;
+-
+- case 68:
+-#line 1350 "goomsl_yacc.y"
+- { yyval.nPtr = new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr); }
+- break;
+-
+- case 69:
+-#line 1351 "goomsl_yacc.y"
+- { yyval.nPtr = new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr); }
+- break;
+-
+- case 70:
+-#line 1352 "goomsl_yacc.y"
+- { yyval.nPtr = new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr); }
+- break;
+-
+- case 71:
+-#line 1353 "goomsl_yacc.y"
+- { yyval.nPtr = new_not(new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr)); }
+- break;
+-
+- case 72:
+-#line 1354 "goomsl_yacc.y"
+- { yyval.nPtr = new_not(new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr)); }
+- break;
+-
+- case 73:
+-#line 1355 "goomsl_yacc.y"
+- { yyval.nPtr = new_not(new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr)); }
+- break;
+-
+- case 74:
+-#line 1356 "goomsl_yacc.y"
+- { yyval.nPtr = new_not(yyvsp[0].nPtr); }
+- break;
+-
+- case 75:
+-#line 1359 "goomsl_yacc.y"
+- { yyval.nPtr = new_constFloat(yyvsp[0].strValue,currentGoomSL->num_lines); }
+- break;
+-
+- case 76:
+-#line 1360 "goomsl_yacc.y"
+- { yyval.nPtr = new_constInt(yyvsp[0].strValue,currentGoomSL->num_lines); }
+- break;
+-
+- case 77:
+-#line 1361 "goomsl_yacc.y"
+- { yyval.nPtr = new_constPtr(yyvsp[0].strValue,currentGoomSL->num_lines); }
+- break;
+-
+- case 78:
+-#line 1366 "goomsl_yacc.y"
+- { yyval.nPtr = new_call(yyvsp[-2].strValue,NULL); }
+- break;
+-
+- case 79:
+-#line 1367 "goomsl_yacc.y"
+- { yyval.nPtr = new_call(yyvsp[-4].strValue,yyvsp[-2].nPtr); }
+- break;
+-
+- case 80:
+-#line 1368 "goomsl_yacc.y"
+- { yyval.nPtr = new_call(yyvsp[-3].strValue,NULL); }
+- break;
+-
+- case 81:
+-#line 1369 "goomsl_yacc.y"
+- { yyval.nPtr = new_call(yyvsp[-5].strValue,yyvsp[-3].nPtr); }
+- break;
+-
+- case 82:
+-#line 1373 "goomsl_yacc.y"
+- { yyval.nPtr = new_call_expr(yyvsp[-2].strValue,NULL); }
+- break;
+-
+- case 83:
+-#line 1374 "goomsl_yacc.y"
+- { yyval.nPtr = new_call_expr(yyvsp[-4].strValue,yyvsp[-2].nPtr); }
+- break;
+-
+- case 84:
+-#line 1377 "goomsl_yacc.y"
+- { yyval.nPtr = new_affec_list(yyvsp[-1].nPtr,yyvsp[0].nPtr); }
+- break;
+-
+- case 85:
+-#line 1378 "goomsl_yacc.y"
+- { yyval.nPtr = new_affec_list(yyvsp[0].nPtr,NULL); }
+- break;
+-
+- case 86:
+-#line 1380 "goomsl_yacc.y"
+- {
+- gsl_reenternamespace(yyvsp[-1].namespace);
+- yyval.nPtr = new_set(new_var(yyvsp[-3].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr);
+- }
+- break;
+-
+- case 87:
+-#line 1384 "goomsl_yacc.y"
+- {
+- gsl_reenternamespace(yyvsp[-1].namespace);
+- yyval.nPtr = new_set(new_var("&this", currentGoomSL->num_lines),yyvsp[0].nPtr);
+- }
+- break;
+-
+-
+- }
+-
+-/* Line 999 of yacc.c. */
+-#line 2792 "goomsl_yacc.c"
+-
+- yyvsp -= yylen;
+- yyssp -= yylen;
+-
+-
+- YY_STACK_PRINT (yyss, yyssp);
+-
+- *++yyvsp = yyval;
+-
+-
+- /* Now `shift' the result of the reduction. Determine what state
+- that goes to, based on the state we popped back to and the rule
+- number reduced by. */
+-
+- yyn = yyr1[yyn];
+-
+- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+- yystate = yytable[yystate];
+- else
+- yystate = yydefgoto[yyn - YYNTOKENS];
+-
+- goto yynewstate;
+-
+-
+-/*------------------------------------.
+-| yyerrlab -- here on detecting error |
+-`------------------------------------*/
+-yyerrlab:
+- /* If not already recovering from an error, report this error. */
+- if (!yyerrstatus)
+- {
+- ++yynerrs;
+-#if YYERROR_VERBOSE
+- yyn = yypact[yystate];
+-
+- if (YYPACT_NINF < yyn && yyn < YYLAST)
+- {
+- YYSIZE_T yysize = 0;
+- int yytype = YYTRANSLATE (yychar);
+- char *yymsg;
+- int yyx, yycount;
+-
+- yycount = 0;
+- /* Start YYX at -YYN if negative to avoid negative indexes in
+- YYCHECK. */
+- for (yyx = yyn < 0 ? -yyn : 0;
+- yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+- yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+- yysize += yystrlen ("syntax error, unexpected ") + 1;
+- yysize += yystrlen (yytname[yytype]);
+- yymsg = (char *) YYSTACK_ALLOC (yysize);
+- if (yymsg != 0)
+- {
+- char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+- yyp = yystpcpy (yyp, yytname[yytype]);
+-
+- if (yycount < 5)
+- {
+- yycount = 0;
+- for (yyx = yyn < 0 ? -yyn : 0;
+- yyx < (int) (sizeof (yytname) / sizeof (char *));
+- yyx++)
+- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+- {
+- const char *yyq = ! yycount ? ", expecting " : " or ";
+- yyp = yystpcpy (yyp, yyq);
+- yyp = yystpcpy (yyp, yytname[yyx]);
+- yycount++;
+- }
+- }
+- yyerror (yymsg);
+- YYSTACK_FREE (yymsg);
+- }
+- else
+- yyerror ("syntax error; also virtual memory exhausted");
+- }
+- else
+-#endif /* YYERROR_VERBOSE */
+- yyerror ("syntax error");
+- }
+-
+-
+-
+- if (yyerrstatus == 3)
+- {
+- /* If just tried and failed to reuse lookahead token after an
+- error, discard it. */
+-
+- /* Return failure if at end of input. */
+- if (yychar == YYEOF)
+- {
+- /* Pop the error token. */
+- YYPOPSTACK;
+- /* Pop the rest of the stack. */
+- while (yyss < yyssp)
+- {
+- YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+- yydestruct (yystos[*yyssp], yyvsp);
+- YYPOPSTACK;
+- }
+- YYABORT;
+- }
+-
+- YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+- yydestruct (yytoken, &yylval);
+- yychar = YYEMPTY;
+-
+- }
+-
+- /* Else will try to reuse lookahead token after shifting the error
+- token. */
+- goto yyerrlab1;
+-
+-
+-/*----------------------------------------------------.
+-| yyerrlab1 -- error raised explicitly by an action. |
+-`----------------------------------------------------*/
+-yyerrlab1:
+- yyerrstatus = 3; /* Each real token shifted decrements this. */
+-
+- for (;;)
+- {
+- yyn = yypact[yystate];
+- if (yyn != YYPACT_NINF)
+- {
+- yyn += YYTERROR;
+- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+- {
+- yyn = yytable[yyn];
+- if (0 < yyn)
+- break;
+- }
+- }
+-
+- /* Pop the current state because it cannot handle the error token. */
+- if (yyssp == yyss)
+- YYABORT;
+-
+- YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+- yydestruct (yystos[yystate], yyvsp);
+- yyvsp--;
+- yystate = *--yyssp;
+-
+- YY_STACK_PRINT (yyss, yyssp);
+- }
+-
+- if (yyn == YYFINAL)
+- YYACCEPT;
+-
+- YYDPRINTF ((stderr, "Shifting error token, "));
+-
+- *++yyvsp = yylval;
+-
+-
+- yystate = yyn;
+- goto yynewstate;
+-
+-
+-/*-------------------------------------.
+-| yyacceptlab -- YYACCEPT comes here. |
+-`-------------------------------------*/
+-yyacceptlab:
+- yyresult = 0;
+- goto yyreturn;
+-
+-/*-----------------------------------.
+-| yyabortlab -- YYABORT comes here. |
+-`-----------------------------------*/
+-yyabortlab:
+- yyresult = 1;
+- goto yyreturn;
+-
+-#ifndef yyoverflow
+-/*----------------------------------------------.
+-| yyoverflowlab -- parser overflow comes here. |
+-`----------------------------------------------*/
+-yyoverflowlab:
+- yyerror ("parser stack overflow");
+- yyresult = 2;
+- /* Fall through. */
+-#endif
+-
+-yyreturn:
+-#ifndef yyoverflow
+- if (yyss != yyssa)
+- YYSTACK_FREE (yyss);
+-#endif
+- return yyresult;
+-}
+-
+-
+-#line 1396 "goomsl_yacc.y"
+-
+-
+-
+-void yyerror(char *str)
+-{ /* {{{ */
+- fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str);
+- currentGoomSL->compilationOK = 0;
+- exit(1);
+-} /* }}} */
+-
+-
+diff -Naur /home/d4rk/goom2k4-0/src/goomsl_yacc.h /src/goomsl_yacc.h
+--- /home/d4rk/goom2k4-0/src/goomsl_yacc.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goomsl_yacc.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,104 +0,0 @@
+-/* A Bison parser, made by GNU Bison 1.875. */
+-
+-/* Skeleton parser for Yacc-like parsing with Bison,
+- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
+-
+- This program is free software; you can redistribute it and/or modify
+- it under the terms of the GNU General Public License as published by
+- the Free Software Foundation; either version 2, or (at your option)
+- any later version.
+-
+- This program is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU General Public License for more details.
+-
+- You should have received a copy of the GNU General Public License
+- along with this program; if not, write to the Free Software
+- Foundation, Inc., 59 Temple Place - Suite 330,
+- Boston, MA 02111-1307, USA. */
+-
+-/* As a special exception, when this file is copied by Bison into a
+- Bison output file, you may use that output file without restriction.
+- This special exception was added by the Free Software Foundation
+- in version 1.24 of Bison. */
+-
+-/* Tokens. */
+-#ifndef YYTOKENTYPE
+-# define YYTOKENTYPE
+- /* Put the tokens into the symbol table, so that GDB and other debuggers
+- know about them. */
+- enum yytokentype {
+- LTYPE_INTEGER = 258,
+- LTYPE_FLOAT = 259,
+- LTYPE_VAR = 260,
+- LTYPE_PTR = 261,
+- PTR_TK = 262,
+- INT_TK = 263,
+- FLOAT_TK = 264,
+- DECLARE = 265,
+- EXTERNAL = 266,
+- WHILE = 267,
+- DO = 268,
+- NOT = 269,
+- PLUS_EQ = 270,
+- SUB_EQ = 271,
+- DIV_EQ = 272,
+- MUL_EQ = 273,
+- SUP_EQ = 274,
+- LOW_EQ = 275,
+- NOT_EQ = 276,
+- STRUCT = 277,
+- FOR = 278,
+- IN = 279
+- };
+-#endif
+-#define LTYPE_INTEGER 258
+-#define LTYPE_FLOAT 259
+-#define LTYPE_VAR 260
+-#define LTYPE_PTR 261
+-#define PTR_TK 262
+-#define INT_TK 263
+-#define FLOAT_TK 264
+-#define DECLARE 265
+-#define EXTERNAL 266
+-#define WHILE 267
+-#define DO 268
+-#define NOT 269
+-#define PLUS_EQ 270
+-#define SUB_EQ 271
+-#define DIV_EQ 272
+-#define MUL_EQ 273
+-#define SUP_EQ 274
+-#define LOW_EQ 275
+-#define NOT_EQ 276
+-#define STRUCT 277
+-#define FOR 278
+-#define IN 279
+-
+-
+-
+-
+-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+-#line 1199 "goomsl_yacc.y"
+-typedef union YYSTYPE {
+- int intValue;
+- float floatValue;
+- char charValue;
+- char strValue[2048];
+- NodeType *nPtr;
+- GoomHash *namespace;
+- GSL_Struct *gsl_struct;
+- GSL_StructField *gsl_struct_field;
+- } YYSTYPE;
+-/* Line 1240 of yacc.c. */
+-#line 95 "goomsl_yacc.h"
+-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+-# define YYSTYPE_IS_DECLARED 1
+-# define YYSTYPE_IS_TRIVIAL 1
+-#endif
+-
+-extern YYSTYPE yylval;
+-
+-
+-
+diff -Naur /home/d4rk/goom2k4-0/src/goomsl_yacc.y /src/goomsl_yacc.y
+--- /home/d4rk/goom2k4-0/src/goomsl_yacc.y 2005-02-07 06:46:41.000000000 -0700
++++ /src/goomsl_yacc.y 1969-12-31 17:00:00.000000000 -0700
+@@ -1,1405 +0,0 @@
+-/**
+- * copyright 2004, Jean-Christophe Hoelt <jeko@ios-software.com>
+- *
+- * This program is released under the terms of the GNU Lesser General Public Licence.
+- */
+-%{
+- #include <stdio.h>
+- #include <stdlib.h>
+- #include <string.h>
+- #include "goomsl.h"
+- #include "goomsl_private.h"
+-
+-#define STRUCT_ALIGNMENT 16
+-/* #define VERBOSE */
+-
+- int yylex(void);
+- void yyerror(char *);
+- extern GoomSL *currentGoomSL;
+-
+- static NodeType *nodeNew(const char *str, int type, int line_number);
+- static NodeType *nodeClone(NodeType *node);
+- static void nodeFreeInternals(NodeType *node);
+- static void nodeFree(NodeType *node);
+-
+- static void commit_node(NodeType *node, int releaseIfTemp);
+- static void precommit_node(NodeType *node);
+-
+- static NodeType *new_constInt(const char *str, int line_number);
+- static NodeType *new_constFloat(const char *str, int line_number);
+- static NodeType *new_constPtr(const char *str, int line_number);
+- static NodeType *new_var(const char *str, int line_number);
+- static NodeType *new_nop(const char *str);
+- static NodeType *new_op(const char *str, int type, int nbOp);
+-
+- static int allocateLabel();
+- static int allocateTemp();
+- static void releaseTemp(int n);
+- static void releaseAllTemps();
+-
+- static int is_tmp_expr(NodeType *node) {
+- if (node->str) {
+- return (!strncmp(node->str,"_i_tmp_",7))
+- || (!strncmp(node->str,"_f_tmp_",7))
+- || (!strncmp(node->str,"_p_tmp",7));
+- }
+- return 0;
+- }
+- /* pre: is_tmp_expr(node); */
+- static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); }
+-
+- static int is_commutative_expr(int itype)
+- { /* {{{ */
+- return (itype == INSTR_ADD)
+- || (itype == INSTR_MUL)
+- || (itype == INSTR_ISEQUAL);
+- } /* }}} */
+-
+- static void GSL_PUT_LABEL(char *name, int line_number)
+- { /* {{{ */
+-#ifdef VERBOSE
+- printf("label %s\n", name);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number);
+- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL);
+- } /* }}} */
+- static void GSL_PUT_JUMP(char *name, int line_number)
+- { /* {{{ */
+-#ifdef VERBOSE
+- printf("jump %s\n", name);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number);
+- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL);
+- } /* }}} */
+-
+- static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number)
+- { /* {{{ */
+-#ifdef VERBOSE
+- printf("%s %s\n", iname, name);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number);
+- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL);
+- } /* }}} */
+- static void GSL_PUT_JZERO(char *name,int line_number)
+- { /* {{{ */
+- GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number);
+- } /* }}} */
+- static void GSL_PUT_JNZERO(char *name, int line_number)
+- { /* {{{ */
+- GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number);
+- } /* }}} */
+-
+- /* Structures Management */
+-
+-#define ALIGN_ADDR(_addr,_align) {\
+- if (_align>1) {\
+- int _dec = (_addr%_align);\
+- if (_dec != 0) _addr += _align - _dec;\
+- }}
+-
+- /* */
+- void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align)
+- {
+- int i;
+- int consumed = 0;
+- int iblk=0, fblk=0;
+-
+- s->iBlock[0].size = 0;
+- s->iBlock[0].data = 0;
+- s->fBlock[0].size = 0;
+- s->fBlock[0].data = 0;
+-
+- /* Prepare sub-struct and calculate space needed for their storage */
+- for (i = 0; i < s->nbFields; ++i)
+- {
+- if (s->fields[i]->type < FIRST_RESERVED)
+- {
+- int j=0;
+- GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type];
+- consumed += sizeof(int); /* stocke le prefix */
+- ALIGN_ADDR(consumed, s_align);
+- s->fields[i]->offsetInStruct = consumed;
+- gsl_prepare_struct(substruct, s_align, i_align, f_align);
+- for(j=0;substruct->iBlock[j].size>0;++j) {
+- s->iBlock[iblk].data = consumed + substruct->iBlock[j].data;
+- s->iBlock[iblk].size = substruct->iBlock[j].size;
+- iblk++;
+- }
+- for(j=0;substruct->fBlock[j].size>0;++j) {
+- s->fBlock[fblk].data = consumed + substruct->fBlock[j].data;
+- s->fBlock[fblk].size = substruct->fBlock[j].size;
+- fblk++;
+- }
+- consumed += substruct->size;
+- }
+- }
+-
+- /* Then prepare integers */
+- ALIGN_ADDR(consumed, i_align);
+- for (i = 0; i < s->nbFields; ++i)
+- {
+- if (s->fields[i]->type == INSTR_INT)
+- {
+- if (s->iBlock[iblk].size == 0) {
+- s->iBlock[iblk].size = 1;
+- s->iBlock[iblk].data = consumed;
+- } else {
+- s->iBlock[iblk].size += 1;
+- }
+- s->fields[i]->offsetInStruct = consumed;
+- consumed += sizeof(int);
+- }
+- }
+-
+- iblk++;
+- s->iBlock[iblk].size = 0;
+- s->iBlock[iblk].data = 0;
+-
+- /* Then prepare floats */
+- ALIGN_ADDR(consumed, f_align);
+- for (i = 0; i < s->nbFields; ++i)
+- {
+- if (s->fields[i]->type == INSTR_FLOAT)
+- {
+- if (s->fBlock[fblk].size == 0) {
+- s->fBlock[fblk].size = 1;
+- s->fBlock[fblk].data = consumed;
+- } else {
+- s->fBlock[fblk].size += 1;
+- }
+- s->fields[i]->offsetInStruct = consumed;
+- consumed += sizeof(int);
+- }
+- }
+-
+- fblk++;
+- s->fBlock[fblk].size = 0;
+- s->fBlock[fblk].data = 0;
+-
+- /* Finally prepare pointers */
+- ALIGN_ADDR(consumed, i_align);
+- for (i = 0; i < s->nbFields; ++i)
+- {
+- if (s->fields[i]->type == INSTR_PTR)
+- {
+- s->fields[i]->offsetInStruct = consumed;
+- consumed += sizeof(int);
+- }
+- }
+- s->size = consumed;
+- }
+-
+- /* Returns the ID of a struct from its name */
+- int gsl_get_struct_id(const char *name) /* {{{ */
+- {
+- HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name);
+- if (ret != NULL) return ret->i;
+- return -1;
+- } /* }}} */
+-
+- /* Adds the definition of a struct */
+- void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */
+- {
+- /* Prepare the struct: ie calculate internal storage format */
+- gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT);
+-
+- /* If the struct does not already exists */
+- if (gsl_get_struct_id(name) < 0)
+- {
+- /* adds it */
+- int id = currentGoomSL->nbStructID++;
+- goom_hash_put_int(currentGoomSL->structIDS, name, id);
+- if (currentGoomSL->gsl_struct_size <= id) {
+- currentGoomSL->gsl_struct_size *= 2;
+- currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct,
+- sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size);
+- }
+- currentGoomSL->gsl_struct[id] = gsl_struct;
+- }
+- } /* }}} */
+-
+- /* Creates a field for a struct */
+- GSL_StructField *gsl_new_struct_field(const char *name, int type)
+- {
+- GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField));
+- strcpy(field->name, name);
+- field->type = type;
+- return field;
+- }
+-
+- /* Create as field for a struct which will be a struct itself */
+- GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type)
+- {
+- GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type));
+- if (field->type < 0) {
+- fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n",
+- currentGoomSL->num_lines, type);
+- exit(1);
+- }
+- return field;
+- }
+-
+- /* Creates a Struct */
+- GSL_Struct *gsl_new_struct(GSL_StructField *field)
+- {
+- GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct));
+- s->nbFields = 1;
+- s->fields[0] = field;
+- return s;
+- }
+-
+- /* Adds a field to a struct */
+- void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field)
+- {
+- s->fields[s->nbFields++] = field;
+- }
+-
+- int gsl_type_of_var(GoomHash *ns, const char *name)
+- {
+- char type_of[256];
+- HashValue *hv;
+- sprintf(type_of, "__type_of_%s", name);
+- hv = goom_hash_get(ns, type_of);
+- if (hv != NULL)
+- return hv->i;
+- fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name);
+- return -1;
+- }
+-
+- static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space)
+- {
+- char type_of[256];
+- if (name[0] == '@') { ns = currentGoomSL->vars; }
+-
+- if (space == NULL) {
+- switch (type) {
+- case INSTR_INT:
+- case INSTR_FLOAT:
+- case INSTR_PTR:
+- space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap,
+- sizeof(int), sizeof(int));
+- break;
+- case -1:
+- fprintf(stderr, "What the fuck!\n");
+- exit(1);
+- default: /* On a un struct_id */
+- space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap,
+- currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int));
+- }
+- }
+- goom_hash_put_ptr(ns, name, (void*)space);
+- sprintf(type_of, "__type_of_%s", name);
+- goom_hash_put_int(ns, type_of, type);
+-
+- /* Ensuite le hack: on ajoute les champs en tant que variables. */
+- if (type < FIRST_RESERVED)
+- {
+- int i;
+- GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type];
+- ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */
+- for (i = 0; i < gsl_struct->nbFields; ++i)
+- {
+- char full_name[256];
+- char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct;
+- sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name);
+- gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace);
+- }
+- }
+- }
+-
+- /* Declare a variable which will be a struct */
+- static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name)
+- {
+- int struct_id = gsl_get_struct_id(struct_name);
+- gsl_declare_var(namespace, name, struct_id, NULL);
+- }
+-
+- static void gsl_float_decl_global(const char *name)
+- {
+- gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL);
+- }
+- static void gsl_int_decl_global(const char *name)
+- {
+- gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL);
+- }
+- static void gsl_ptr_decl_global(const char *name)
+- {
+- gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL);
+- }
+- static void gsl_struct_decl_global_from_id(const char *name, int id)
+- {
+- gsl_declare_var(currentGoomSL->vars, name, id, NULL);
+- }
+-
+- /* FLOAT */
+- static void gsl_float_decl_local(const char *name)
+- {
+- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL);
+- }
+- /* INT */
+- static void gsl_int_decl_local(const char *name)
+- {
+- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL);
+- }
+- /* PTR */
+- static void gsl_ptr_decl_local(const char *name)
+- {
+- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL);
+- }
+- /* STRUCT */
+- static void gsl_struct_decl_local(const char *struct_name, const char *name)
+- {
+- gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name);
+- }
+-
+-
+- static void commit_test2(NodeType *set,const char *type, int instr);
+- static NodeType *new_call(const char *name, NodeType *affect_list);
+-
+- /* SETTER */
+- static NodeType *new_set(NodeType *lvalue, NodeType *expression)
+- { /* {{{ */
+- NodeType *set = new_op("set", OPR_SET, 2);
+- set->unode.opr.op[0] = lvalue;
+- set->unode.opr.op[1] = expression;
+- return set;
+- } /* }}} */
+- static void commit_set(NodeType *set)
+- { /* {{{ */
+- commit_test2(set,"set",INSTR_SET);
+- } /* }}} */
+-
+- /* PLUS_EQ */
+- static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+- {
+- NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2);
+- set->unode.opr.op[0] = lvalue;
+- set->unode.opr.op[1] = expression;
+- return set;
+- }
+- static void commit_plus_eq(NodeType *set)
+- {
+- precommit_node(set->unode.opr.op[1]);
+-#ifdef VERBOSE
+- printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number);
+- commit_node(set->unode.opr.op[0],0);
+- commit_node(set->unode.opr.op[1],1);
+- } /* }}} */
+-
+- /* SUB_EQ */
+- static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+- {
+- NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2);
+- set->unode.opr.op[0] = lvalue;
+- set->unode.opr.op[1] = expression;
+- return set;
+- }
+- static void commit_sub_eq(NodeType *set)
+- {
+- precommit_node(set->unode.opr.op[1]);
+-#ifdef VERBOSE
+- printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number);
+- commit_node(set->unode.opr.op[0],0);
+- commit_node(set->unode.opr.op[1],1);
+- } /* }}} */
+-
+- /* MUL_EQ */
+- static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+- {
+- NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2);
+- set->unode.opr.op[0] = lvalue;
+- set->unode.opr.op[1] = expression;
+- return set;
+- }
+- static void commit_mul_eq(NodeType *set)
+- {
+- precommit_node(set->unode.opr.op[1]);
+-#ifdef VERBOSE
+- printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number);
+- commit_node(set->unode.opr.op[0],0);
+- commit_node(set->unode.opr.op[1],1);
+- } /* }}} */
+-
+- /* DIV_EQ */
+- static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+- {
+- NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2);
+- set->unode.opr.op[0] = lvalue;
+- set->unode.opr.op[1] = expression;
+- return set;
+- }
+- static void commit_div_eq(NodeType *set)
+- {
+- precommit_node(set->unode.opr.op[1]);
+-#ifdef VERBOSE
+- printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number);
+- commit_node(set->unode.opr.op[0],0);
+- commit_node(set->unode.opr.op[1],1);
+- } /* }}} */
+-
+- /* commodity method for add, mult, ... */
+-
+- static void precommit_expr(NodeType *expr, const char *type, int instr_id)
+- { /* {{{ */
+- NodeType *tmp, *tmpcpy;
+- int toAdd;
+-
+- /* compute "left" and "right" */
+- switch (expr->unode.opr.nbOp) {
+- case 2:
+- precommit_node(expr->unode.opr.op[1]);
+- case 1:
+- precommit_node(expr->unode.opr.op[0]);
+- }
+-
+- if (is_tmp_expr(expr->unode.opr.op[0])) {
+- tmp = expr->unode.opr.op[0];
+- toAdd = 1;
+- }
+- else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) {
+- tmp = expr->unode.opr.op[1];
+- toAdd = 0;
+- }
+- else {
+- char stmp[256];
+- /* declare a temporary variable to store the result */
+- if (expr->unode.opr.op[0]->type == CONST_INT_NODE) {
+- sprintf(stmp,"_i_tmp_%i",allocateTemp());
+- gsl_int_decl_global(stmp);
+- }
+- else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) {
+- sprintf(stmp,"_f_tmp%i",allocateTemp());
+- gsl_float_decl_global(stmp);
+- }
+- else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) {
+- sprintf(stmp,"_p_tmp%i",allocateTemp());
+- gsl_ptr_decl_global(stmp);
+- }
+- else {
+- int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str);
+- if (type == INSTR_FLOAT) {
+- sprintf(stmp,"_f_tmp_%i",allocateTemp());
+- gsl_float_decl_global(stmp);
+- }
+- else if (type == INSTR_PTR) {
+- sprintf(stmp,"_p_tmp_%i",allocateTemp());
+- gsl_ptr_decl_global(stmp);
+- }
+- else if (type == INSTR_INT) {
+- sprintf(stmp,"_i_tmp_%i",allocateTemp());
+- gsl_int_decl_global(stmp);
+- }
+- else if (type == -1) {
+- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n",
+- expr->line_number, expr->unode.opr.op[0]->str);
+- exit(1);
+- }
+- else { /* type is a struct_id */
+- sprintf(stmp,"_s_tmp_%i",allocateTemp());
+- gsl_struct_decl_global_from_id(stmp,type);
+- }
+- }
+- tmp = new_var(stmp,expr->line_number);
+-
+- /* set the tmp to the value of "op1" */
+- tmpcpy = nodeClone(tmp);
+- commit_node(new_set(tmp,expr->unode.opr.op[0]),0);
+- toAdd = 1;
+-
+- tmp = tmpcpy;
+- }
+-
+- /* add op2 to tmp */
+-#ifdef VERBOSE
+- if (expr->unode.opr.nbOp == 2)
+- printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str);
+- else
+- printf("%s %s\n", type, tmp->str);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number);
+- tmpcpy = nodeClone(tmp);
+- commit_node(tmp,0);
+- if (expr->unode.opr.nbOp == 2) {
+- commit_node(expr->unode.opr.op[toAdd],1);
+- }
+-
+- /* redefine the ADD node now as the computed variable */
+- nodeFreeInternals(expr);
+- *expr = *tmpcpy;
+- free(tmpcpy);
+- } /* }}} */
+-
+- static NodeType *new_expr1(const char *name, int id, NodeType *expr1)
+- { /* {{{ */
+- NodeType *add = new_op(name, id, 1);
+- add->unode.opr.op[0] = expr1;
+- return add;
+- } /* }}} */
+-
+- static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2)
+- { /* {{{ */
+- NodeType *add = new_op(name, id, 2);
+- add->unode.opr.op[0] = expr1;
+- add->unode.opr.op[1] = expr2;
+- return add;
+- } /* }}} */
+-
+- /* ADD */
+- static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */
+- return new_expr2("add", OPR_ADD, expr1, expr2);
+- }
+- static void precommit_add(NodeType *add) {
+- precommit_expr(add,"add",INSTR_ADD);
+- } /* }}} */
+-
+- /* SUB */
+- static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */
+- return new_expr2("sub", OPR_SUB, expr1, expr2);
+- }
+- static void precommit_sub(NodeType *sub) {
+- precommit_expr(sub,"sub",INSTR_SUB);
+- } /* }}} */
+-
+- /* NEG */
+- static NodeType *new_neg(NodeType *expr) { /* {{{ */
+- NodeType *zeroConst = NULL;
+- if (expr->type == CONST_INT_NODE)
+- zeroConst = new_constInt("0", currentGoomSL->num_lines);
+- else if (expr->type == CONST_FLOAT_NODE)
+- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines);
+- else if (expr->type == CONST_PTR_NODE) {
+- fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n",
+- currentGoomSL->num_lines);
+- exit(1);
+- }
+- else {
+- int type = gsl_type_of_var(expr->vnamespace, expr->str);
+- if (type == INSTR_FLOAT)
+- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines);
+- else if (type == INSTR_PTR) {
+- fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n",
+- currentGoomSL->num_lines);
+- exit(1);
+- }
+- else if (type == INSTR_INT)
+- zeroConst = new_constInt("0", currentGoomSL->num_lines);
+- else if (type == -1) {
+- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n",
+- expr->line_number, expr->unode.opr.op[0]->str);
+- exit(1);
+- }
+- else { /* type is a struct_id */
+- fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n",
+- expr->line_number, expr->str);
+- exit(1);
+- }
+- }
+- return new_expr2("sub", OPR_SUB, zeroConst, expr);
+- }
+- /* }}} */
+-
+- /* MUL */
+- static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */
+- return new_expr2("mul", OPR_MUL, expr1, expr2);
+- }
+- static void precommit_mul(NodeType *mul) {
+- precommit_expr(mul,"mul",INSTR_MUL);
+- } /* }}} */
+-
+- /* DIV */
+- static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */
+- return new_expr2("div", OPR_DIV, expr1, expr2);
+- }
+- static void precommit_div(NodeType *mul) {
+- precommit_expr(mul,"div",INSTR_DIV);
+- } /* }}} */
+-
+- /* CALL EXPRESSION */
+- static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */
+- NodeType *call = new_call(name,affect_list);
+- NodeType *node = new_expr1(name, OPR_CALL_EXPR, call);
+- node->vnamespace = gsl_find_namespace(name);
+- if (node->vnamespace == NULL)
+- fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name);
+- return node;
+- }
+- static void precommit_call_expr(NodeType *call) {
+- char stmp[256];
+- NodeType *tmp,*tmpcpy;
+- int type = gsl_type_of_var(call->vnamespace, call->str);
+- if (type == INSTR_FLOAT) {
+- sprintf(stmp,"_f_tmp_%i",allocateTemp());
+- gsl_float_decl_global(stmp);
+- }
+- else if (type == INSTR_PTR) {
+- sprintf(stmp,"_p_tmp_%i",allocateTemp());
+- gsl_ptr_decl_global(stmp);
+- }
+- else if (type == INSTR_INT) {
+- sprintf(stmp,"_i_tmp_%i",allocateTemp());
+- gsl_int_decl_global(stmp);
+- }
+- else if (type == -1) {
+- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n",
+- call->line_number, call->str);
+- exit(1);
+- }
+- else { /* type is a struct_id */
+- sprintf(stmp,"_s_tmp_%i",allocateTemp());
+- gsl_struct_decl_global_from_id(stmp,type);
+- }
+- tmp = new_var(stmp,call->line_number);
+- commit_node(call->unode.opr.op[0],0);
+- tmpcpy = nodeClone(tmp);
+- commit_node(new_set(tmp,new_var(call->str,call->line_number)),0);
+-
+- nodeFreeInternals(call);
+- *call = *tmpcpy;
+- free(tmpcpy);
+- } /* }}} */
+-
+- static void commit_test2(NodeType *set,const char *type, int instr)
+- { /* {{{ */
+- NodeType *tmp;
+- char stmp[256];
+- precommit_node(set->unode.opr.op[0]);
+- precommit_node(set->unode.opr.op[1]);
+- tmp = set->unode.opr.op[0];
+-
+- stmp[0] = 0;
+- if (set->unode.opr.op[0]->type == CONST_INT_NODE) {
+- sprintf(stmp,"_i_tmp_%i",allocateTemp());
+- gsl_int_decl_global(stmp);
+- }
+- else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) {
+- sprintf(stmp,"_f_tmp%i",allocateTemp());
+- gsl_float_decl_global(stmp);
+- }
+- else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) {
+- sprintf(stmp,"_p_tmp%i",allocateTemp());
+- gsl_ptr_decl_global(stmp);
+- }
+- if (stmp[0]) {
+- NodeType *tmpcpy;
+- tmp = new_var(stmp, set->line_number);
+- tmpcpy = nodeClone(tmp);
+- commit_node(new_set(tmp,set->unode.opr.op[0]),0);
+- tmp = tmpcpy;
+- }
+-
+-#ifdef VERBOSE
+- printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str);
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number);
+- commit_node(tmp,instr!=INSTR_SET);
+- commit_node(set->unode.opr.op[1],1);
+- } /* }}} */
+-
+- /* NOT */
+- static NodeType *new_not(NodeType *expr1) { /* {{{ */
+- return new_expr1("not", OPR_NOT, expr1);
+- }
+- static void commit_not(NodeType *set)
+- {
+- commit_node(set->unode.opr.op[0],0);
+-#ifdef VERBOSE
+- printf("not\n");
+-#endif
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL);
+- } /* }}} */
+-
+- /* EQU */
+- static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */
+- return new_expr2("isequal", OPR_EQU, expr1, expr2);
+- }
+- static void commit_equ(NodeType *mul) {
+- commit_test2(mul,"isequal",INSTR_ISEQUAL);
+- } /* }}} */
+-
+- /* INF */
+- static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */
+- return new_expr2("islower", OPR_LOW, expr1, expr2);
+- }
+- static void commit_low(NodeType *mul) {
+- commit_test2(mul,"islower",INSTR_ISLOWER);
+- } /* }}} */
+-
+- /* WHILE */
+- static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */
+- NodeType *node = new_op("while", OPR_WHILE, 2);
+- node->unode.opr.op[0] = expression;
+- node->unode.opr.op[1] = instr;
+- return node;
+- }
+-
+- static void commit_while(NodeType *node)
+- {
+- int lbl = allocateLabel();
+- char start_while[1024], test_while[1024];
+- sprintf(start_while, "|start_while_%d|", lbl);
+- sprintf(test_while, "|test_while_%d|", lbl);
+-
+- GSL_PUT_JUMP(test_while,node->line_number);
+- GSL_PUT_LABEL(start_while,node->line_number);
+-
+- /* code */
+- commit_node(node->unode.opr.op[1],0);
+-
+- GSL_PUT_LABEL(test_while,node->line_number);
+- commit_node(node->unode.opr.op[0],0);
+- GSL_PUT_JNZERO(start_while,node->line_number);
+- } /* }}} */
+-
+- /* FOR EACH */
+- static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */
+- NodeType *node = new_op("for", OPR_FOREACH, 3);
+- node->unode.opr.op[0] = var;
+- node->unode.opr.op[1] = var_list;
+- node->unode.opr.op[2] = instr;
+- node->line_number = currentGoomSL->num_lines;
+- return node;
+- }
+- static void commit_foreach(NodeType *node)
+- {
+- NodeType *cur = node->unode.opr.op[1];
+- char tmp_func[256], tmp_loop[256];
+- int lbl = allocateLabel();
+- sprintf(tmp_func, "|foreach_func_%d|", lbl);
+- sprintf(tmp_loop, "|foreach_loop_%d|", lbl);
+-
+- GSL_PUT_JUMP(tmp_loop, node->line_number);
+- GSL_PUT_LABEL(tmp_func, node->line_number);
+-
+- precommit_node(node->unode.opr.op[2]);
+- commit_node(node->unode.opr.op[2], 0);
+-
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL);
+-#ifdef VERBOSE
+- printf("ret\n");
+-#endif
+-
+- GSL_PUT_LABEL(tmp_loop, node->line_number);
+-
+- while (cur != NULL)
+- {
+- NodeType *x, *var;
+-
+- /* 1: x=var */
+- x = nodeClone(node->unode.opr.op[0]);
+- var = nodeClone(cur->unode.opr.op[0]);
+- commit_node(new_set(x, var),0);
+-
+- /* 2: instr */
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL);
+-#ifdef VERBOSE
+- printf("call %s\n", tmp_func);
+-#endif
+-
+- /* 3: var=x */
+- x = nodeClone(node->unode.opr.op[0]);
+- var = cur->unode.opr.op[0];
+- commit_node(new_set(var, x),0);
+- cur = cur->unode.opr.op[1];
+- }
+- nodeFree(node->unode.opr.op[0]);
+- } /* }}} */
+-
+- /* IF */
+- static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */
+- NodeType *node = new_op("if", OPR_IF, 2);
+- node->unode.opr.op[0] = expression;
+- node->unode.opr.op[1] = instr;
+- return node;
+- }
+- static void commit_if(NodeType *node) {
+-
+- char slab[1024];
+- sprintf(slab, "|eif%d|", allocateLabel());
+- commit_node(node->unode.opr.op[0],0);
+- GSL_PUT_JZERO(slab,node->line_number);
+- /* code */
+- commit_node(node->unode.opr.op[1],0);
+- GSL_PUT_LABEL(slab,node->line_number);
+- } /* }}} */
+-
+- /* BLOCK */
+- static NodeType *new_block(NodeType *lastNode) { /* {{{ */
+- NodeType *blk = new_op("block", OPR_BLOCK, 2);
+- blk->unode.opr.op[0] = new_nop("start_of_block");
+- blk->unode.opr.op[1] = lastNode;
+- return blk;
+- }
+- static void commit_block(NodeType *node) {
+- commit_node(node->unode.opr.op[0]->unode.opr.next,0);
+- } /* }}} */
+-
+- /* FUNCTION INTRO */
+- static NodeType *new_function_intro(const char *name) { /* {{{ */
+- char stmp[256];
+- if (strlen(name) < 200) {
+- sprintf(stmp, "|__func_%s|", name);
+- }
+- return new_op(stmp, OPR_FUNC_INTRO, 0);
+- }
+- static void commit_function_intro(NodeType *node) {
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL);
+-#ifdef VERBOSE
+- printf("label %s\n", node->str);
+-#endif
+- } /* }}} */
+-
+- /* FUNCTION OUTRO */
+- static NodeType *new_function_outro() { /* {{{ */
+- return new_op("ret", OPR_FUNC_OUTRO, 0);
+- }
+- static void commit_function_outro(NodeType *node) {
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL);
+- releaseAllTemps();
+-#ifdef VERBOSE
+- printf("ret\n");
+-#endif
+- } /* }}} */
+-
+- /* AFFECTATION LIST */
+- static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */
+- {
+- NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2);
+- node->unode.opr.op[0] = set;
+- node->unode.opr.op[1] = next;
+- return node;
+- }
+- static NodeType *new_affect_list_after(NodeType *affect_list)
+- {
+- NodeType *ret = NULL;
+- NodeType *cur = affect_list;
+- while(cur != NULL) {
+- NodeType *set = cur->unode.opr.op[0];
+- NodeType *next = cur->unode.opr.op[1];
+- NodeType *lvalue = set->unode.opr.op[0];
+- NodeType *expression = set->unode.opr.op[1];
+- if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) {
+- NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue));
+- ret = new_affec_list(nset, ret);
+- }
+- cur = next;
+- }
+- return ret;
+- }
+- static void commit_affect_list(NodeType *node)
+- {
+- NodeType *cur = node;
+- while(cur != NULL) {
+- NodeType *set = cur->unode.opr.op[0];
+- precommit_node(set->unode.opr.op[0]);
+- precommit_node(set->unode.opr.op[1]);
+- cur = cur->unode.opr.op[1];
+- }
+- cur = node;
+- while(cur != NULL) {
+- NodeType *set = cur->unode.opr.op[0];
+- commit_node(set,0);
+- cur = cur->unode.opr.op[1];
+- }
+- } /* }}} */
+-
+- /* VAR LIST */
+- static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */
+- {
+- NodeType *node = new_op("var_list", OPR_VAR_LIST, 2);
+- node->unode.opr.op[0] = var;
+- node->unode.opr.op[1] = next;
+- return node;
+- }
+- static void commit_var_list(NodeType *node)
+- {
+- } /* }}} */
+-
+- /* FUNCTION CALL */
+- static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */
+- HashValue *fval;
+- fval = goom_hash_get(currentGoomSL->functions, name);
+- if (!fval) {
+- gsl_declare_task(name);
+- fval = goom_hash_get(currentGoomSL->functions, name);
+- }
+- if (!fval) {
+- fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name);
+- exit(1);
+- return NULL;
+- }
+- else {
+- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr;
+- if (gef->is_extern) {
+- NodeType *node = new_op(name, OPR_EXT_CALL, 1);
+- node->unode.opr.op[0] = affect_list;
+- return node;
+- }
+- else {
+- NodeType *node;
+- char stmp[256];
+- if (strlen(name) < 200) {
+- sprintf(stmp, "|__func_%s|", name);
+- }
+- node = new_op(stmp, OPR_CALL, 1);
+- node->unode.opr.op[0] = affect_list;
+- return node;
+- }
+- }
+- }
+- static void commit_ext_call(NodeType *node) {
+- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]);
+- commit_node(node->unode.opr.op[0],0);
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR);
+-#ifdef VERBOSE
+- printf("extcall %s\n", node->str);
+-#endif
+- commit_node(alafter,0);
+- }
+- static void commit_call(NodeType *node) {
+- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]);
+- commit_node(node->unode.opr.op[0],0);
+- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number);
+- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL);
+-#ifdef VERBOSE
+- printf("call %s\n", node->str);
+-#endif
+- commit_node(alafter,0);
+- } /* }}} */
+-
+- /** **/
+-
+- static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */
+- static NodeType *lastNode = 0;
+- static NodeType *gsl_append(NodeType *curNode) {
+- if (curNode == 0) return 0; /* {{{ */
+- if (lastNode)
+- lastNode->unode.opr.next = curNode;
+- lastNode = curNode;
+- while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next;
+- if (rootNode == 0)
+- rootNode = curNode;
+- return curNode;
+- } /* }}} */
+-
+-#if 1
+- int allocateTemp() {
+- return allocateLabel();
+- }
+- void releaseAllTemps() {}
+- void releaseTemp(int n) {}
+-#else
+- static int nbTemp = 0;
+- static int *tempArray = 0;
+- static int tempArraySize = 0;
+- int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */
+- int i = 0; /* {{{ */
+- if (tempArray == 0) {
+- tempArraySize = 256;
+- tempArray = (int*)malloc(tempArraySize * sizeof(int));
+- }
+- while (1) {
+- int j;
+- for (j=0;j<nbTemp;++j) {
+- if (tempArray[j] == i) break;
+- }
+- if (j == nbTemp) {
+- if (nbTemp == tempArraySize) {
+- tempArraySize *= 2;
+- tempArray = (int*)realloc(tempArray,tempArraySize * sizeof(int));
+- }
+- tempArray[nbTemp++] = i;
+- return i;
+- }
+- i++;
+- }
+- } /* }}} */
+- void releaseAllTemps() {
+- nbTemp = 0; /* {{{ */
+- } /* }}} */
+- void releaseTemp(int n) {
+- int j; /* {{{ */
+- for (j=0;j<nbTemp;++j) {
+- if (tempArray[j] == n) {
+- tempArray[j] = tempArray[--nbTemp];
+- break;
+- }
+- }
+- } /* }}} */
+-#endif
+-
+- static int lastLabel = 0;
+- int allocateLabel() {
+- return ++lastLabel; /* {{{ */
+- } /* }}} */
+-
+- void gsl_commit_compilation()
+- { /* {{{ */
+- commit_node(rootNode,0);
+- rootNode = 0;
+- lastNode = 0;
+- } /* }}} */
+-
+- void precommit_node(NodeType *node)
+- { /* {{{ */
+- /* do here stuff for expression.. for exemple */
+- if (node->type == OPR_NODE)
+- switch(node->unode.opr.type) {
+- case OPR_ADD: precommit_add(node); break;
+- case OPR_SUB: precommit_sub(node); break;
+- case OPR_MUL: precommit_mul(node); break;
+- case OPR_DIV: precommit_div(node); break;
+- case OPR_CALL_EXPR: precommit_call_expr(node); break;
+- }
+- } /* }}} */
+-
+- void commit_node(NodeType *node, int releaseIfTmp)
+- { /* {{{ */
+- if (node == 0) return;
+-
+- switch(node->type) {
+- case OPR_NODE:
+- switch(node->unode.opr.type) {
+- case OPR_SET: commit_set(node); break;
+- case OPR_PLUS_EQ: commit_plus_eq(node); break;
+- case OPR_SUB_EQ: commit_sub_eq(node); break;
+- case OPR_MUL_EQ: commit_mul_eq(node); break;
+- case OPR_DIV_EQ: commit_div_eq(node); break;
+- case OPR_IF: commit_if(node); break;
+- case OPR_WHILE: commit_while(node); break;
+- case OPR_BLOCK: commit_block(node); break;
+- case OPR_FUNC_INTRO: commit_function_intro(node); break;
+- case OPR_FUNC_OUTRO: commit_function_outro(node); break;
+- case OPR_CALL: commit_call(node); break;
+- case OPR_EXT_CALL: commit_ext_call(node); break;
+- case OPR_EQU: commit_equ(node); break;
+- case OPR_LOW: commit_low(node); break;
+- case OPR_NOT: commit_not(node); break;
+- case OPR_AFFECT_LIST: commit_affect_list(node); break;
+- case OPR_FOREACH: commit_foreach(node); break;
+- case OPR_VAR_LIST: commit_var_list(node); break;
+-#ifdef VERBOSE
+- case EMPTY_NODE: printf("NOP\n"); break;
+-#endif
+- }
+-
+- commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */
+- break;
+-
+- case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace);
+- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break;
+- case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break;
+- case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break;
+- case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break;
+- }
+- if (releaseIfTmp && is_tmp_expr(node))
+- releaseTemp(get_tmp_id(node));
+-
+- nodeFree(node);
+- } /* }}} */
+-
+- NodeType *nodeNew(const char *str, int type, int line_number) {
+- NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */
+- node->type = type;
+- node->str = (char*)malloc(strlen(str)+1);
+- node->vnamespace = NULL;
+- node->line_number = line_number;
+- strcpy(node->str, str);
+- return node;
+- } /* }}} */
+- static NodeType *nodeClone(NodeType *node) {
+- NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */
+- ret->vnamespace = node->vnamespace;
+- ret->unode = node->unode;
+- return ret;
+- } /* }}} */
+-
+- void nodeFreeInternals(NodeType *node) {
+- free(node->str); /* {{{ */
+- } /* }}} */
+-
+- void nodeFree(NodeType *node) {
+- nodeFreeInternals(node); /* {{{ */
+- free(node);
+- } /* }}} */
+-
+- NodeType *new_constInt(const char *str, int line_number) {
+- NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */
+- node->unode.constInt.val = atoi(str);
+- return node;
+- } /* }}} */
+-
+- NodeType *new_constPtr(const char *str, int line_number) {
+- NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */
+- node->unode.constPtr.id = strtol(str,NULL,0);
+- return node;
+- } /* }}} */
+-
+- NodeType *new_constFloat(const char *str, int line_number) {
+- NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */
+- node->unode.constFloat.val = atof(str);
+- return node;
+- } /* }}} */
+-
+- NodeType *new_var(const char *str, int line_number) {
+- NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */
+- node->vnamespace = gsl_find_namespace(str);
+- if (node->vnamespace == 0) {
+- fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str);
+- exit(1);
+- }
+- return node;
+- } /* }}} */
+-
+- NodeType *new_nop(const char *str) {
+- NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */
+- return node;
+- } /* }}} */
+-
+- NodeType *new_op(const char *str, int type, int nbOp) {
+- int i; /* {{{ */
+- NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines);
+- node->unode.opr.next = 0;
+- node->unode.opr.type = type;
+- node->unode.opr.nbOp = nbOp;
+- for (i=0;i<nbOp;++i) node->unode.opr.op[i] = 0;
+- return node;
+- } /* }}} */
+-
+-
+- void gsl_declare_global_variable(int type, char *name) {
+- switch(type){
+- case -1: break;
+- case FLOAT_TK:gsl_float_decl_global(name);break;
+- case INT_TK: gsl_int_decl_global(name);break;
+- case PTR_TK: gsl_ptr_decl_global(name);break;
+- default:
+- {
+- int id = type - 1000;
+- gsl_struct_decl_global_from_id(name,id);
+- }
+- }
+- }
+-
+-%}
+-
+-%union {
+- int intValue;
+- float floatValue;
+- char charValue;
+- char strValue[2048];
+- NodeType *nPtr;
+- GoomHash *namespace;
+- GSL_Struct *gsl_struct;
+- GSL_StructField *gsl_struct_field;
+- };
+-
+-%token <strValue> LTYPE_INTEGER
+-%token <strValue> LTYPE_FLOAT
+-%token <strValue> LTYPE_VAR
+-%token <strValue> LTYPE_PTR
+-
+-%token PTR_TK INT_TK FLOAT_TK DECLARE EXTERNAL WHILE DO NOT PLUS_EQ SUB_EQ DIV_EQ MUL_EQ SUP_EQ LOW_EQ NOT_EQ STRUCT FOR IN
+-
+-%type <intValue> return_type
+-%type <nPtr> expression constValue instruction test func_call func_call_expression
+-%type <nPtr> start_block affectation_list affectation_in_list affectation declaration
+-%type <nPtr> var_list_content var_list
+-%type <strValue> task_name ext_task_name
+-%type <namespace> leave_namespace
+-%type <gsl_struct> struct_members
+-%type <gsl_struct_field> struct_member
+-%left '\n'
+-%left PLUS_EQ SUB_EQ MUL_EQ DIV_EQ
+-%left NOT
+-%left '=' '<' '>'
+-%left '+' '-'
+-%left '/' '*'
+-
+-%%
+-
+-/* -------------- Global architechture of a GSL program ------------*/
+-
+-gsl: gsl_code function_outro gsl_def_functions ;
+-
+-gsl_code: gsl_code instruction { gsl_append($2); }
+- | gsl_code EXTERNAL '<' ext_task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); }
+- | gsl_code EXTERNAL '<' ext_task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); }
+- | gsl_code DECLARE '<' task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); }
+- | gsl_code DECLARE '<' task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); }
+- | gsl_code struct_declaration
+- | gsl_code '\n'
+- |
+- ;
+-
+-/* ------------- Declaration of a structure ------------ */
+-
+-struct_declaration: STRUCT '<' LTYPE_VAR ':' struct_members '>' '\n' { gsl_add_struct($3, $5); }
+- ;
+-
+-struct_members: opt_nl struct_member { $$ = gsl_new_struct($2); }
+- | struct_members ',' opt_nl struct_member { $$ = $1; gsl_add_struct_field($1, $4); }
+- ;
+-
+-struct_member: INT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_INT); }
+- | FLOAT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_FLOAT); }
+- | PTR_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_PTR); }
+- | LTYPE_VAR LTYPE_VAR { $$ = gsl_new_struct_field_struct($2, $1); }
+- ;
+-
+-/* ------------- Fonction declarations -------------- */
+-
+-ext_task_name: LTYPE_VAR { gsl_declare_external_task($1); gsl_enternamespace($1); strcpy($$,$1); }
+- ;
+-task_name: LTYPE_VAR { gsl_declare_task($1); gsl_enternamespace($1); strcpy($$,$1); strcpy($$,$1); }
+- ;
+-
+-return_type: { $$=-1; }
+- | ':' INT_TK { $$=INT_TK; }
+- | ':' FLOAT_TK { $$=FLOAT_TK; }
+- | ':' PTR_TK { $$=PTR_TK; }
+- | ':' LTYPE_VAR { $$= 1000 + gsl_get_struct_id($2); }
+- ;
+-
+-arglist: empty_declaration
+- | empty_declaration ',' arglist
+- ;
+-
+-/* ------------- Fonction definition -------------- */
+-
+-gsl_def_functions: gsl_def_functions function
+- |
+- ;
+-
+-function: function_intro gsl_code function_outro { gsl_leavenamespace(); }
+-
+-function_intro: '<' task_name '>' return_type '\n' { gsl_append(new_function_intro($2));
+- gsl_declare_global_variable($4,$2); }
+- | '<' task_name ':' arglist '>' return_type '\n' { gsl_append(new_function_intro($2));
+- gsl_declare_global_variable($6,$2); }
+- ;
+-function_outro: { gsl_append(new_function_outro()); } ;
+-
+-leave_namespace: { $$ = gsl_leavenamespace(); };
+-
+-/* ------------ Variable declaration ---------------- */
+-
+-declaration: FLOAT_TK LTYPE_VAR '=' expression { gsl_float_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); }
+- | INT_TK LTYPE_VAR '=' expression { gsl_int_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); }
+- | PTR_TK LTYPE_VAR '=' expression { gsl_ptr_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); }
+- | LTYPE_VAR LTYPE_VAR '=' expression { gsl_struct_decl_local($1,$2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); }
+- | empty_declaration { $$ = 0; }
+- ;
+-
+-empty_declaration: FLOAT_TK LTYPE_VAR { gsl_float_decl_local($2); }
+- | INT_TK LTYPE_VAR { gsl_int_decl_local($2); }
+- | PTR_TK LTYPE_VAR { gsl_ptr_decl_local($2); }
+- | LTYPE_VAR LTYPE_VAR { gsl_struct_decl_local($1,$2); }
+- ;
+-
+-/* -------------- Instructions and Expressions ------------------ */
+-
+-instruction: affectation '\n' { $$ = $1; }
+- | declaration '\n' { $$ = $1; }
+- | '(' test ')' '?' opt_nl instruction { $$ = new_if($2,$6); }
+- | WHILE test opt_nl DO opt_nl instruction { $$ = new_while($2,$6); }
+- | '{' '\n' start_block gsl_code '}' '\n' { lastNode = $3->unode.opr.op[1]; $$=$3; }
+- | func_call { $$ = $1; }
+- | LTYPE_VAR PLUS_EQ expression { $$ = new_plus_eq(new_var($1,currentGoomSL->num_lines),$3); }
+- | LTYPE_VAR SUB_EQ expression { $$ = new_sub_eq(new_var($1,currentGoomSL->num_lines),$3); }
+- | LTYPE_VAR MUL_EQ expression { $$ = new_mul_eq(new_var($1,currentGoomSL->num_lines),$3); }
+- | LTYPE_VAR DIV_EQ expression { $$ = new_div_eq(new_var($1,currentGoomSL->num_lines),$3); }
+- | FOR LTYPE_VAR IN var_list DO instruction { $$ = new_static_foreach(new_var($2, currentGoomSL->num_lines), $4, $6); }
+- ;
+-
+-var_list: '(' var_list_content ')' { $$ = $2; }
+- ;
+-var_list_content: LTYPE_VAR { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), NULL); }
+- | LTYPE_VAR var_list_content { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), $2); }
+- ;
+-
+-affectation: LTYPE_VAR '=' expression { $$ = new_set(new_var($1,currentGoomSL->num_lines),$3); } ;
+-
+-start_block: { $$ = new_block(lastNode); lastNode = $$->unode.opr.op[0]; }
+- ;
+-
+-expression: LTYPE_VAR { $$ = new_var($1,currentGoomSL->num_lines); }
+- | constValue { $$ = $1; }
+- | expression '*' expression { $$ = new_mul($1,$3); }
+- | expression '/' expression { $$ = new_div($1,$3); }
+- | expression '+' expression { $$ = new_add($1,$3); }
+- | expression '-' expression { $$ = new_sub($1,$3); }
+- | '-' expression { $$ = new_neg($2); }
+- | '(' expression ')' { $$ = $2; }
+- | func_call_expression { $$ = $1; }
+- ;
+-
+-test: expression '=' expression { $$ = new_equ($1,$3); }
+- | expression '<' expression { $$ = new_low($1,$3); }
+- | expression '>' expression { $$ = new_low($3,$1); }
+- | expression SUP_EQ expression { $$ = new_not(new_low($1,$3)); }
+- | expression LOW_EQ expression { $$ = new_not(new_low($3,$1)); }
+- | expression NOT_EQ expression { $$ = new_not(new_equ($1,$3)); }
+- | NOT test { $$ = new_not($2); }
+- ;
+-
+-constValue: LTYPE_FLOAT { $$ = new_constFloat($1,currentGoomSL->num_lines); }
+- | LTYPE_INTEGER { $$ = new_constInt($1,currentGoomSL->num_lines); }
+- | LTYPE_PTR { $$ = new_constPtr($1,currentGoomSL->num_lines); }
+- ;
+-
+-/* ---------------- Function Calls ------------------ */
+-
+-func_call: task_name '\n' leave_namespace { $$ = new_call($1,NULL); }
+- | task_name ':' affectation_list '\n' leave_namespace { $$ = new_call($1,$3); }
+- | '[' task_name ']' '\n' leave_namespace { $$ = new_call($2,NULL); }
+- | '[' task_name ':' affectation_list ']' '\n' leave_namespace { $$ = new_call($2,$4); }
+- ;
+-
+-func_call_expression:
+- '[' task_name leave_namespace ']' { $$ = new_call_expr($2,NULL); }
+- | '[' task_name ':' affectation_list ']' leave_namespace { $$ = new_call_expr($2,$4); }
+- ;
+-
+-affectation_list: affectation_in_list affectation_list { $$ = new_affec_list($1,$2); }
+- | affectation_in_list { $$ = new_affec_list($1,NULL); }
+-
+-affectation_in_list: LTYPE_VAR '=' leave_namespace expression {
+- gsl_reenternamespace($3);
+- $$ = new_set(new_var($1,currentGoomSL->num_lines),$4);
+- }
+- | ':' leave_namespace expression {
+- gsl_reenternamespace($2);
+- $$ = new_set(new_var("&this", currentGoomSL->num_lines),$3);
+- }
+- ;
+-
+-
+-/* ------------ Misc ---------- */
+-
+-opt_nl: '\n' | ;
+-
+-
+-%%
+-
+-
+-void yyerror(char *str)
+-{ /* {{{ */
+- fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str);
+- currentGoomSL->compilationOK = 0;
+- exit(1);
+-} /* }}} */
+-
+diff -Naur /home/d4rk/goom2k4-0/src/goom_tools.c /src/goom_tools.c
+--- /home/d4rk/goom2k4-0/src/goom_tools.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom_tools.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,25 +0,0 @@
+-#include "goom_tools.h"
+-#include <stdlib.h>
+-
+-GoomRandom *goom_random_init(int i) {
+- GoomRandom *grandom = (GoomRandom*)malloc(sizeof(GoomRandom));
+- srand (i);
+- grandom->pos = 1;
+- goom_random_update_array(grandom, GOOM_NB_RAND);
+- return grandom;
+-}
+-
+-void goom_random_free(GoomRandom *grandom) {
+- free(grandom);
+-}
+-
+-void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange) {
+- while (numberOfValuesToChange > 0) {
+-#if RAND_MAX < 0x10000
+- grandom->array[grandom->pos++] = ((rand()<<16)+rand()) / 127;
+-#else
+- grandom->array[grandom->pos++] = rand() / 127;
+-#endif
+- numberOfValuesToChange--;
+- }
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/goom_tools.h /src/goom_tools.h
+--- /home/d4rk/goom2k4-0/src/goom_tools.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom_tools.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,33 +0,0 @@
+-#ifndef _GOOMTOOLS_H
+-#define _GOOMTOOLS_H
+-
+-/**
+- * Random number generator wrapper for faster random number.
+- */
+-
+-#define GOOM_NB_RAND 0x10000
+-
+-typedef struct _GOOM_RANDOM {
+- int array[GOOM_NB_RAND];
+- unsigned short pos;
+-} GoomRandom;
+-
+-GoomRandom *goom_random_init(int i);
+-void goom_random_free(GoomRandom *grandom);
+-
+-inline static int goom_random(GoomRandom *grandom) {
+-
+- grandom->pos++; /* works because pos is an unsigned short */
+- return grandom->array[grandom->pos];
+-}
+-
+-inline static int goom_irand(GoomRandom *grandom, int i) {
+-
+- grandom->pos++;
+- return grandom->array[grandom->pos] % i;
+-}
+-
+-/* called to change the specified number of value in the array, so that the array does not remain the same*/
+-void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange);
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/goom_typedefs.h /src/goom_typedefs.h
+--- /home/d4rk/goom2k4-0/src/goom_typedefs.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom_typedefs.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,11 +0,0 @@
+-#ifndef _GOOM_TYPEDEFS_H
+-#define _GOOM_TYPEDEFS_H
+-
+-typedef struct _PLUGIN_INFO PluginInfo;
+-typedef struct _SOUND_INFO SoundInfo;
+-typedef struct _GMLINE GMLine;
+-typedef struct _GMUNITPOINTER GMUnitPointer;
+-typedef struct _ZOOM_FILTER_DATA ZoomFilterData;
+-typedef struct _VISUAL_FX VisualFX;
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/goom_visual_fx.h /src/goom_visual_fx.h
+--- /home/d4rk/goom2k4-0/src/goom_visual_fx.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/goom_visual_fx.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,26 +0,0 @@
+-#ifndef _VISUAL_FX_H
+-#define _VISUAL_FX_H
+-
+-/**
+- * File created on 2003-05-21 by Jeko.
+- * (c)2003, JC Hoelt for iOS-software.
+- *
+- * LGPL Licence.
+- * If you use this file on a visual program,
+- * please make my name being visible on it.
+- */
+-
+-#include "goom_config_param.h"
+-#include "goom_graphic.h"
+-#include "goom_typedefs.h"
+-
+-struct _VISUAL_FX {
+- void (*init) (struct _VISUAL_FX *_this, PluginInfo *info);
+- void (*free) (struct _VISUAL_FX *_this);
+- void (*apply) (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info);
+- void *fx_data;
+-
+- PluginParameters *params;
+-};
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/graphic.c /src/graphic.c
+--- /home/d4rk/goom2k4-0/src/graphic.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/graphic.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,10 +0,0 @@
+-#include "goom_graphic.h"
+-
+-const Color BLACK = { 0, 0, 0 };
+-const Color WHITE = { 0xff, 0xff, 0xff };
+-const Color RED = { 0xff, 0x05, 0x05 };
+-const Color GREEN = { 0x05, 0xff, 0x05 };
+-const Color BLUE = { 0x05, 0x05, 0xff };
+-const Color YELLOW = { 0xff, 0xff, 0x33 };
+-const Color ORANGE = { 0xff, 0xcc, 0x05 };
+-const Color VIOLET = { 0x55, 0x05, 0xff };
+diff -Naur /home/d4rk/goom2k4-0/src/ifs.c /src/ifs.c
+--- /home/d4rk/goom2k4-0/src/ifs.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/ifs.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,763 +0,0 @@
+-/*
+- * ifs.c --- modified iterated functions system for goom.
+- */
+-
+-/*-
+- * Copyright (c) 1997 by Massimino Pascal <Pascal.Massimon@ens.fr>
+- *
+- * Permission to use, copy, modify, and distribute this software and its
+- * documentation for any purpose and without fee is hereby granted,
+- * provided that the above copyright notice appear in all copies and that
+- * both that copyright notice and this permission notice appear in
+- * supporting documentation.
+- *
+- * This file is provided AS IS with no warranties of any kind. The author
+- * shall have no liability with respect to the infringement of copyrights,
+- * trade secrets or any patents by this file or any part thereof. In no
+- * event will the author be liable for any lost revenue or profits or
+- * other special, indirect and consequential damages.
+- *
+- * If this mode is weird and you have an old MetroX server, it is buggy.
+- * There is a free SuSE-enhanced MetroX X server that is fine.
+- *
+- * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing."
+- *
+- * Revision History:
+- * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX).
+- * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added)
+- * 01-Nov-2000: Allocation checks
+- * 10-May-1997: jwz@jwz.org: turned into a standalone program.
+- * Made it render into an offscreen bitmap and then copy
+- * that onto the screen, to reduce flicker.
+- */
+-
+-/* #ifdef STANDALONE */
+-
+-#include <math.h>
+-#include <stdlib.h>
+-#include <stdio.h>
+-
+-#include "goom_config.h"
+-
+-#ifdef HAVE_MMX
+-#include "mmx.h"
+-#endif
+-
+-#include "goom_graphic.h"
+-#include "ifs.h"
+-#include "goom_tools.h"
+-
+-typedef struct _ifsPoint
+-{
+- gint32 x, y;
+-}
+-IFSPoint;
+-
+-
+-#define MODE_ifs
+-
+-#define PROGCLASS "IFS"
+-
+-#define HACK_INIT init_ifs
+-#define HACK_DRAW draw_ifs
+-
+-#define ifs_opts xlockmore_opts
+-
+-#define DEFAULTS "*delay: 20000 \n" \
+-"*ncolors: 100 \n"
+-
+-#define SMOOTH_COLORS
+-
+-#define LRAND() ((long) (goom_random(goomInfo->gRandom) & 0x7fffffff))
+-#define NRAND(n) ((int) (LRAND() % (n)))
+-
+-#if RAND_MAX < 0x10000
+-#define MAXRAND (((float)(RAND_MAX<16)+((float)RAND_MAX)+1.0f)/127.0f)
+-#else
+-#define MAXRAND (2147483648.0/127.0) /* unsigned 1<<31 / 127.0 (cf goom_tools) as a float */
+-#endif
+-
+-/*****************************************************/
+-
+-typedef float DBL;
+-typedef int F_PT;
+-
+-/* typedef float F_PT; */
+-
+-/*****************************************************/
+-
+-#define FIX 12
+-#define UNIT ( 1<<FIX )
+-#define MAX_SIMI 6
+-
+-#define MAX_DEPTH_2 10
+-#define MAX_DEPTH_3 6
+-#define MAX_DEPTH_4 4
+-#define MAX_DEPTH_5 2
+-
+-/* PREVIOUS VALUE
+-#define MAX_SIMI 6
+-
+- * settings for a PC 120Mhz... *
+-#define MAX_DEPTH_2 10
+-#define MAX_DEPTH_3 6
+-#define MAX_DEPTH_4 4
+-#define MAX_DEPTH_5 3
+-*/
+-
+-#define DBL_To_F_PT(x) (F_PT)( (DBL)(UNIT)*(x) )
+-
+-typedef struct Similitude_Struct SIMI;
+-typedef struct Fractal_Struct FRACTAL;
+-
+-struct Similitude_Struct
+-{
+-
+- DBL c_x, c_y;
+- DBL r, r2, A, A2;
+- F_PT Ct, St, Ct2, St2;
+- F_PT Cx, Cy;
+- F_PT R, R2;
+-};
+-
+-
+-struct Fractal_Struct
+-{
+-
+- int Nb_Simi;
+- SIMI Components[5 * MAX_SIMI];
+- int Depth, Col;
+- int Count, Speed;
+- int Width, Height, Lx, Ly;
+- DBL r_mean, dr_mean, dr2_mean;
+- int Cur_Pt, Max_Pt;
+-
+- IFSPoint *Buffer1, *Buffer2;
+-};
+-
+-typedef struct _IFS_DATA {
+- FRACTAL *Root;
+- FRACTAL *Cur_F;
+-
+- /* Used by the Trace recursive method */
+- IFSPoint *Buf;
+- int Cur_Pt;
+- int initalized;
+-} IfsData;
+-
+-
+-/*****************************************************/
+-
+-static DBL
+-Gauss_Rand (PluginInfo *goomInfo, DBL c, DBL A, DBL S)
+-{
+- DBL y;
+-
+- y = (DBL) LRAND () / MAXRAND;
+- y = A * (1.0 - exp (-y * y * S)) / (1.0 - exp (-S));
+- if (NRAND (2))
+- return (c + y);
+- return (c - y);
+-}
+-
+-static DBL
+-Half_Gauss_Rand (PluginInfo *goomInfo, DBL c, DBL A, DBL S)
+-{
+- DBL y;
+-
+- y = (DBL) LRAND () / MAXRAND;
+- y = A * (1.0 - exp (-y * y * S)) / (1.0 - exp (-S));
+- return (c + y);
+-}
+-
+-static void
+-Random_Simis (PluginInfo *goomInfo, FRACTAL * F, SIMI * Cur, int i)
+-{
+- while (i--) {
+- Cur->c_x = Gauss_Rand (goomInfo, 0.0, .8, 4.0);
+- Cur->c_y = Gauss_Rand (goomInfo, 0.0, .8, 4.0);
+- Cur->r = Gauss_Rand (goomInfo, F->r_mean, F->dr_mean, 3.0);
+- Cur->r2 = Half_Gauss_Rand (goomInfo, 0.0, F->dr2_mean, 2.0);
+- Cur->A = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0);
+- Cur->A2 = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0);
+- Cur++;
+- }
+-}
+-
+-static void
+-free_ifs_buffers (FRACTAL * Fractal)
+-{
+- if (Fractal->Buffer1 != NULL) {
+- (void) free ((void *) Fractal->Buffer1);
+- Fractal->Buffer1 = (IFSPoint *) NULL;
+- }
+- if (Fractal->Buffer2 != NULL) {
+- (void) free ((void *) Fractal->Buffer2);
+- Fractal->Buffer2 = (IFSPoint *) NULL;
+- }
+-}
+-
+-
+-static void
+-free_ifs (FRACTAL * Fractal)
+-{
+- free_ifs_buffers (Fractal);
+-}
+-
+-/***************************************************************/
+-
+-static void
+-init_ifs (PluginInfo *goomInfo, IfsData *data)
+-{
+- int i;
+- FRACTAL *Fractal;
+- int width = goomInfo->screen.width;
+- int height = goomInfo->screen.height;
+-
+- if (data->Root == NULL) {
+- data->Root = (FRACTAL *) malloc (sizeof (FRACTAL));
+- if (data->Root == NULL)
+- return;
+- data->Root->Buffer1 = (IFSPoint *) NULL;
+- data->Root->Buffer2 = (IFSPoint *) NULL;
+- }
+- Fractal = data->Root;
+-
+- free_ifs_buffers (Fractal);
+-
+- i = (NRAND (4)) + 2; /* Number of centers */
+- switch (i) {
+- case 3:
+- Fractal->Depth = MAX_DEPTH_3;
+- Fractal->r_mean = .6;
+- Fractal->dr_mean = .4;
+- Fractal->dr2_mean = .3;
+- break;
+-
+- case 4:
+- Fractal->Depth = MAX_DEPTH_4;
+- Fractal->r_mean = .5;
+- Fractal->dr_mean = .4;
+- Fractal->dr2_mean = .3;
+- break;
+-
+- case 5:
+- Fractal->Depth = MAX_DEPTH_5;
+- Fractal->r_mean = .5;
+- Fractal->dr_mean = .4;
+- Fractal->dr2_mean = .3;
+- break;
+-
+- default:
+- case 2:
+- Fractal->Depth = MAX_DEPTH_2;
+- Fractal->r_mean = .7;
+- Fractal->dr_mean = .3;
+- Fractal->dr2_mean = .4;
+- break;
+- }
+- Fractal->Nb_Simi = i;
+- Fractal->Max_Pt = Fractal->Nb_Simi - 1;
+- for (i = 0; i <= Fractal->Depth + 2; ++i)
+- Fractal->Max_Pt *= Fractal->Nb_Simi;
+-
+- if ((Fractal->Buffer1 = (IFSPoint *) calloc (Fractal->Max_Pt,
+- sizeof (IFSPoint))) == NULL) {
+- free_ifs (Fractal);
+- return;
+- }
+- if ((Fractal->Buffer2 = (IFSPoint *) calloc (Fractal->Max_Pt,
+- sizeof (IFSPoint))) == NULL) {
+- free_ifs (Fractal);
+- return;
+- }
+-
+- Fractal->Speed = 6;
+- Fractal->Width = width; /* modif by JeKo */
+- Fractal->Height = height; /* modif by JeKo */
+- Fractal->Cur_Pt = 0;
+- Fractal->Count = 0;
+- Fractal->Lx = (Fractal->Width - 1) / 2;
+- Fractal->Ly = (Fractal->Height - 1) / 2;
+- Fractal->Col = rand () % (width * height); /* modif by JeKo */
+-
+- Random_Simis (goomInfo, Fractal, Fractal->Components, 5 * MAX_SIMI);
+-}
+-
+-
+-/***************************************************************/
+-
+-static inline void
+-Transform (SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y)
+-{
+- F_PT xx, yy;
+-
+- xo = xo - Simi->Cx;
+- xo = (xo * Simi->R) >> FIX; /* / UNIT; */
+- yo = yo - Simi->Cy;
+- yo = (yo * Simi->R) >> FIX; /* / UNIT; */
+-
+- xx = xo - Simi->Cx;
+- xx = (xx * Simi->R2) >> FIX; /* / UNIT; */
+- yy = -yo - Simi->Cy;
+- yy = (yy * Simi->R2) >> FIX; /* / UNIT; */
+-
+- *x =
+- ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2)
+- >> FIX /* / UNIT */ ) + Simi->Cx;
+- *y =
+- ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2)
+- >> FIX /* / UNIT */ ) + Simi->Cy;
+-}
+-
+-/***************************************************************/
+-
+-static void
+-Trace (FRACTAL * F, F_PT xo, F_PT yo, IfsData *data)
+-{
+- F_PT x, y, i;
+- SIMI *Cur;
+-
+- Cur = data->Cur_F->Components;
+- for (i = data->Cur_F->Nb_Simi; i; --i, Cur++) {
+- Transform (Cur, xo, yo, &x, &y);
+-
+- data->Buf->x = F->Lx + ((x * F->Lx) >> (FIX+1) /* /(UNIT*2) */ );
+- data->Buf->y = F->Ly - ((y * F->Ly) >> (FIX+1) /* /(UNIT*2) */ );
+- data->Buf++;
+-
+- data->Cur_Pt++;
+-
+- if (F->Depth && ((x - xo) >> 4) && ((y - yo) >> 4)) {
+- F->Depth--;
+- Trace (F, x, y, data);
+- F->Depth++;
+- }
+- }
+-}
+-
+-static void
+-Draw_Fractal (IfsData *data)
+-{
+- FRACTAL *F = data->Root;
+- int i, j;
+- F_PT x, y, xo, yo;
+- SIMI *Cur, *Simi;
+-
+- for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) {
+- Cur->Cx = DBL_To_F_PT (Cur->c_x);
+- Cur->Cy = DBL_To_F_PT (Cur->c_y);
+-
+- Cur->Ct = DBL_To_F_PT (cos (Cur->A));
+- Cur->St = DBL_To_F_PT (sin (Cur->A));
+- Cur->Ct2 = DBL_To_F_PT (cos (Cur->A2));
+- Cur->St2 = DBL_To_F_PT (sin (Cur->A2));
+-
+- Cur->R = DBL_To_F_PT (Cur->r);
+- Cur->R2 = DBL_To_F_PT (Cur->r2);
+- }
+-
+-
+- data->Cur_Pt = 0;
+- data->Cur_F = F;
+- data->Buf = F->Buffer2;
+- for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) {
+- xo = Cur->Cx;
+- yo = Cur->Cy;
+- for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) {
+- if (Simi == Cur)
+- continue;
+- Transform (Simi, xo, yo, &x, &y);
+- Trace (F, x, y, data);
+- }
+- }
+-
+- /* Erase previous */
+-
+- F->Cur_Pt = data->Cur_Pt;
+- data->Buf = F->Buffer1;
+- F->Buffer1 = F->Buffer2;
+- F->Buffer2 = data->Buf;
+-}
+-
+-
+-static IFSPoint *
+-draw_ifs (PluginInfo *goomInfo, int *nbpt, IfsData *data)
+-{
+- int i;
+- DBL u, uu, v, vv, u0, u1, u2, u3;
+- SIMI *S, *S1, *S2, *S3, *S4;
+- FRACTAL *F;
+-
+- if (data->Root == NULL)
+- return NULL;
+- F = data->Root;
+- if (F->Buffer1 == NULL)
+- return NULL;
+-
+- u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0;
+- uu = u * u;
+- v = 1.0 - u;
+- vv = v * v;
+- u0 = vv * v;
+- u1 = 3.0 * vv * u;
+- u2 = 3.0 * v * uu;
+- u3 = u * uu;
+-
+- S = F->Components;
+- S1 = S + F->Nb_Simi;
+- S2 = S1 + F->Nb_Simi;
+- S3 = S2 + F->Nb_Simi;
+- S4 = S3 + F->Nb_Simi;
+-
+- for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) {
+- S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x;
+- S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y;
+- S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r;
+- S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2;
+- S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A;
+- S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2;
+- }
+-
+- Draw_Fractal (data);
+-
+- if (F->Count >= 1000 / F->Speed) {
+- S = F->Components;
+- S1 = S + F->Nb_Simi;
+- S2 = S1 + F->Nb_Simi;
+- S3 = S2 + F->Nb_Simi;
+- S4 = S3 + F->Nb_Simi;
+-
+- for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) {
+- S2->c_x = 2.0 * S4->c_x - S3->c_x;
+- S2->c_y = 2.0 * S4->c_y - S3->c_y;
+- S2->r = 2.0 * S4->r - S3->r;
+- S2->r2 = 2.0 * S4->r2 - S3->r2;
+- S2->A = 2.0 * S4->A - S3->A;
+- S2->A2 = 2.0 * S4->A2 - S3->A2;
+-
+- *S1 = *S4;
+- }
+- Random_Simis (goomInfo, F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi);
+-
+- Random_Simis (goomInfo, F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi);
+-
+- F->Count = 0;
+- }
+- else
+- F->Count++;
+-
+- F->Col++;
+-
+- (*nbpt) = data->Cur_Pt;
+- return F->Buffer2;
+-}
+-
+-
+-/***************************************************************/
+-
+-static void release_ifs (IfsData *data)
+-{
+- if (data->Root != NULL) {
+- free_ifs (data->Root);
+- (void) free ((void *) data->Root);
+- data->Root = (FRACTAL *) NULL;
+- }
+-}
+-
+-#define RAND() goom_random(goomInfo->gRandom)
+-
+-static void ifs_update (PluginInfo *goomInfo, Pixel * data, Pixel * back, int increment, IfsData *fx_data)
+-{
+- static int couleur = 0xc0c0c0c0;
+- static int v[4] = { 2, 4, 3, 2 };
+- static int col[4] = { 2, 4, 3, 2 };
+-
+-#define MOD_MER 0
+-#define MOD_FEU 1
+-#define MOD_MERVER 2
+- static int mode = MOD_MERVER;
+- static int justChanged = 0;
+- static int cycle = 0;
+- int cycle10;
+-
+- int nbpt;
+- IFSPoint *points;
+- int i;
+-
+- int couleursl = couleur;
+- int width = goomInfo->screen.width;
+- int height = goomInfo->screen.height;
+-
+- cycle++;
+- if (cycle >= 80)
+- cycle = 0;
+-
+- if (cycle < 40)
+- cycle10 = cycle / 10;
+- else
+- cycle10 = 7 - cycle / 10;
+-
+- {
+- unsigned char *tmp = (unsigned char *) &couleursl;
+-
+- for (i = 0; i < 4; i++) {
+- *tmp = (*tmp) >> cycle10;
+- tmp++;
+- }
+- }
+-
+- points = draw_ifs (goomInfo, &nbpt, fx_data);
+- nbpt--;
+-
+-#ifdef HAVE_MMX
+- movd_m2r (couleursl, mm1);
+- punpckldq_r2r (mm1, mm1);
+- for (i = 0; i < nbpt; i += increment) {
+- int x = points[i].x;
+- int y = points[i].y;
+-
+- if ((x < width) && (y < height) && (x > 0) && (y > 0)) {
+- int pos = x + (y * width);
+- movd_m2r (back[pos], mm0);
+- paddusb_r2r (mm1, mm0);
+- movd_r2m (mm0, data[pos]);
+- }
+- }
+- emms();/*__asm__ __volatile__ ("emms");*/
+-#else
+- for (i = 0; i < nbpt; i += increment) {
+- int x = (int) points[i].x & 0x7fffffff;
+- int y = (int) points[i].y & 0x7fffffff;
+-
+- if ((x < width) && (y < height)) {
+- int pos = x + (int) (y * width);
+- int tra = 0, i = 0;
+- unsigned char *bra = (unsigned char *) &back[pos];
+- unsigned char *dra = (unsigned char *) &data[pos];
+- unsigned char *cra = (unsigned char *) &couleursl;
+-
+- for (; i < 4; i++) {
+- tra = *cra;
+- tra += *bra;
+- if (tra > 255)
+- tra = 255;
+- *dra = tra;
+- ++dra;
+- ++cra;
+- ++bra;
+- }
+- }
+- }
+-#endif /*MMX*/
+- justChanged--;
+-
+- col[ALPHA] = couleur >> (ALPHA * 8) & 0xff;
+- col[BLEU] = couleur >> (BLEU * 8) & 0xff;
+- col[VERT] = couleur >> (VERT * 8) & 0xff;
+- col[ROUGE] = couleur >> (ROUGE * 8) & 0xff;
+-
+- if (mode == MOD_MER) {
+- col[BLEU] += v[BLEU];
+- if (col[BLEU] > 255) {
+- col[BLEU] = 255;
+- v[BLEU] = -(RAND() % 4) - 1;
+- }
+- if (col[BLEU] < 32) {
+- col[BLEU] = 32;
+- v[BLEU] = (RAND() % 4) + 1;
+- }
+-
+- col[VERT] += v[VERT];
+- if (col[VERT] > 200) {
+- col[VERT] = 200;
+- v[VERT] = -(RAND() % 3) - 2;
+- }
+- if (col[VERT] > col[BLEU]) {
+- col[VERT] = col[BLEU];
+- v[VERT] = v[BLEU];
+- }
+- if (col[VERT] < 32) {
+- col[VERT] = 32;
+- v[VERT] = (RAND() % 3) + 2;
+- }
+-
+- col[ROUGE] += v[ROUGE];
+- if (col[ROUGE] > 64) {
+- col[ROUGE] = 64;
+- v[ROUGE] = -(RAND () % 4) - 1;
+- }
+- if (col[ROUGE] < 0) {
+- col[ROUGE] = 0;
+- v[ROUGE] = (RAND () % 4) + 1;
+- }
+-
+- col[ALPHA] += v[ALPHA];
+- if (col[ALPHA] > 0) {
+- col[ALPHA] = 0;
+- v[ALPHA] = -(RAND () % 4) - 1;
+- }
+- if (col[ALPHA] < 0) {
+- col[ALPHA] = 0;
+- v[ALPHA] = (RAND () % 4) + 1;
+- }
+-
+- if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40)
+- && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64)
+- && (RAND () % 20 == 0)) && (justChanged < 0)) {
+- mode = RAND () % 3 ? MOD_FEU : MOD_MERVER;
+- justChanged = 250;
+- }
+- }
+- else if (mode == MOD_MERVER) {
+- col[BLEU] += v[BLEU];
+- if (col[BLEU] > 128) {
+- col[BLEU] = 128;
+- v[BLEU] = -(RAND () % 4) - 1;
+- }
+- if (col[BLEU] < 16) {
+- col[BLEU] = 16;
+- v[BLEU] = (RAND () % 4) + 1;
+- }
+-
+- col[VERT] += v[VERT];
+- if (col[VERT] > 200) {
+- col[VERT] = 200;
+- v[VERT] = -(RAND () % 3) - 2;
+- }
+- if (col[VERT] > col[ALPHA]) {
+- col[VERT] = col[ALPHA];
+- v[VERT] = v[ALPHA];
+- }
+- if (col[VERT] < 32) {
+- col[VERT] = 32;
+- v[VERT] = (RAND () % 3) + 2;
+- }
+-
+- col[ROUGE] += v[ROUGE];
+- if (col[ROUGE] > 128) {
+- col[ROUGE] = 128;
+- v[ROUGE] = -(RAND () % 4) - 1;
+- }
+- if (col[ROUGE] < 0) {
+- col[ROUGE] = 0;
+- v[ROUGE] = (RAND () % 4) + 1;
+- }
+-
+- col[ALPHA] += v[ALPHA];
+- if (col[ALPHA] > 255) {
+- col[ALPHA] = 255;
+- v[ALPHA] = -(RAND () % 4) - 1;
+- }
+- if (col[ALPHA] < 0) {
+- col[ALPHA] = 0;
+- v[ALPHA] = (RAND () % 4) + 1;
+- }
+-
+- if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40)
+- && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64)
+- && (RAND () % 20 == 0)) && (justChanged < 0)) {
+- mode = RAND () % 3 ? MOD_FEU : MOD_MER;
+- justChanged = 250;
+- }
+- }
+- else if (mode == MOD_FEU) {
+-
+- col[BLEU] += v[BLEU];
+- if (col[BLEU] > 64) {
+- col[BLEU] = 64;
+- v[BLEU] = -(RAND () % 4) - 1;
+- }
+- if (col[BLEU] < 0) {
+- col[BLEU] = 0;
+- v[BLEU] = (RAND () % 4) + 1;
+- }
+-
+- col[VERT] += v[VERT];
+- if (col[VERT] > 200) {
+- col[VERT] = 200;
+- v[VERT] = -(RAND () % 3) - 2;
+- }
+- if (col[VERT] > col[ROUGE] + 20) {
+- col[VERT] = col[ROUGE] + 20;
+- v[VERT] = -(RAND () % 3) - 2;
+- v[ROUGE] = (RAND () % 4) + 1;
+- v[BLEU] = (RAND () % 4) + 1;
+- }
+- if (col[VERT] < 0) {
+- col[VERT] = 0;
+- v[VERT] = (RAND () % 3) + 2;
+- }
+-
+- col[ROUGE] += v[ROUGE];
+- if (col[ROUGE] > 255) {
+- col[ROUGE] = 255;
+- v[ROUGE] = -(RAND () % 4) - 1;
+- }
+- if (col[ROUGE] > col[VERT] + 40) {
+- col[ROUGE] = col[VERT] + 40;
+- v[ROUGE] = -(RAND () % 4) - 1;
+- }
+- if (col[ROUGE] < 0) {
+- col[ROUGE] = 0;
+- v[ROUGE] = (RAND () % 4) + 1;
+- }
+-
+- col[ALPHA] += v[ALPHA];
+- if (col[ALPHA] > 0) {
+- col[ALPHA] = 0;
+- v[ALPHA] = -(RAND () % 4) - 1;
+- }
+- if (col[ALPHA] < 0) {
+- col[ALPHA] = 0;
+- v[ALPHA] = (RAND () % 4) + 1;
+- }
+-
+- if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU])
+- && (col[BLEU] > 32)
+- && (RAND () % 20 == 0)) && (justChanged < 0)) {
+- mode = RAND () % 2 ? MOD_MER : MOD_MERVER;
+- justChanged = 250;
+- }
+- }
+-
+- couleur = (col[ALPHA] << (ALPHA * 8))
+- | (col[BLEU] << (BLEU * 8))
+- | (col[VERT] << (VERT * 8))
+- | (col[ROUGE] << (ROUGE * 8));
+-}
+-
+-/** VISUAL_FX WRAPPER FOR IFS */
+-
+-static void ifs_vfx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) {
+-
+- IfsData *data = (IfsData*)_this->fx_data;
+- if (!data->initalized) {
+- data->initalized = 1;
+- init_ifs(goomInfo, data);
+- }
+- ifs_update (goomInfo, dest, src, goomInfo->update.ifs_incr, data);
+- /*TODO: trouver meilleur soluce pour increment (mettre le code de gestion de l'ifs dans ce fichier: ifs_vfx_apply) */
+-}
+-
+-static void ifs_vfx_init(VisualFX *_this, PluginInfo *info) {
+-
+- IfsData *data = (IfsData*)malloc(sizeof(IfsData));
+- data->Root = (FRACTAL*)NULL;
+- data->initalized = 0;
+- _this->fx_data = data;
+-}
+-
+-static void ifs_vfx_free(VisualFX *_this) {
+- IfsData *data = (IfsData*)_this->fx_data;
+- release_ifs(data);
+- free(data);
+-}
+-
+-VisualFX ifs_visualfx_create(void) {
+- VisualFX vfx;
+- vfx.init = ifs_vfx_init;
+- vfx.free = ifs_vfx_free;
+- vfx.apply = ifs_vfx_apply;
+- return vfx;
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/ifs.h /src/ifs.h
+--- /home/d4rk/goom2k4-0/src/ifs.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/ifs.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,27 +0,0 @@
+-/*
+- * File created 11 april 2002 by JeKo <jeko@free.fr>
+- */
+-
+-#ifndef IFS_H
+-#define IFS_H
+-
+-#include "goom_config.h"
+-#include "goom_graphic.h"
+-#include "goom_plugin_info.h"
+-#include "goom_visual_fx.h"
+-
+-VisualFX ifs_visualfx_create(void);
+-
+-/* init ifs for a (width)x(height) output. * /
+-void init_ifs (PluginInfo *goomInfo, int width, int height);
+-
+-/ * draw an ifs on the buffer (which size is width * height)
+- increment means that we draw 1/increment of the ifs's points * /
+-void ifs_update (PluginInfo *goomInfo, Pixel * buffer, Pixel * back, int width, int height, int increment);
+-
+-/ * free all ifs's data. * /
+-void release_ifs (void);
+-*/
+-
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/jitc_test.c /src/jitc_test.c
+--- /home/d4rk/goom2k4-0/src/jitc_test.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/jitc_test.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,38 +0,0 @@
+-#include "jitc_x86.h"
+-#include <stdio.h>
+-
+-int main(int c, char **v)
+-{
+- int i;
+- int j;
+- JitcX86Env *jitc = jitc_x86_env_new(0xffff);
+- JitcFunc func = jitc_prepare_func(jitc);
+-
+- jitc_add(jitc, "mov edx, $d", 0xffffffff);
+- jitc_add(jitc, "mov eax, $d", 40);
+- jitc_add(jitc, "mov ebx, $d", 2);
+- jitc_add(jitc, "idiv ebx");
+- jitc_add(jitc, "mov eax, [$d]", 0xdeadbeaf);
+-
+- jitc_add(jitc, "sal edx, $d", 7);
+- jitc_add(jitc, "imul ecx");
+- jitc_add(jitc, "idiv ecx");
+- jitc_add(jitc, "imul $d[ecx]", 2);
+- jitc_add(jitc, "imul ecx, [ecx]");
+- jitc_add(jitc, "mov ecx, $d", (char*)(&i)-12);
+- jitc_add(jitc, "dec $d[ecx]", 2);
+- jitc_add(jitc, "add ecx, $d", 12);
+- jitc_add(jitc, "dec [ecx]");
+- jitc_add(jitc, "dec ecx");
+-
+- JITC_FLD_pIMM32(jitc,&i);
+- JITC_FSTP_pIMM32(jitc,&j);
+-
+- jitc_validate_func(jitc);
+- func();
+-
+- printf("i = 0x%08x\n", i);
+-
+- jitc_x86_delete(jitc);
+- return 0;
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/jitc_x86.c /src/jitc_x86.c
+--- /home/d4rk/goom2k4-0/src/jitc_x86.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/jitc_x86.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,530 +0,0 @@
+-#include "jitc_x86.h"
+-
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <stdarg.h>
+-
+-#define PARAM_INT 1
+-#define PARAM_FLOAT 2
+-#define PARAM_REG 3
+-#define PARAM_dispREG 4
+-#define PARAM_DISP32 5
+-#define PARAM_LABEL 6
+-#define PARAM_NONE 666
+-
+-typedef struct {
+- int id;
+- int i;
+- double f;
+- int reg;
+- int disp;
+- char label[256];
+-} IParam;
+-
+-struct {
+- char *name;
+- int reg;
+-} RegsName[] = {
+- {"eax",EAX}, {"ebx",EBX}, {"ecx",ECX}, {"edx",EDX},
+- {"edi",EDI}, {"esi",ESI}, {"ebp",EBP}, {"esp",ESP},
+- {"st0",0}, {"st1",1}, {"st2",2}, {"st3",3},
+- {"st4",4}, {"st5",5}, {"st6",6}, {"st7",7},
+- {"mm0",0}, {"mm1",1}, {"mm2",2}, {"mm3",3},
+- {"mm4",4}, {"mm5",5}, {"mm6",6}, {"mm7",7}, {NULL,0}
+-};
+-
+-void modrm(JitcX86Env *jitc, int opcode, IParam *iparam)
+-{
+- int dest = 0;
+- int src = 1;
+- int direction = 0x0;
+- unsigned int byte = 666;
+- unsigned int int32 = 0;
+- unsigned int need32 = 0;
+-
+- if ((iparam[0].id == PARAM_REG) && (iparam[1].id != PARAM_REG)) {
+- dest = 1;
+- src = 0;
+- direction = 0x02;
+- }
+-
+- if (iparam[src].id != PARAM_REG) {
+- fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id);
+- exit(1);
+- }
+-
+- if (iparam[dest].id == PARAM_REG) {
+- byte = ((int)JITC_MOD_REG_REG << 6) | (iparam[src].reg << 3) | (iparam[0].reg);
+- }
+-
+- else if (iparam[dest].id == PARAM_dispREG)
+- {
+- if (iparam[dest].disp == 0)
+- byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | (iparam[dest].reg);
+- }
+-
+- else if (iparam[dest].id == PARAM_DISP32)
+- {
+- byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | JITC_RM_DISP32;
+- need32 = 1;
+- int32 = iparam[dest].disp;
+- }
+-
+- if (byte == 666) {
+- fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id);
+- exit(1);
+- }
+- else {
+- if (opcode < 0x100)
+- JITC_ADD_UCHAR(jitc, opcode + direction);
+- else {
+- JITC_ADD_UCHAR(jitc, (opcode>>8)&0xff);
+- JITC_ADD_UCHAR(jitc, (opcode&0xff)/* + direction*/);
+- }
+- JITC_ADD_UCHAR(jitc, byte);
+- if (need32)
+- JITC_ADD_UINT(jitc, int32);
+- }
+-}
+-
+-static void imul_like_modrm_1param(JitcX86Env *jitc, int opcode, int digit, IParam *iparam)
+-{
+- if (iparam[0].id == PARAM_REG)
+- {
+- JITC_ADD_UCHAR(jitc, opcode);
+- JITC_MODRM(jitc, 0x03, digit, iparam[0].reg);
+- return;
+- }
+- if (iparam[0].id == PARAM_dispREG) {
+- JITC_ADD_UCHAR(jitc, opcode);
+- if (iparam[0].disp == 0)
+- {
+- JITC_MODRM(jitc, 0x00, digit, iparam[0].reg);
+- }
+- else if ((iparam[0].disp & 0xff) == iparam[0].disp)
+- {
+- JITC_MODRM(jitc, 0x01, digit, iparam[0].reg);
+- JITC_ADD_UCHAR(jitc, iparam[0].disp);
+- }
+- else
+- {
+- JITC_MODRM(jitc, 0x02, digit, iparam[0].reg);
+- JITC_ADD_UINT(jitc, iparam[0].disp);
+- }
+- return;
+- }
+- if (iparam[0].id == PARAM_DISP32) {
+- JITC_ADD_UCHAR(jitc, opcode);
+- JITC_MODRM(jitc, JITC_MOD_pREG_REG, digit, JITC_RM_DISP32);
+- JITC_ADD_UINT(jitc, iparam[0].disp);
+- return;
+- }
+-}
+-
+-/* 1 byte encoded opcode including register... imm32 parameter */
+-#define INSTR_1bReg_IMM32(opcode,dest,src) { \
+- JITC_ADD_UCHAR(jitc, opcode + iparam[dest].reg); \
+- JITC_ADD_UINT (jitc, (int)iparam[src].i); }
+-
+-typedef struct {
+- char *name;
+- int opcode;
+- int opcode_reg_int;
+- int digit_reg_int;
+- int opcode_eax_int;
+-} AddLikeInstr;
+-
+-static AddLikeInstr addLike[] = {
+- { "add", 0x01, 0x81, 0x00, 0x05 },
+- { "and", 0x21, 0x81, 0x04, 0x25 },
+- { "or", 0x0B, 0x81, 0x01, 0x0D },
+- { "cmp", 0x39, 0x81, 0x07, 0x3D },
+- { "imul", 0x0FAF, 0x69, 0x00, 0x10000 },
+- { "sub", 0x29, 0x81, 0x05, 0X2D },
+- { NULL, -1, -1, -1, -1 }
+-};
+-
+-int checkAddLike(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams)
+-{
+- int i;
+- for (i=0;addLike[i].name;++i)
+- {
+- if (strcmp(op,addLike[i].name) == 0)
+- {
+- if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) {
+- if ((iparam[0].reg == EAX) && (addLike[i].opcode_eax_int != 0x10000)) {
+- JITC_ADD_UCHAR(jitc, addLike[i].opcode_eax_int);
+- JITC_ADD_UINT(jitc, iparam[1].i);
+- return 1;
+- }
+- else {
+- JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int);
+- JITC_MODRM(jitc, 0x03, addLike[i].digit_reg_int, iparam[0].reg);
+- JITC_ADD_UINT(jitc, iparam[1].i);
+- return 1;
+- }
+- }
+- else if ((iparam[0].id == PARAM_dispREG) && (iparam[1].id == PARAM_INT)) {
+- JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int);
+- if ((iparam[0].disp & 0xff) == iparam[0].disp)
+- {
+- JITC_MODRM(jitc, 0x01, addLike[i].digit_reg_int, iparam[0].reg);
+- JITC_ADD_UCHAR(jitc, iparam[0].disp);
+- }
+- else
+- {
+- JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, iparam[0].reg);
+- JITC_ADD_UINT(jitc, iparam[0].disp);
+- }
+- JITC_ADD_UINT(jitc, iparam[1].i);
+- return 1;
+- }
+- else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) {
+- JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int);
+- JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, 0x05);
+- JITC_ADD_UINT(jitc, iparam[0].disp);
+- JITC_ADD_UINT(jitc, iparam[1].i);
+- return 1;
+- }
+- else {
+- modrm(jitc, addLike[i].opcode, iparam);
+- return 1;
+- }
+- }
+- }
+- return 0;
+-}
+-
+-/**
+- * Check all kind of known instruction... perform special optimisations..
+- */
+-static void jitc_add_op(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams)
+-{
+- /* MOV */
+- if (strcmp(op,"mov") == 0)
+- {
+- if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) {
+- INSTR_1bReg_IMM32(0xb8,0,1);
+- }
+- else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) {
+- JITC_ADD_UCHAR(jitc, 0xc7);
+- JITC_MODRM(jitc, 0x00, 0x00, 0x05);
+- JITC_ADD_UINT(jitc, iparam[0].disp);
+- JITC_ADD_UINT(jitc, iparam[1].i);
+- }
+- else
+- modrm(jitc, 0x89, iparam);
+- return;
+- }
+-
+-#define IMUL_LIKE(_OP,_opcode,_digit)\
+- if (strcmp(op, _OP) == 0) { \
+- if (nbParams == 1) { \
+- imul_like_modrm_1param(jitc, _opcode, _digit, iparam); \
+- return; }}
+-
+-#define SHIFT_LIKE(_name,_op1,_op2,_digit) \
+- if (strcmp(op, _name) == 0) { \
+- if (iparam[1].id == PARAM_INT) { \
+- if (iparam[1].i == 1) \
+- imul_like_modrm_1param(jitc, _op1, _digit, iparam); \
+- else { \
+- imul_like_modrm_1param(jitc, _op2, _digit, iparam); \
+- JITC_ADD_UCHAR(jitc, iparam[1].i); \
+- } \
+- return; \
+- } \
+- }
+-
+-#define POP_LIKE(_OP,_opcode) \
+- if (strcmp(op, _OP) == 0) { \
+- if (iparam[0].id == PARAM_REG) { \
+- JITC_ADD_UCHAR(jitc, _opcode + iparam[0].reg); \
+- return; } }
+-
+- IMUL_LIKE("neg", 0xf7, 0x03);
+- IMUL_LIKE("imul", 0xf7, 0x05);
+- IMUL_LIKE("idiv", 0xf7, 0x07);
+-
+- POP_LIKE("pop", 0x58);
+- POP_LIKE("push", 0x50);
+-
+- SHIFT_LIKE("sal", 0xd1, 0xc1, 0x04);
+- SHIFT_LIKE("sar", 0xd1, 0xc1, 0x07);
+- SHIFT_LIKE("shl", 0xd1, 0xc1, 0x04);
+- SHIFT_LIKE("shr", 0xd1, 0xc1, 0x05);
+-
+- /* INC */
+- if (strcmp(op, "inc") == 0) {
+- if (iparam[0].id == PARAM_REG) {
+- JITC_ADD_UCHAR(jitc, 0x40 + iparam[0].reg);
+- return;
+- }
+- imul_like_modrm_1param(jitc, 0xff, 0x00, iparam);
+- return;
+- }
+-
+- /* DEC */
+- if (strcmp(op, "dec") == 0) {
+- if (iparam[0].id == PARAM_REG) {
+- JITC_ADD_UCHAR(jitc, 0x48 + iparam[0].reg);
+- return;
+- }
+- imul_like_modrm_1param(jitc, 0xff, 0x01, iparam);
+- return;
+- }
+-
+- if (strcmp(op, "call") == 0)
+- {
+- if (iparam[0].id == PARAM_LABEL) {
+- jitc_add_used_label(jitc,iparam[0].label,jitc->used+1);
+- JITC_CALL(jitc,0);
+- return;
+- }
+- if (iparam[0].id == PARAM_INT) {
+- JITC_CALL(jitc,iparam[0].i);
+- return;
+- }
+- if (iparam[0].id == PARAM_dispREG) {
+- JITC_ADD_UCHAR(jitc,0xff);
+- JITC_ADD_UCHAR(jitc,0xd0+iparam[0].reg);
+- return;
+- }
+- }
+-
+-#define MONOBYTE_INSTR(_OP,_opcode) \
+- if (strcmp(op, _OP) == 0) { \
+- JITC_ADD_UCHAR(jitc, _opcode); \
+- return; }
+-
+- MONOBYTE_INSTR("ret", 0xc3);
+- MONOBYTE_INSTR("leave", 0xc9);
+- MONOBYTE_INSTR("cdq", 0x99);
+-
+- /* JNE */
+- if (strcmp(op, "jne") == 0) {
+- if (iparam[0].id == PARAM_LABEL) {
+- JITC_JUMP_COND_LABEL(jitc,COND_NOT_EQUAL,iparam[0].label);
+- return;
+- }
+- if (iparam[0].id == PARAM_INT) {
+- JITC_JUMP_COND(jitc,COND_NOT_EQUAL,iparam[0].i);
+- return;
+- }
+- }
+-
+- /* JE */
+- if (strcmp(op, "je") == 0) {
+- if (iparam[0].id == PARAM_LABEL) {
+- JITC_JUMP_COND_LABEL(jitc,COND_EQUAL,iparam[0].label);
+- return;
+- }
+- if (iparam[0].id == PARAM_INT) {
+- JITC_JUMP_COND(jitc,COND_EQUAL,iparam[0].i);
+- return;
+- }
+- }
+-
+- /* ADD LIKE */
+- if (checkAddLike(jitc, op, iparam, nbParams)) return;
+-
+- /* BSWAP : 0F C8+rd */
+-
+- fprintf(stderr, "JITC_x86: Invalid Operation '%s'\n", op);
+- exit(1);
+-}
+-
+-/**
+- * Adds a new instruction to the just in time compiled function
+- */
+-void jitc_add(JitcX86Env *jitc, const char *_instr, ...)
+-{
+- char instr[256];
+- char *op;
+- char *sparam[16]; int nbParam=0; int i;
+- IParam iparam[16];
+- va_list ap;
+- strcpy(instr,_instr);
+-
+-#ifdef DISPLAY_GENCODE
+- printf("|");
+-#endif
+-
+- op = strtok(instr, " ,");
+- if (!op) return;
+-
+- /* decoupage en tokens */
+- while ((sparam[nbParam] = strtok(NULL, " ,")) != NULL) if (strlen(sparam[nbParam])>0) nbParam++;
+-
+- /* Reconnaissance des parametres */
+- va_start(ap, _instr);
+- for (i=0;i<nbParam;++i)
+- {
+- int r;
+- char regname[256];
+- iparam[i].id = PARAM_NONE;
+- if (strcmp(sparam[i], "$d") == 0) {
+- iparam[i].id = PARAM_INT;
+- iparam[i].i = va_arg(ap, int);
+- }
+- else if (strcmp(sparam[i], "$f") == 0) {
+- iparam[i].id = PARAM_FLOAT;
+- iparam[i].f = va_arg(ap, double);
+- }
+- else if (strcmp(sparam[i], "[$d]") == 0) {
+- iparam[i].id = PARAM_DISP32;
+- iparam[i].disp = va_arg(ap, int);
+- }
+- else if (strcmp(sparam[i], "$s") == 0) {
+- iparam[i].id = PARAM_LABEL;
+- strcpy(iparam[i].label, va_arg(ap, char*));
+- }
+- else
+- for (r=0;RegsName[r].name;r++) {
+- if (strcmp(sparam[i], RegsName[r].name) == 0) {
+- iparam[i].id = PARAM_REG;
+- iparam[i].reg = RegsName[r].reg;
+- }
+- else
+- {
+- if (sscanf(sparam[i], "$d[%3s]", regname) > 0) {
+- if (strcmp(regname, RegsName[r].name) == 0) {
+- iparam[i].id = PARAM_dispREG;
+- iparam[i].reg = RegsName[r].reg;
+- iparam[i].disp = va_arg(ap, int);
+- }
+- }
+- if (sscanf(sparam[i], "[%3s]", regname) > 0) {
+- if (strcmp(regname, RegsName[r].name) == 0) {
+- iparam[i].id = PARAM_dispREG;
+- iparam[i].reg = RegsName[r].reg;
+- iparam[i].disp = 0;
+- }
+- }
+- }
+- }
+- if (iparam[i].id == PARAM_NONE) {
+- fprintf(stderr, "JITC_x86: Unrecognized parameter '%s'\n", sparam[i]);
+- exit(1);
+- }
+- }
+- va_end(ap);
+-
+- jitc_add_op(jitc, op, &(iparam[0]), nbParam);
+-#ifdef DISPLAY_GENCODE
+- printf(" ;;; %s", op);
+- for (i=0;i<nbParam;++i)
+- {
+- if (iparam[i].id == PARAM_INT)
+- printf(" 0x%x", iparam[i].i);
+- else if (iparam[i].id == PARAM_DISP32)
+- printf(" [0x%x]", iparam[i].disp);
+- else if (iparam[i].id == PARAM_LABEL)
+- printf(" %s", iparam[i].label);
+- else
+- printf(" %s", sparam[i]);
+- }
+- printf("\n");
+-
+-#endif
+-}
+-
+-JitcX86Env *jitc_x86_env_new(int memory_size) {
+-
+- JitcX86Env *jitc = (JitcX86Env*)malloc(sizeof(JitcX86Env));
+- jitc->_memory = (unsigned char*)malloc(memory_size);
+- jitc->used = 0;
+- jitc->memory = (unsigned char*)((int)jitc->_memory + (32-((int)jitc->_memory)%32)%32);
+-
+- jitc->nbUsedLabel = 0;
+- jitc->nbKnownLabel = 0;
+-
+- jitc->usedLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL);
+- jitc->knownLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL);
+-
+- return jitc;
+-}
+-
+-void jitc_x86_delete(JitcX86Env *jitc) {
+-
+- free(jitc->usedLabel);
+- free(jitc->knownLabel);
+- free(jitc->_memory);
+- free(jitc);
+-}
+-
+-JitcFunc jitc_prepare_func(JitcX86Env *jitc) {
+-
+- JitcFunc ptr = 0;
+- jitc->used = (32 - jitc->used%32)%32;
+- ptr = (JitcFunc)&(jitc->memory[jitc->used]);
+-
+-#ifdef DISPLAY_GENCODE
+- printf("\n------------------------------------------\n");
+- printf("-- Function Intro --\n");
+- printf("------------------------------------------\n");
+-#endif
+-
+- /* save the state */
+- jitc_add(jitc,"push ebp");
+- jitc_add(jitc,"mov ebp, esp");
+- jitc_add(jitc,"sub esp, $d", 8);
+- JITC_PUSH_ALL(jitc);
+-#ifdef DISPLAY_GENCODE
+- printf("\n------------------------------------------\n");
+-#endif
+- return ptr;
+-}
+-
+-void jitc_validate_func(JitcX86Env *jitc) {
+-
+-#ifdef DISPLAY_GENCODE
+- printf("\n------------------------------------------\n");
+- printf("-- Function Outro --\n");
+- printf("------------------------------------------\n");
+-#endif
+- /* restore the state */
+- JITC_POP_ALL(jitc);
+- jitc_add(jitc, "leave");
+- jitc_add(jitc, "ret");
+- jitc_resolve_labels(jitc);
+-#ifdef DISPLAY_GENCODE
+- printf("\n------------------------------------------\n");
+-#endif
+-}
+-
+-void jitc_add_used_label(JitcX86Env *jitc, char *label, int where) {
+-
+- strncpy(jitc->usedLabel[jitc->nbUsedLabel].label, label, JITC_LABEL_SIZE);
+- jitc->usedLabel[jitc->nbUsedLabel].address = where;
+- jitc->nbUsedLabel++;
+-}
+-
+-void jitc_add_known_label(JitcX86Env *jitc, char *label, int where) {
+-
+-#ifdef DISPLAY_GENCODE
+- printf("%s:\n", label);
+-#endif
+- strncpy(jitc->knownLabel[jitc->nbKnownLabel].label, label, JITC_LABEL_SIZE);
+- jitc->knownLabel[jitc->nbKnownLabel].address = where;
+- jitc->nbKnownLabel++;
+-}
+-
+-void jitc_resolve_labels(JitcX86Env *jitc) {
+-
+- int i,j;
+- for (i=jitc->nbUsedLabel;i-->0;) {
+-
+- LabelAddr used = jitc->usedLabel[i];
+- for (j=jitc->nbKnownLabel;j-->0;) {
+-
+- LabelAddr known = jitc->knownLabel[j];
+- if (strcmp(known.label, used.label) == 0) {
+- int *offset = (int*)&(jitc->memory[used.address]);
+- *offset = known.address - used.address - 4; /* always using long offset */
+- break;
+- }
+- }
+- }
+- jitc->nbUsedLabel = jitc->nbKnownLabel = 0;
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/jitc_x86.h /src/jitc_x86.h
+--- /home/d4rk/goom2k4-0/src/jitc_x86.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/jitc_x86.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,214 +0,0 @@
+-/**
+- * Copyright (c)2004 Jean-Christophe Hoelt <jeko@ios-software.com>
+- */
+-
+-#include <stdlib.h>
+-#include <string.h>
+-
+-#define JITC_MAXLABEL 1024
+-#define JITC_LABEL_SIZE 64
+-
+-/**
+- * low level macros
+- */
+-
+- /* {{{ Registres Generaux */
+-#define EAX 0
+-#define ECX 1
+-#define EDX 2
+-#define EBX 3
+-#define ESP 4
+-#define EBP 5
+-#define ESI 6
+-#define EDI 7
+- /* }}} */
+- /* {{{ Registres MMX */
+-#define MM0 0
+-#define MM1 1
+-#define MM2 2
+-#define MM3 3
+-#define MM4 4
+-#define MM5 5
+-#define MM6 6
+-#define MM7 7
+- /* }}} */
+- /* {{{ Registres SSE*/
+-#define XMM0 0
+-#define XMM1 1
+-#define XMM2 2
+-#define XMM3 3
+-#define XMM4 4
+-#define XMM5 5
+-#define XMM6 6
+-#define XMM7 7
+- /* }}} */
+- /* {{{ Alias aux registres */
+-#define R0 0
+-#define R1 1
+-#define R2 2
+-#define R3 3
+-#define R4 4
+-#define R5 5
+-#define R6 6
+-#define R7 7
+- /* }}} */
+-
+- /* {{{ Conditions */
+-#define COND_OVERFLOW 0
+-#define COND_NO_OVERFLOW 1
+-#define COND_BELOW 2
+-#define COND_NOT_BELOW 3
+-#define COND_EQUAL 4
+-#define COND_ZERO 4
+-#define COND_NOT_EQUAL 5
+-#define COND_NOT_ZERO 5
+-#define COND_NOT_ABOVE 6
+-#define COND_ABOVE 7
+-#define COND_SIGN 8
+-#define COND_NOT_SIGN 9
+-#define COND_EVEN 10
+-#define COND_ODD 11
+-#define COND_LESS_THAN 12
+-#define COND_GREATER_EQUAL 13
+-#define COND_LESS_EQUAL 14
+-#define COND_GREATER_THAN 15
+- /* }}} */
+-
+-typedef int (*JitcFunc)(void);
+-
+-typedef struct _LABEL_ADDR {
+- char label[JITC_LABEL_SIZE];
+- int address;
+-} LabelAddr;
+-
+-typedef struct _JITC_X86_ENV {
+- unsigned char *_memory;
+- unsigned char *memory;
+- unsigned int used;
+-
+- int nbUsedLabel;
+- int nbKnownLabel;
+- LabelAddr *usedLabel;
+- LabelAddr *knownLabel;
+-} JitcX86Env;
+-
+-#define DISPLAY_GENCODE
+-/*#define DISPLAY_GENCODE_HEXA*/
+-
+-#ifdef DISPLAY_GENCODE_HEXA
+- #define JITC_ADD_UCHAR(jitc,op) printf(" 0x%02x", op) && (jitc->memory[jitc->used++]=op)
+-#else
+- #define JITC_ADD_UCHAR(jitc,op) (jitc->memory[jitc->used++]=op)
+-#endif
+-
+-#define JITC_ADD_USHORT(jitc,i) { JITC_ADD_UCHAR(jitc,i&0xff); JITC_ADD_UCHAR(jitc,(i>>8)&0xff); }
+-#define JITC_ADD_UINT(jitc,i) { \
+- JITC_ADD_UCHAR(jitc,i&0xff); \
+- JITC_ADD_UCHAR(jitc,(i>>8)&0xff); \
+- JITC_ADD_UCHAR(jitc,(i>>16)&0xff); \
+- JITC_ADD_UCHAR(jitc,(i>>24)&0xff); \
+-}
+-#define JITC_ADD_2UCHAR(jitc,op1,op2) {JITC_ADD_UCHAR(jitc,op1); JITC_ADD_UCHAR(jitc,op2);}
+-
+-#define JITC_MODRM(jitc,mod,reg,rm) { JITC_ADD_UCHAR(jitc,((int)mod<<6)|((int)reg<<3)|((int)rm)); }
+-
+-/* special values for R/M */
+-#define JITC_RM_DISP32 0x05
+-
+-#define JITC_MOD_pREG_REG 0x00
+-#define JITC_MOD_disp8REG_REG 0x01
+-#define JITC_MOD_disp32REG_REG 0x02
+-#define JITC_MOD_REG_REG 0x03
+-/* cf 24319101 p.27 */
+-
+-#define JITC_OP_REG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,0xc0+(src<<3)+dest); }
+-#define JITC_OP_REG_pREG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(dest<<3)+src); }
+-#define JITC_OP_pREG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(src<<3)+dest); }
+-
+-/**
+- * "high" level macro
+- */
+-
+-#define JITC_LOAD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0xb8+reg); JITC_ADD_UINT(jitc,(int)(imm32)); }
+-#define JITC_LOAD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x89,dest,src); }
+-
+-#define JITC_LOAD_REG_pREG(jitc,dest,src) { JITC_OP_REG_pREG(jitc,0x8b,dest,src); }
+-#define JITC_LOAD_pREG_REG(jitc,dest,src) { JITC_OP_pREG_REG(jitc,0x89,dest,src); }
+-
+-#define JITC_DEC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x48+reg); }
+-#define JITC_INC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x40+reg); }
+-
+-#define JITC_ADD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x01,dest,src); }
+-#define JITC_ADD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0x81);\
+- JITC_ADD_UCHAR (jitc,0xc0+reg);\
+- JITC_ADD_UINT (jitc,(int)imm32); }
+-
+-#define JITC_AND_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x21,dest,src); }
+-#define JITC_CMP_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x39,dest,src); }
+-#define JITC_CMP_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81,0xf8+reg); \
+- JITC_ADD_UINT (jitc,(int)imm32); }
+-
+-#define JITC_IDIV_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xf8+reg); }
+-#define JITC_IMUL_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xe8+reg); }
+-
+-/*#define JITC_SUB_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x29,dest,src); }
+-#define JITC_SUB_EAX_IMM32(jitc,imm32) { JITC_ADD_UCHAR (jitc,0x2d); JITC_ADD_UINT(jitc,(int)imm32); }
+-#define JITC_SUB_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81, 0xe8+reg);\
+- JITC_ADD_UINT (jitc,(int)imm32); }*/
+-#define JITC_SUB_REG_IMM8(jitc,reg,imm8) { JITC_ADD_2UCHAR (jitc,0x83, 0xe8+reg);\
+- JITC_ADD_UCHAR(jitc,imm8); }
+-
+-/* Floating points */
+-
+-#define JITC_FLD_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \
+- JITC_MODRM (jitc, 0x00, 0x00,JITC_RM_DISP32); \
+- JITC_ADD_UINT(jitc,(int)(address)); }
+-#define JITC_FLD_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xD9, 0xC0+reg); }
+-
+-#define JITC_FST_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \
+- JITC_MODRM (jitc, 0x00, 0x02,JITC_RM_DISP32); \
+- JITC_ADD_UINT(jitc,(int)(ADDRess)); }
+-#define JITC_FST_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD0+reg); }
+-
+-#define JITC_FSTP_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \
+- JITC_MODRM (jitc, 0x00, 0x03, JITC_RM_DISP32); \
+- JITC_ADD_UINT(jitc,(int)(address)); }
+-#define JITC_FSTP_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD8+reg); }
+-
+-#define JITC_FADD
+-
+-/* Jumps */
+-
+-#define JITC_ADD_LABEL(jitc,label) { jitc_add_known_label(jitc,label,jitc->used); }
+-
+-#define JITC_JUMP(jitc,offset) { JITC_ADD_UCHAR(jitc,0xe9); JITC_ADD_UINT(jitc,offset); }
+-#define JITC_JUMP_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_JUMP(jitc,0); }
+-#define JITC_JUMP_COND(jitc,cond,offset) { JITC_ADD_UCHAR(jitc,0x0f);\
+- JITC_ADD_UCHAR(jitc,0x80+cond);\
+- JITC_ADD_UINT(jitc,offset); }
+-#define JITC_JUMP_COND_LABEL(jitc,cond,label) { jitc_add_used_label(jitc,label,jitc->used+2); JITC_JUMP_COND(jitc,cond,0); }
+-#define JITC_CALL(jitc,function) { int __offset__ = (int)function - (int)(&jitc->memory[jitc->used+5]);\
+- JITC_ADD_UCHAR(jitc,0xe8); JITC_ADD_UINT(jitc,__offset__); }
+-/*#define JITC_CALL_pREG(jitc,reg) { JITC_ADD_UCHAR(jitc,0xff); JITC_ADD_UCHAR(jitc,0xd0+reg); }
+-#define JITC_CALL_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_CALL(jitc,0); }*/
+-
+-/* save all registers (except EAX,ESP,EBP) */
+-#define JITC_PUSH_ALL(jitc) { jitc_add(jitc,"push ecx"); jitc_add(jitc,"push edx"); jitc_add(jitc,"push ebx"); \
+- jitc_add(jitc,"push esi"); jitc_add(jitc,"push edi"); }
+-
+-/* restore all registers (except EAX,ESP,EBP) */
+-#define JITC_POP_ALL(jitc) { jitc_add(jitc,"pop edi"); jitc_add(jitc,"pop esi"); jitc_add(jitc,"pop ebx"); \
+- jitc_add(jitc,"pop edx"); jitc_add(jitc,"pop ecx"); }
+-
+-/* public methods */
+-JitcX86Env *jitc_x86_env_new(int memory_size);
+-JitcFunc jitc_prepare_func(JitcX86Env *jitc);
+-void jitc_add(JitcX86Env *jitc, const char *instr, ...);
+-void jitc_validate_func(JitcX86Env *jitc);
+-void jitc_x86_delete(JitcX86Env *jitc);
+-
+-
+-/* private methods */
+-void jitc_add_used_label(JitcX86Env *jitc, char *label, int where);
+-void jitc_add_known_label(JitcX86Env *jitc, char *label, int where);
+-void jitc_resolve_labels(JitcX86Env *jitc);
+diff -Naur /home/d4rk/goom2k4-0/src/lines.c /src/lines.c
+--- /home/d4rk/goom2k4-0/src/lines.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/lines.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,238 +0,0 @@
+-/*
+- * lines.c
+- */
+-
+-#include "lines.h"
+-#include <math.h>
+-#include <stdlib.h>
+-#include <stdio.h>
+-#include "goom_tools.h"
+-#include "drawmethods.h"
+-#include "goom_plugin_info.h"
+-
+-static inline unsigned char lighten (unsigned char value, float power)
+-{
+- int val = value;
+- float t = (float) val * log10(power) / 2.0;
+-
+- if (t > 0) {
+- val = (int) t; /* (32.0f * log (t)); */
+- if (val > 255)
+- val = 255;
+- if (val < 0)
+- val = 0;
+- return val;
+- }
+- else {
+- return 0;
+- }
+-}
+-
+-static void lightencolor (guint32 *col, float power)
+-{
+- unsigned char *color;
+-
+- color = (unsigned char *) col;
+- *color = lighten (*color, power);
+- color++;
+- *color = lighten (*color, power);
+- color++;
+- *color = lighten (*color, power);
+- color++;
+- *color = lighten (*color, power);
+-}
+-
+-
+-
+-static void
+-genline (int id, float param, GMUnitPointer * l, int rx, int ry)
+-{
+- int i;
+-
+- switch (id) {
+- case GML_HLINE:
+- for (i = 0; i < 512; i++) {
+- l[i].x = ((float) i * rx) / 512.0f;
+- l[i].y = param;
+- l[i].angle = M_PI / 2.0f;
+- }
+- return;
+- case GML_VLINE:
+- for (i = 0; i < 512; i++) {
+- l[i].y = ((float) i * ry) / 512.0f;
+- l[i].x = param;
+- l[i].angle = 0.0f;
+- }
+- return;
+- case GML_CIRCLE:
+- for (i = 0; i < 512; i++) {
+- float cosa, sina;
+-
+- l[i].angle = 2.0f * M_PI * (float) i / 512.0f;
+- cosa = param * cos (l[i].angle);
+- sina = param * sin (l[i].angle);
+- l[i].x = ((float) rx / 2.0f) + cosa;
+- l[i].y = (float) ry / 2.0f + sina;
+- }
+- return;
+- }
+-}
+-
+-static guint32 getcouleur (int mode)
+-{
+- switch (mode) {
+- case GML_RED:
+- return (230 << (ROUGE * 8)) | (120 << (VERT * 8)) | (18 << (BLEU * 8));
+- case GML_ORANGE_J:
+- return (120 << (VERT * 8)) | (252 << (ROUGE * 8)) | (18 << (BLEU * 8));
+- case GML_ORANGE_V:
+- return (160 << (VERT * 8)) | (236 << (ROUGE * 8)) | (40 << (BLEU * 8));
+- case GML_BLEUBLANC:
+- return (40 << (BLEU * 8)) | (220 << (ROUGE * 8)) | (140 << (VERT * 8));
+- case GML_VERT:
+- return (200 << (VERT * 8)) | (80 << (ROUGE * 8)) | (18 << (BLEU * 8));
+- case GML_BLEU:
+- return (250 << (BLEU * 8)) | (30 << (VERT * 8)) | (80 << (ROUGE * 8));
+- case GML_BLACK:
+- return (16 << (BLEU * 8)) | (16 << (VERT * 8)) | (16 << (ROUGE * 8));
+- }
+- return 0;
+-}
+-
+-void
+-goom_lines_set_res (GMLine * gml, int rx, int ry)
+-{
+- if (gml != NULL) {
+- gml->screenX = rx;
+- gml->screenY = ry;
+-
+- genline (gml->IDdest, gml->param, gml->points2, rx, ry);
+- }
+-}
+-
+-
+-static void
+-goom_lines_move (GMLine * l)
+-{
+- int i;
+- unsigned char *c1, *c2;
+-
+- for (i = 0; i < 512; i++) {
+- l->points[i].x = (l->points2[i].x + 39.0f * l->points[i].x) / 40.0f;
+- l->points[i].y = (l->points2[i].y + 39.0f * l->points[i].y) / 40.0f;
+- l->points[i].angle =
+- (l->points2[i].angle + 39.0f * l->points[i].angle) / 40.0f;
+- }
+-
+- c1 = (unsigned char *) &l->color;
+- c2 = (unsigned char *) &l->color2;
+- for (i = 0; i < 4; i++) {
+- int cc1, cc2;
+-
+- cc1 = *c1;
+- cc2 = *c2;
+- *c1 = (unsigned char) ((cc1 * 63 + cc2) >> 6);
+- ++c1;
+- ++c2;
+- }
+-
+- l->power += l->powinc;
+- if (l->power < 1.1f) {
+- l->power = 1.1f;
+- l->powinc = (float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f;
+- }
+- if (l->power > 17.5f) {
+- l->power = 17.5f;
+- l->powinc = -(float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f;
+- }
+-
+- l->amplitude = (99.0f * l->amplitude + l->amplitudeF) / 100.0f;
+-}
+-
+-void
+-goom_lines_switch_to (GMLine * gml, int IDdest,
+- float param, float amplitude, int col)
+-{
+- genline (IDdest, param, gml->points2, gml->screenX, gml->screenY);
+- gml->IDdest = IDdest;
+- gml->param = param;
+- gml->amplitudeF = amplitude;
+- gml->color2 = getcouleur (col);
+-}
+-
+-GMLine *
+-goom_lines_init (PluginInfo *goomInfo, int rx, int ry,
+- int IDsrc, float paramS, int coulS,
+- int IDdest, float paramD, int coulD)
+-{
+- GMLine *l = (GMLine *) malloc (sizeof (GMLine));
+-
+- l->goomInfo = goomInfo;
+-
+- l->points = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer));
+- l->points2 = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer));
+- l->nbPoints = 512;
+-
+- l->IDdest = IDdest;
+- l->param = paramD;
+-
+- l->amplitude = l->amplitudeF = 1.0f;
+-
+- genline (IDsrc, paramS, l->points, rx, ry);
+- genline (IDdest, paramD, l->points2, rx, ry);
+-
+- l->color = getcouleur (coulS);
+- l->color2 = getcouleur (coulD);
+-
+- l->screenX = rx;
+- l->screenY = ry;
+-
+- l->power = 0.0f;
+- l->powinc = 0.01f;
+-
+- goom_lines_switch_to (l, IDdest, paramD, 1.0f, coulD);
+-
+- return l;
+-}
+-
+-void
+-goom_lines_free (GMLine ** l)
+-{
+- free ((*l)->points);
+- free (*l);
+- l = NULL;
+-}
+-
+-void goom_lines_draw (PluginInfo *plug, GMLine * line, gint16 data[512], Pixel *p)
+-{
+- if (line != NULL) {
+- int i, x1, y1;
+- guint32 color = line->color;
+- GMUnitPointer *pt = &(line->points[0]);
+-
+- float cosa = cos (pt->angle) / 1000.0f;
+- float sina = sin (pt->angle) / 1000.0f;
+-
+- lightencolor (&color, line->power);
+-
+- x1 = (int) (pt->x + cosa * line->amplitude * data[0]);
+- y1 = (int) (pt->y + sina * line->amplitude * data[0]);
+-
+- for (i = 1; i < 512; i++) {
+- int x2, y2;
+- GMUnitPointer *pt = &(line->points[i]);
+-
+- float cosa = cos (pt->angle) / 1000.0f;
+- float sina = sin (pt->angle) / 1000.0f;
+-
+- x2 = (int) (pt->x + cosa * line->amplitude * data[i]);
+- y2 = (int) (pt->y + sina * line->amplitude * data[i]);
+-
+- plug->methods.draw_line (p, x1, y1, x2, y2, color, line->screenX, line->screenY);
+-
+- x1 = x2;
+- y1 = y2;
+- }
+- goom_lines_move (line);
+- }
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/lines.h /src/lines.h
+--- /home/d4rk/goom2k4-0/src/lines.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/lines.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,81 +0,0 @@
+-#ifndef _LINES_H
+-#define _LINES_H
+-
+-/*
+- * lines.h
+- * Goom
+- * Copyright (c) 2000-2003 iOS-software. All rights reserved.
+- */
+-
+-#include "goom_typedefs.h"
+-#include "goom_graphic.h"
+-#include "goom_config.h"
+-
+-struct _GMUNITPOINTER
+-{
+- float x;
+- float y;
+- float angle;
+-};
+-
+-/* tableau de points */
+-struct _GMLINE
+-{
+-
+- GMUnitPointer *points;
+- GMUnitPointer *points2;
+- int IDdest;
+- float param;
+- float amplitudeF;
+- float amplitude;
+-
+- int nbPoints;
+- guint32 color; /* pour l'instant je stocke la couleur a terme, on stockera le mode couleur et l'on animera */
+- guint32 color2;
+-
+- int screenX;
+- int screenY;
+-
+- float power;
+- float powinc;
+-
+- PluginInfo *goomInfo;
+-};
+-
+-/* les ID possibles */
+-
+-#define GML_CIRCLE 0
+-/* (param = radius) */
+-
+-#define GML_HLINE 1
+-/* (param = y) */
+-
+-#define GML_VLINE 2
+-/* (param = x) */
+-
+-/* les modes couleur possible (si tu mets un autre c'est noir) */
+-
+-#define GML_BLEUBLANC 0
+-#define GML_RED 1
+-#define GML_ORANGE_V 2
+-#define GML_ORANGE_J 3
+-#define GML_VERT 4
+-#define GML_BLEU 5
+-#define GML_BLACK 6
+-
+-/* construit un effet de line (une ligne horitontale pour commencer) */
+-GMLine *goom_lines_init (PluginInfo *goomInfo, int rx, int ry,
+- int IDsrc, float paramS, int modeCoulSrc,
+- int IDdest, float paramD, int modeCoulDest);
+-
+-void goom_lines_switch_to (GMLine * gml, int IDdest, float param,
+- float amplitude,
+- int modeCoul);
+-
+-void goom_lines_set_res (GMLine * gml, int rx, int ry);
+-
+-void goom_lines_free (GMLine ** gml);
+-
+-void goom_lines_draw (PluginInfo *plugInfo, GMLine * gml, gint16 data[512], Pixel *p);
+-
+-#endif /* _LINES_H */
+diff -Naur /home/d4rk/goom2k4-0/src/Makefile.am /src/Makefile.am
+--- /home/d4rk/goom2k4-0/src/Makefile.am 2005-02-07 06:46:41.000000000 -0700
++++ /src/Makefile.am 1969-12-31 17:00:00.000000000 -0700
+@@ -1,34 +0,0 @@
+-# libgoom2
+-
+-if HAVE_MMX
+-MMX_FILES=mmx.c xmmx.c
+-else
+-MMX_FILES=
+-endif
+-
+-if HAVE_PPC
+-PPC_FILES=ppc_zoom_ultimate.s ppc_drawings.s
+-else
+-PPC_FILES=
+-endif
+-
+-goom2_lib_LTLIBRARIES = libgoom2.la
+-goom2_libdir = $(libdir)
+-
+-goom2_library_includedir=$(includedir)/goom
+-goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h
+-libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*"
+-libgoom2_la_SOURCES = \
+- goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \
+- goom_tools.c $(MMX_FILES) $(PPC_FILES) \
+- config_param.c convolve_fx.c filters.c \
+- flying_stars_fx.c gfontlib.c gfontrle.c \
+- goom_core.c graphic.c ifs.c lines.c \
+- mathtools.c sound_tester.c surf3d.c \
+- tentacle3d.c plugin_info.c \
+- v3d.c drawmethods.c \
+- cpu_info.c
+-
+-AM_YFLAGS=-d
+-
+-noinst_HEADERS = mmx.h
+diff -Naur /home/d4rk/goom2k4-0/src/Makefile.in /src/Makefile.in
+--- /home/d4rk/goom2k4-0/src/Makefile.in 2005-02-07 06:49:26.000000000 -0700
++++ /src/Makefile.in 1969-12-31 17:00:00.000000000 -0700
+@@ -1,621 +0,0 @@
+-# Makefile.in generated by automake 1.9.4 from Makefile.am.
+-# @configure_input@
+-
+-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+-# 2003, 2004 Free Software Foundation, Inc.
+-# This Makefile.in is free software; the Free Software Foundation
+-# gives unlimited permission to copy and/or distribute it,
+-# with or without modifications, as long as this notice is preserved.
+-
+-# This program is distributed in the hope that it will be useful,
+-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+-# PARTICULAR PURPOSE.
+-
+-@SET_MAKE@
+-
+-# libgoom2
+-
+-
+-SOURCES = $(libgoom2_la_SOURCES)
+-
+-srcdir = @srcdir@
+-top_srcdir = @top_srcdir@
+-VPATH = @srcdir@
+-pkgdatadir = $(datadir)/@PACKAGE@
+-pkglibdir = $(libdir)/@PACKAGE@
+-pkgincludedir = $(includedir)/@PACKAGE@
+-top_builddir = ..
+-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+-INSTALL = @INSTALL@
+-install_sh_DATA = $(install_sh) -c -m 644
+-install_sh_PROGRAM = $(install_sh) -c
+-install_sh_SCRIPT = $(install_sh) -c
+-INSTALL_HEADER = $(INSTALL_DATA)
+-transform = $(program_transform_name)
+-NORMAL_INSTALL = :
+-PRE_INSTALL = :
+-POST_INSTALL = :
+-NORMAL_UNINSTALL = :
+-PRE_UNINSTALL = :
+-POST_UNINSTALL = :
+-build_triplet = @build@
+-host_triplet = @host@
+-subdir = src
+-DIST_COMMON = $(goom2_library_include_HEADERS) $(noinst_HEADERS) \
+- $(srcdir)/Makefile.am $(srcdir)/Makefile.in TODO goomsl_lex.c \
+- goomsl_yacc.c goomsl_yacc.h
+-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+-am__aclocal_m4_deps = $(top_srcdir)/m4/sdl.m4 $(top_srcdir)/m4/xmms.m4 \
+- $(top_srcdir)/configure.in
+-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+- $(ACLOCAL_M4)
+-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+-CONFIG_CLEAN_FILES =
+-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+-am__vpath_adj = case $$p in \
+- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+- *) f=$$p;; \
+- esac;
+-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+-am__installdirs = "$(DESTDIR)$(goom2_libdir)" \
+- "$(DESTDIR)$(goom2_library_includedir)"
+-goom2_libLTLIBRARIES_INSTALL = $(INSTALL)
+-LTLIBRARIES = $(goom2_lib_LTLIBRARIES)
+-libgoom2_la_LIBADD =
+-am__libgoom2_la_SOURCES_DIST = goomsl_yacc.y goomsl_lex.l goomsl.c \
+- goomsl_hash.c goomsl_heap.c goom_tools.c mmx.c xmmx.c \
+- ppc_zoom_ultimate.s ppc_drawings.s config_param.c \
+- convolve_fx.c filters.c flying_stars_fx.c gfontlib.c \
+- gfontrle.c goom_core.c graphic.c ifs.c lines.c mathtools.c \
+- sound_tester.c surf3d.c tentacle3d.c plugin_info.c v3d.c \
+- drawmethods.c cpu_info.c
+-@HAVE_MMX_TRUE@am__objects_1 = mmx.lo xmmx.lo
+-@HAVE_PPC_TRUE@am__objects_2 = ppc_zoom_ultimate.lo ppc_drawings.lo
+-am_libgoom2_la_OBJECTS = goomsl_yacc.lo goomsl_lex.lo goomsl.lo \
+- goomsl_hash.lo goomsl_heap.lo goom_tools.lo $(am__objects_1) \
+- $(am__objects_2) config_param.lo convolve_fx.lo filters.lo \
+- flying_stars_fx.lo gfontlib.lo gfontrle.lo goom_core.lo \
+- graphic.lo ifs.lo lines.lo mathtools.lo sound_tester.lo \
+- surf3d.lo tentacle3d.lo plugin_info.lo v3d.lo drawmethods.lo \
+- cpu_info.lo
+-libgoom2_la_OBJECTS = $(am_libgoom2_la_OBJECTS)
+-DEFAULT_INCLUDES = -I. -I$(srcdir)
+-depcomp = $(SHELL) $(top_srcdir)/depcomp
+-am__depfiles_maybe = depfiles
+-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+- $(AM_CFLAGS) $(CFLAGS)
+-CCLD = $(CC)
+-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+- $(AM_LDFLAGS) $(LDFLAGS) -o $@
+-LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS)
+-LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS)
+-CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)
+-LTCCASCOMPILE = $(LIBTOOL) --mode=compile $(CCAS) $(AM_CCASFLAGS) \
+- $(CCASFLAGS)
+-YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
+-LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \
+- $(AM_YFLAGS)
+-SOURCES = $(libgoom2_la_SOURCES)
+-DIST_SOURCES = $(am__libgoom2_la_SOURCES_DIST)
+-goom2_library_includeHEADERS_INSTALL = $(INSTALL_HEADER)
+-HEADERS = $(goom2_library_include_HEADERS) $(noinst_HEADERS)
+-ETAGS = etags
+-CTAGS = ctags
+-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+-ACLOCAL = @ACLOCAL@
+-AMDEP_FALSE = @AMDEP_FALSE@
+-AMDEP_TRUE = @AMDEP_TRUE@
+-AMTAR = @AMTAR@
+-AR = @AR@
+-AUTOCONF = @AUTOCONF@
+-AUTOHEADER = @AUTOHEADER@
+-AUTOMAKE = @AUTOMAKE@
+-AWK = @AWK@
+-CC = @CC@
+-CCAS = @CCAS@
+-CCASFLAGS = @CCASFLAGS@
+-CCDEPMODE = @CCDEPMODE@
+-CFLAGS = @CFLAGS@
+-CPP = @CPP@
+-CPPFLAGS = @CPPFLAGS@
+-CXX = @CXX@
+-CXXCPP = @CXXCPP@
+-CXXDEPMODE = @CXXDEPMODE@
+-CXXFLAGS = @CXXFLAGS@
+-CYGPATH_W = @CYGPATH_W@
+-DEFS = @DEFS@
+-DEPDIR = @DEPDIR@
+-ECHO = @ECHO@
+-ECHO_C = @ECHO_C@
+-ECHO_N = @ECHO_N@
+-ECHO_T = @ECHO_T@
+-EGREP = @EGREP@
+-EXEEXT = @EXEEXT@
+-F77 = @F77@
+-FFLAGS = @FFLAGS@
+-HAVE_MMX_FALSE = @HAVE_MMX_FALSE@
+-HAVE_MMX_TRUE = @HAVE_MMX_TRUE@
+-HAVE_PPC_FALSE = @HAVE_PPC_FALSE@
+-HAVE_PPC_TRUE = @HAVE_PPC_TRUE@
+-HAVE_SDL_FALSE = @HAVE_SDL_FALSE@
+-HAVE_SDL_TRUE = @HAVE_SDL_TRUE@
+-HAVE_XMMS_FALSE = @HAVE_XMMS_FALSE@
+-HAVE_XMMS_TRUE = @HAVE_XMMS_TRUE@
+-INSTALL_DATA = @INSTALL_DATA@
+-INSTALL_PROGRAM = @INSTALL_PROGRAM@
+-INSTALL_SCRIPT = @INSTALL_SCRIPT@
+-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+-LDFLAGS = @LDFLAGS@
+-LEX = @LEX@
+-LEXLIB = @LEXLIB@
+-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+-LIBOBJS = @LIBOBJS@
+-LIBS = @LIBS@
+-LIBTOOL = @LIBTOOL@
+-LN_S = @LN_S@
+-LTLIBOBJS = @LTLIBOBJS@
+-MACFOLDER = @MACFOLDER@
+-MACTARGET_FALSE = @MACTARGET_FALSE@
+-MACTARGET_TRUE = @MACTARGET_TRUE@
+-MAKEINFO = @MAKEINFO@
+-OBJEXT = @OBJEXT@
+-PACKAGE = @PACKAGE@
+-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+-PACKAGE_NAME = @PACKAGE_NAME@
+-PACKAGE_STRING = @PACKAGE_STRING@
+-PACKAGE_TARNAME = @PACKAGE_TARNAME@
+-PACKAGE_VERSION = @PACKAGE_VERSION@
+-PATH_SEPARATOR = @PATH_SEPARATOR@
+-PTHREAD_LIBS = @PTHREAD_LIBS@
+-RANLIB = @RANLIB@
+-SDL_CFLAGS = @SDL_CFLAGS@
+-SDL_CONFIG = @SDL_CONFIG@
+-SDL_LIBS = @SDL_LIBS@
+-SET_MAKE = @SET_MAKE@
+-SHELL = @SHELL@
+-STRIP = @STRIP@
+-VERSION = @VERSION@
+-XMMS_CFLAGS = @XMMS_CFLAGS@
+-XMMS_CONFIG = @XMMS_CONFIG@
+-XMMS_DATA_DIR = @XMMS_DATA_DIR@
+-XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@
+-XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@
+-XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@
+-XMMS_LIBS = @XMMS_LIBS@
+-XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@
+-XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@
+-XMMS_VERSION = @XMMS_VERSION@
+-XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@
+-YACC = @YACC@
+-ac_ct_AR = @ac_ct_AR@
+-ac_ct_CC = @ac_ct_CC@
+-ac_ct_CXX = @ac_ct_CXX@
+-ac_ct_F77 = @ac_ct_F77@
+-ac_ct_RANLIB = @ac_ct_RANLIB@
+-ac_ct_STRIP = @ac_ct_STRIP@
+-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+-am__include = @am__include@
+-am__leading_dot = @am__leading_dot@
+-am__quote = @am__quote@
+-am__tar = @am__tar@
+-am__untar = @am__untar@
+-bindir = @bindir@
+-build = @build@
+-build_alias = @build_alias@
+-build_cpu = @build_cpu@
+-build_os = @build_os@
+-build_vendor = @build_vendor@
+-datadir = @datadir@
+-exec_prefix = @exec_prefix@
+-host = @host@
+-host_alias = @host_alias@
+-host_cpu = @host_cpu@
+-host_os = @host_os@
+-host_vendor = @host_vendor@
+-includedir = @includedir@
+-infodir = @infodir@
+-install_sh = @install_sh@
+-libdir = @libdir@
+-libexecdir = @libexecdir@
+-localstatedir = @localstatedir@
+-mandir = @mandir@
+-mkdir_p = @mkdir_p@
+-oldincludedir = @oldincludedir@
+-prefix = @prefix@
+-program_transform_name = @program_transform_name@
+-sbindir = @sbindir@
+-sharedstatedir = @sharedstatedir@
+-sysconfdir = @sysconfdir@
+-target_alias = @target_alias@
+-@HAVE_MMX_FALSE@MMX_FILES =
+-@HAVE_MMX_TRUE@MMX_FILES = mmx.c xmmx.c
+-@HAVE_PPC_FALSE@PPC_FILES =
+-@HAVE_PPC_TRUE@PPC_FILES = ppc_zoom_ultimate.s ppc_drawings.s
+-goom2_lib_LTLIBRARIES = libgoom2.la
+-goom2_libdir = $(libdir)
+-goom2_library_includedir = $(includedir)/goom
+-goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h
+-libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*"
+-libgoom2_la_SOURCES = \
+- goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \
+- goom_tools.c $(MMX_FILES) $(PPC_FILES) \
+- config_param.c convolve_fx.c filters.c \
+- flying_stars_fx.c gfontlib.c gfontrle.c \
+- goom_core.c graphic.c ifs.c lines.c \
+- mathtools.c sound_tester.c surf3d.c \
+- tentacle3d.c plugin_info.c \
+- v3d.c drawmethods.c \
+- cpu_info.c
+-
+-AM_YFLAGS = -d
+-noinst_HEADERS = mmx.h
+-all: all-am
+-
+-.SUFFIXES:
+-.SUFFIXES: .c .l .lo .o .obj .s .y
+-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+- @for dep in $?; do \
+- case '$(am__configure_deps)' in \
+- *$$dep*) \
+- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+- && exit 0; \
+- exit 1;; \
+- esac; \
+- done; \
+- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
+- cd $(top_srcdir) && \
+- $(AUTOMAKE) --foreign src/Makefile
+-.PRECIOUS: Makefile
+-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+- @case '$?' in \
+- *config.status*) \
+- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+- *) \
+- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+- esac;
+-
+-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+-
+-$(top_srcdir)/configure: $(am__configure_deps)
+- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+-install-goom2_libLTLIBRARIES: $(goom2_lib_LTLIBRARIES)
+- @$(NORMAL_INSTALL)
+- test -z "$(goom2_libdir)" || $(mkdir_p) "$(DESTDIR)$(goom2_libdir)"
+- @list='$(goom2_lib_LTLIBRARIES)'; for p in $$list; do \
+- if test -f $$p; then \
+- f=$(am__strip_dir) \
+- echo " $(LIBTOOL) --mode=install $(goom2_libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(goom2_libdir)/$$f'"; \
+- $(LIBTOOL) --mode=install $(goom2_libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(goom2_libdir)/$$f"; \
+- else :; fi; \
+- done
+-
+-uninstall-goom2_libLTLIBRARIES:
+- @$(NORMAL_UNINSTALL)
+- @set -x; list='$(goom2_lib_LTLIBRARIES)'; for p in $$list; do \
+- p=$(am__strip_dir) \
+- echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(goom2_libdir)/$$p'"; \
+- $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(goom2_libdir)/$$p"; \
+- done
+-
+-clean-goom2_libLTLIBRARIES:
+- -test -z "$(goom2_lib_LTLIBRARIES)" || rm -f $(goom2_lib_LTLIBRARIES)
+- @list='$(goom2_lib_LTLIBRARIES)'; for p in $$list; do \
+- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+- test "$$dir" != "$$p" || dir=.; \
+- echo "rm -f \"$${dir}/so_locations\""; \
+- rm -f "$${dir}/so_locations"; \
+- done
+-goomsl_yacc.h: goomsl_yacc.c
+- @if test ! -f $@; then \
+- rm -f goomsl_yacc.c; \
+- $(MAKE) goomsl_yacc.c; \
+- else :; fi
+-libgoom2.la: $(libgoom2_la_OBJECTS) $(libgoom2_la_DEPENDENCIES)
+- $(LINK) -rpath $(goom2_libdir) $(libgoom2_la_LDFLAGS) $(libgoom2_la_OBJECTS) $(libgoom2_la_LIBADD) $(LIBS)
+-
+-mostlyclean-compile:
+- -rm -f *.$(OBJEXT)
+-
+-distclean-compile:
+- -rm -f *.tab.c
+-
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config_param.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convolve_fx.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu_info.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drawmethods.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filters.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flying_stars_fx.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfontlib.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfontrle.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goom_core.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goom_tools.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_hash.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_heap.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_lex.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_yacc.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphic.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ifs.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lines.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathtools.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmx.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_info.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound_tester.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/surf3d.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tentacle3d.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v3d.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmmx.Plo@am__quote@
+-
+-.c.o:
+-@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+-@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+-
+-.c.obj:
+-@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+-@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+-
+-.c.lo:
+-@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+-@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+-
+-.l.c:
+- $(LEXCOMPILE) $<
+- sed '/^#/ s|$(LEX_OUTPUT_ROOT)\.c|$@|' $(LEX_OUTPUT_ROOT).c >$@
+- rm -f $(LEX_OUTPUT_ROOT).c
+-
+-.s.o:
+- $(CCASCOMPILE) -c $<
+-
+-.s.obj:
+- $(CCASCOMPILE) -c `$(CYGPATH_W) '$<'`
+-
+-.s.lo:
+- $(LTCCASCOMPILE) -c -o $@ $<
+-
+-.y.c:
+- $(YACCCOMPILE) $<
+- if test -f y.tab.h; then \
+- to=`echo "$*_H" | sed \
+- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
+- -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \
+- sed -e "/^#/!b" -e "s/Y_TAB_H/$$to/g" -e "s|y\.tab\.h|$*.h|" \
+- y.tab.h >$*.ht; \
+- rm -f y.tab.h; \
+- if cmp -s $*.ht $*.h; then \
+- rm -f $*.ht ;\
+- else \
+- mv $*.ht $*.h; \
+- fi; \
+- fi
+- if test -f y.output; then \
+- mv y.output $*.output; \
+- fi
+- sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@
+- rm -f y.tab.c
+-
+-mostlyclean-libtool:
+- -rm -f *.lo
+-
+-clean-libtool:
+- -rm -rf .libs _libs
+-
+-distclean-libtool:
+- -rm -f libtool
+-uninstall-info-am:
+-install-goom2_library_includeHEADERS: $(goom2_library_include_HEADERS)
+- @$(NORMAL_INSTALL)
+- test -z "$(goom2_library_includedir)" || $(mkdir_p) "$(DESTDIR)$(goom2_library_includedir)"
+- @list='$(goom2_library_include_HEADERS)'; for p in $$list; do \
+- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+- f=$(am__strip_dir) \
+- echo " $(goom2_library_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(goom2_library_includedir)/$$f'"; \
+- $(goom2_library_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(goom2_library_includedir)/$$f"; \
+- done
+-
+-uninstall-goom2_library_includeHEADERS:
+- @$(NORMAL_UNINSTALL)
+- @list='$(goom2_library_include_HEADERS)'; for p in $$list; do \
+- f=$(am__strip_dir) \
+- echo " rm -f '$(DESTDIR)$(goom2_library_includedir)/$$f'"; \
+- rm -f "$(DESTDIR)$(goom2_library_includedir)/$$f"; \
+- done
+-
+-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+- unique=`for i in $$list; do \
+- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+- done | \
+- $(AWK) ' { files[$$0] = 1; } \
+- END { for (i in files) print i; }'`; \
+- mkid -fID $$unique
+-tags: TAGS
+-
+-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+- $(TAGS_FILES) $(LISP)
+- tags=; \
+- here=`pwd`; \
+- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+- unique=`for i in $$list; do \
+- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+- done | \
+- $(AWK) ' { files[$$0] = 1; } \
+- END { for (i in files) print i; }'`; \
+- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+- test -n "$$unique" || unique=$$empty_fix; \
+- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+- $$tags $$unique; \
+- fi
+-ctags: CTAGS
+-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+- $(TAGS_FILES) $(LISP)
+- tags=; \
+- here=`pwd`; \
+- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+- unique=`for i in $$list; do \
+- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+- done | \
+- $(AWK) ' { files[$$0] = 1; } \
+- END { for (i in files) print i; }'`; \
+- test -z "$(CTAGS_ARGS)$$tags$$unique" \
+- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+- $$tags $$unique
+-
+-GTAGS:
+- here=`$(am__cd) $(top_builddir) && pwd` \
+- && cd $(top_srcdir) \
+- && gtags -i $(GTAGS_ARGS) $$here
+-
+-distclean-tags:
+- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+-
+-distdir: $(DISTFILES)
+- @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+- list='$(DISTFILES)'; for file in $$list; do \
+- case $$file in \
+- $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+- $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+- esac; \
+- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+- if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+- dir="/$$dir"; \
+- $(mkdir_p) "$(distdir)$$dir"; \
+- else \
+- dir=''; \
+- fi; \
+- if test -d $$d/$$file; then \
+- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+- fi; \
+- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+- else \
+- test -f $(distdir)/$$file \
+- || cp -p $$d/$$file $(distdir)/$$file \
+- || exit 1; \
+- fi; \
+- done
+-check-am: all-am
+-check: check-am
+-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+-installdirs:
+- for dir in "$(DESTDIR)$(goom2_libdir)" "$(DESTDIR)$(goom2_library_includedir)"; do \
+- test -z "$$dir" || $(mkdir_p) "$$dir"; \
+- done
+-install: install-am
+-install-exec: install-exec-am
+-install-data: install-data-am
+-uninstall: uninstall-am
+-
+-install-am: all-am
+- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+-
+-installcheck: installcheck-am
+-install-strip:
+- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+- `test -z '$(STRIP)' || \
+- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+-mostlyclean-generic:
+-
+-clean-generic:
+-
+-distclean-generic:
+- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+-
+-maintainer-clean-generic:
+- @echo "This command is intended for maintainers to use"
+- @echo "it deletes files that may require special tools to rebuild."
+- -rm -f goomsl_lex.c
+- -rm -f goomsl_yacc.c
+- -rm -f goomsl_yacc.h
+-clean: clean-am
+-
+-clean-am: clean-generic clean-goom2_libLTLIBRARIES clean-libtool \
+- mostlyclean-am
+-
+-distclean: distclean-am
+- -rm -rf ./$(DEPDIR)
+- -rm -f Makefile
+-distclean-am: clean-am distclean-compile distclean-generic \
+- distclean-libtool distclean-tags
+-
+-dvi: dvi-am
+-
+-dvi-am:
+-
+-html: html-am
+-
+-info: info-am
+-
+-info-am:
+-
+-install-data-am: install-goom2_libLTLIBRARIES \
+- install-goom2_library_includeHEADERS
+-
+-install-exec-am:
+-
+-install-info: install-info-am
+-
+-install-man:
+-
+-installcheck-am:
+-
+-maintainer-clean: maintainer-clean-am
+- -rm -rf ./$(DEPDIR)
+- -rm -f Makefile
+-maintainer-clean-am: distclean-am maintainer-clean-generic
+-
+-mostlyclean: mostlyclean-am
+-
+-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+- mostlyclean-libtool
+-
+-pdf: pdf-am
+-
+-pdf-am:
+-
+-ps: ps-am
+-
+-ps-am:
+-
+-uninstall-am: uninstall-goom2_libLTLIBRARIES \
+- uninstall-goom2_library_includeHEADERS uninstall-info-am
+-
+-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+- clean-goom2_libLTLIBRARIES clean-libtool ctags distclean \
+- distclean-compile distclean-generic distclean-libtool \
+- distclean-tags distdir dvi dvi-am html html-am info info-am \
+- install install-am install-data install-data-am install-exec \
+- install-exec-am install-goom2_libLTLIBRARIES \
+- install-goom2_library_includeHEADERS install-info \
+- install-info-am install-man install-strip installcheck \
+- installcheck-am installdirs maintainer-clean \
+- maintainer-clean-generic mostlyclean mostlyclean-compile \
+- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+- tags uninstall uninstall-am uninstall-goom2_libLTLIBRARIES \
+- uninstall-goom2_library_includeHEADERS uninstall-info-am
+-
+-# Tell versions [3.59,3.63) of GNU make to not export all variables.
+-# Otherwise a system limit (for SysV at least) may be exceeded.
+-.NOEXPORT:
+diff -Naur /home/d4rk/goom2k4-0/src/mathtools.c /src/mathtools.c
+--- /home/d4rk/goom2k4-0/src/mathtools.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/mathtools.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,84 +0,0 @@
+-/*---------------------------------------------------------------------------*/
+-/*
+-** mathtools.c
+-** Goom Project
+-**
+-** Created by Jeko on Sun Jul 20 2003
+- ** Copyright (c) 2003 iOS. All rights reserved.
+-*/
+-/*---------------------------------------------------------------------------*/
+-
+-#include "mathtools.h"
+-
+-float sin256[256] = {
+- 0,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962
+- ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895
+- ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998
+- ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541
+- ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585
+- ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421
+- ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702
+- ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699
+- ,1,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278
+- ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993
+- ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854
+- ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247
+- ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808
+- ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241
+- ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101
+- ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412
+- ,1.22465e-16,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962
+- ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895
+- ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998
+- ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541
+- ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585
+- ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421
+- ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702
+- ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699
+- ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278
+- ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993
+- ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854
+- ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247
+- ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808
+- ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241
+- ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101
+- ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412
+-
+-};
+-
+-float cos256[256] = {
+- 0,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278
+- ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993
+- ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854
+- ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247
+- ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808
+- ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241
+- ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101
+- ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412
+- ,6.12323e-17,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962
+- ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895
+- ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998
+- ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541
+- ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585
+- ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421
+- ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702
+- ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699
+- ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278
+- ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993
+- ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854
+- ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247
+- ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808
+- ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241
+- ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101
+- ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412
+- ,-1.83697e-16,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962
+- ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895
+- ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998
+- ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541
+- ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585
+- ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421
+- ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702
+- ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699
+-
+-};
+-
+diff -Naur /home/d4rk/goom2k4-0/src/mathtools.h /src/mathtools.h
+--- /home/d4rk/goom2k4-0/src/mathtools.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/mathtools.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,36 +0,0 @@
+-#ifndef MATHTOOLS_H
+-#define MATHTOOLS_H
+-
+-
+-#define _double2fixmagic (68719476736.0*1.5)
+-/* 2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor */
+-#define _shiftamt 16
+-/* 16.16 fixed point representation */
+-
+-#if BigEndian_
+-#define iexp_ 0
+-#define iman_ 1
+-#else
+-#define iexp_ 1
+-#define iman_ 0
+-#endif /* BigEndian_ */
+-
+-/* TODO: this optimization is very efficient: put it again when all works
+-#ifdef HAVE_MMX
+-#define F2I(dbl,i) {double d = dbl + _double2fixmagic; i = ((int*)&d)[iman_] >> _shiftamt;}
+-#else*/
+-#define F2I(dbl,i) i=(int)dbl;
+-/*#endif*/
+-
+-#if 0
+-#define SINCOS(f,s,c) \
+- __asm__ __volatile__ ("fsincos" : "=t" (c), "=u" (s) : "0" (f))
+-#else
+-#define SINCOS(f,s,c) {s=sin(f);c=cos(f);}
+-#endif
+-
+-extern float sin256[256];
+-extern float cos256[256];
+-
+-#endif
+-
+diff -Naur /home/d4rk/goom2k4-0/src/mmx.c /src/mmx.c
+--- /home/d4rk/goom2k4-0/src/mmx.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/mmx.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,275 +0,0 @@
+-#ifdef HAVE_MMX
+-
+-#define BUFFPOINTNB 16
+-#define BUFFPOINTMASK 0xffff
+-#define BUFFINCR 0xff
+-
+-#include "mmx.h"
+-#include "goom_graphic.h"
+-
+-#define sqrtperte 16
+-// faire : a % sqrtperte <=> a & pertemask
+-#define PERTEMASK 0xf
+-// faire : a / sqrtperte <=> a >> PERTEDEC
+-#define PERTEDEC 4
+-
+-int mmx_supported (void) {
+- return (mm_support()&0x1);
+-}
+-
+-void zoom_filter_mmx (int prevX, int prevY,
+- Pixel *expix1, Pixel *expix2,
+- int *brutS, int *brutD, int buffratio,
+- int precalCoef[16][16])
+-{
+- unsigned int ax = (prevX-1)<<PERTEDEC, ay = (prevY-1)<<PERTEDEC;
+-
+- int bufsize = prevX * prevY;
+- int loop;
+-
+- __asm__ __volatile__ ("pxor %mm7,%mm7");
+-
+- for (loop=0; loop<bufsize; loop++)
+- {
+- /* int couleur; */
+- int px,py;
+- int pos;
+- int coeffs;
+-
+- int myPos = loop << 1,
+- myPos2 = myPos + 1;
+- int brutSmypos = brutS[myPos];
+-
+- px = brutSmypos + (((brutD[myPos] - brutSmypos)*buffratio) >> BUFFPOINTNB);
+- brutSmypos = brutS[myPos2];
+- py = brutSmypos + (((brutD[myPos2] - brutSmypos)*buffratio) >> BUFFPOINTNB);
+-
+- if ((py>=ay) || (px>=ax)) {
+- pos=coeffs=0;
+- }
+- else {
+- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC));
+- // coef en modulo 15
+- coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK];
+- }
+-
+- __asm__ __volatile__ (
+- "movd %2, %%mm6 \n\t"
+-
+- /* recuperation des deux premiers pixels dans mm0 et mm1 */
+- "movq (%3,%1,4), %%mm0 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */
+- "movq %%mm0, %%mm1 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */
+-
+- /* depackage du premier pixel */
+- "punpcklbw %%mm7, %%mm0 \n\t" /* 00-b2-00-v2-00-r2-00-a2 */
+-
+- "movq %%mm6, %%mm5 \n\t" /* ??-??-??-??-c4-c3-c2-c1 */
+- /* depackage du 2ieme pixel */
+- "punpckhbw %%mm7, %%mm1 \n\t" /* 00-b1-00-v1-00-r1-00-a1 */
+-
+- /* extraction des coefficients... */
+- "punpcklbw %%mm5, %%mm6 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */
+- "movq %%mm6, %%mm4 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */
+- "movq %%mm6, %%mm5 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */
+-
+- "punpcklbw %%mm5, %%mm6 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */
+- "punpckhbw %%mm5, %%mm4 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */
+-
+- "movq %%mm6, %%mm3 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */
+-
+- "punpcklbw %%mm7, %%mm6 \n\t" /* 00-c1-00-c1-00-c1-00-c1 */
+- "punpckhbw %%mm7, %%mm3 \n\t" /* 00-c2-00-c2-00-c2-00-c2 */
+-
+- /* multiplication des pixels par les coefficients */
+- "pmullw %%mm6, %%mm0 \n\t" /* c1*b2-c1*v2-c1*r2-c1*a2 */
+- "pmullw %%mm3, %%mm1 \n\t" /* c2*b1-c2*v1-c2*r1-c2*a1 */
+- "paddw %%mm1, %%mm0 \n\t"
+-
+- /* ...extraction des 2 derniers coefficients */
+- "movq %%mm4, %%mm5 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */
+- "punpcklbw %%mm7, %%mm4 \n\t" /* 00-c3-00-c3-00-c3-00-c3 */
+- "punpckhbw %%mm7, %%mm5 \n\t" /* 00-c4-00-c4-00-c4-00-c4 */
+-
+- /* ajouter la longueur de ligne a esi */
+- "addl 8(%%ebp),%1 \n\t"
+-
+- /* recuperation des 2 derniers pixels */
+- "movq (%3,%1,4), %%mm1 \n\t"
+- "movq %%mm1, %%mm2 \n\t"
+-
+- /* depackage des pixels */
+- "punpcklbw %%mm7, %%mm1 \n\t"
+- "punpckhbw %%mm7, %%mm2 \n\t"
+-
+- /* multiplication pas les coeffs */
+- "pmullw %%mm4, %%mm1 \n\t"
+- "pmullw %%mm5, %%mm2 \n\t"
+-
+- /* ajout des valeurs obtenues à la valeur finale */
+- "paddw %%mm1, %%mm0 \n\t"
+- "paddw %%mm2, %%mm0 \n\t"
+-
+- /* division par 256 = 16+16+16+16, puis repackage du pixel final */
+- "psrlw $8, %%mm0 \n\t"
+- "packuswb %%mm7, %%mm0 \n\t"
+-
+- "movd %%mm0,%0 \n\t"
+- :"=g"(expix2[loop])
+- :"r"(pos),"r"(coeffs),"r"(expix1)
+-
+- );
+-
+- emms();
+- }
+-}
+-
+-#define DRAWMETHOD_PLUS_MMX(_out,_backbuf,_col) \
+-{ \
+- movd_m2r(_backbuf, mm0); \
+- paddusb_m2r(_col, mm0); \
+- movd_r2m(mm0, _out); \
+-}
+-
+-#define DRAWMETHOD DRAWMETHOD_PLUS_MMX(*p,*p,col)
+-
+-void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny)
+-{
+- int x, y, dx, dy, yy, xx;
+- Pixel *p;
+-
+- if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx))
+- goto end_of_line;
+-
+- dx = x2 - x1;
+- dy = y2 - y1;
+- if (x1 >= x2) {
+- int tmp;
+-
+- tmp = x1;
+- x1 = x2;
+- x2 = tmp;
+- tmp = y1;
+- y1 = y2;
+- y2 = tmp;
+- dx = x2 - x1;
+- dy = y2 - y1;
+- }
+-
+- /* vertical line */
+- if (dx == 0) {
+- if (y1 < y2) {
+- p = &(data[(screenx * y1) + x1]);
+- for (y = y1; y <= y2; y++) {
+- DRAWMETHOD;
+- p += screenx;
+- }
+- }
+- else {
+- p = &(data[(screenx * y2) + x1]);
+- for (y = y2; y <= y1; y++) {
+- DRAWMETHOD;
+- p += screenx;
+- }
+- }
+- goto end_of_line;
+- }
+- /* horizontal line */
+- if (dy == 0) {
+- if (x1 < x2) {
+- p = &(data[(screenx * y1) + x1]);
+- for (x = x1; x <= x2; x++) {
+- DRAWMETHOD;
+- p++;
+- }
+- goto end_of_line;
+- }
+- else {
+- p = &(data[(screenx * y1) + x2]);
+- for (x = x2; x <= x1; x++) {
+- DRAWMETHOD;
+- p++;
+- }
+- goto end_of_line;
+- }
+- }
+- /* 1 */
+- /* \ */
+- /* \ */
+- /* 2 */
+- if (y2 > y1) {
+- /* steep */
+- if (dy > dx) {
+- dx = ((dx << 16) / dy);
+- x = x1 << 16;
+- for (y = y1; y <= y2; y++) {
+- xx = x >> 16;
+- p = &(data[(screenx * y) + xx]);
+- DRAWMETHOD;
+- if (xx < (screenx - 1)) {
+- p++;
+- /* DRAWMETHOD; */
+- }
+- x += dx;
+- }
+- goto end_of_line;
+- }
+- /* shallow */
+- else {
+- dy = ((dy << 16) / dx);
+- y = y1 << 16;
+- for (x = x1; x <= x2; x++) {
+- yy = y >> 16;
+- p = &(data[(screenx * yy) + x]);
+- DRAWMETHOD;
+- if (yy < (screeny - 1)) {
+- p += screeny;
+- /* DRAWMETHOD; */
+- }
+- y += dy;
+- }
+- }
+- }
+- /* 2 */
+- /* / */
+- /* / */
+- /* 1 */
+- else {
+- /* steep */
+- if (-dy > dx) {
+- dx = ((dx << 16) / -dy);
+- x = (x1 + 1) << 16;
+- for (y = y1; y >= y2; y--) {
+- xx = x >> 16;
+- p = &(data[(screenx * y) + xx]);
+- DRAWMETHOD;
+- if (xx < (screenx - 1)) {
+- p--;
+- /* DRAWMETHOD; */
+- }
+- x += dx;
+- }
+- goto end_of_line;
+- }
+- /* shallow */
+- else {
+- dy = ((dy << 16) / dx);
+- y = y1 << 16;
+- for (x = x1; x <= x2; x++) {
+- yy = y >> 16;
+- p = &(data[(screenx * yy) + x]);
+- DRAWMETHOD;
+- if (yy < (screeny - 1)) {
+- p += screeny;
+- /* DRAWMETHOD; */
+- }
+- y += dy;
+- }
+- goto end_of_line;
+- }
+- }
+-end_of_line:
+- emms();
+- /* __asm__ __volatile__ ("emms"); */
+-}
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/mmx.h /src/mmx.h
+--- /home/d4rk/goom2k4-0/src/mmx.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/mmx.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,729 +0,0 @@
+-/* mmx.h
+-
+- MultiMedia eXtensions GCC interface library for IA32.
+-
+- To use this library, simply include this header file
+- and compile with GCC. You MUST have inlining enabled
+- in order for mmx_ok() to work; this can be done by
+- simply using -O on the GCC command line.
+-
+- Compiling with -DMMX_TRACE will cause detailed trace
+- output to be sent to stderr for each mmx operation.
+- This adds lots of code, and obviously slows execution to
+- a crawl, but can be very useful for debugging.
+-
+- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
+- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
+- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+- AND FITNESS FOR ANY PARTICULAR PURPOSE.
+-
+- 1997-99 by H. Dietz and R. Fisher
+-
+- Notes:
+- It appears that the latest gas has the pand problem fixed, therefore
+- I'll undefine BROKEN_PAND by default.
+-*/
+-
+-#ifndef _MMX_H
+-#define _MMX_H
+-
+-#include "goom_graphic.h"
+-
+-/* Warning: at this writing, the version of GAS packaged
+- with most Linux distributions does not handle the
+- parallel AND operation mnemonic correctly. If the
+- symbol BROKEN_PAND is defined, a slower alternative
+- coding will be used. If execution of mmxtest results
+- in an illegal instruction fault, define this symbol.
+-*/
+-#undef BROKEN_PAND
+-
+-
+-/* The type of an value that fits in an MMX register
+- (note that long long constant values MUST be suffixed
+- by LL and unsigned long long values by ULL, lest
+- they be truncated by the compiler)
+-*/
+-typedef union {
+- long long q; /* Quadword (64-bit) value */
+- unsigned long long uq; /* Unsigned Quadword */
+- int d[2]; /* 2 Doubleword (32-bit) values */
+- unsigned int ud[2]; /* 2 Unsigned Doubleword */
+- short w[4]; /* 4 Word (16-bit) values */
+- unsigned short uw[4]; /* 4 Unsigned Word */
+- char b[8]; /* 8 Byte (8-bit) values */
+- unsigned char ub[8]; /* 8 Unsigned Byte */
+- float s[2]; /* Single-precision (32-bit) value */
+-} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */
+-
+-
+-
+-/* Function to test if multimedia instructions are supported...
+-*/
+-static int
+-mm_support(void)
+-{
+- /* Returns 1 if MMX instructions are supported,
+- 3 if Cyrix MMX and Extended MMX instructions are supported
+- 5 if AMD MMX and 3DNow! instructions are supported
+- 13 if AMD Extended MMX, &3dNow supported
+- 0 if hardware does not support any of these
+- */
+- register int rval = 0;
+-
+- __asm__ __volatile__ (
+- /* See if CPUID instruction is supported ... */
+- /* ... Get copies of EFLAGS into eax and ecx */
+- "pushl %%ebx\n\t"
+- "pushf\n\t"
+- "popl %%eax\n\t"
+- "movl %%eax, %%ecx\n\t"
+-
+- /* ... Toggle the ID bit in one copy and store */
+- /* to the EFLAGS reg */
+- "xorl $0x200000, %%eax\n\t"
+- "push %%eax\n\t"
+- "popf\n\t"
+-
+- /* ... Get the (hopefully modified) EFLAGS */
+- "pushf\n\t"
+- "popl %%eax\n\t"
+-
+- /* ... Compare and test result */
+- "xorl %%eax, %%ecx\n\t"
+- "testl $0x200000, %%ecx\n\t"
+- "jz NotSupported1\n\t" /* CPUID not supported */
+-
+-
+- /* Get standard CPUID information, and
+- go to a specific vendor section */
+- "movl $0, %%eax\n\t"
+- "cpuid\n\t"
+-
+- /* Check for Intel */
+- "cmpl $0x756e6547, %%ebx\n\t"
+- "jne TryAMD\n\t"
+- "cmpl $0x49656e69, %%edx\n\t"
+- "jne TryAMD\n\t"
+- "cmpl $0x6c65746e, %%ecx\n"
+- "jne TryAMD\n\t"
+- "jmp Intel\n\t"
+-
+- /* Check for AMD */
+- "\nTryAMD:\n\t"
+- "cmpl $0x68747541, %%ebx\n\t"
+- "jne TryCyrix\n\t"
+- "cmpl $0x69746e65, %%edx\n\t"
+- "jne TryCyrix\n\t"
+- "cmpl $0x444d4163, %%ecx\n"
+- "jne TryCyrix\n\t"
+- "jmp AMD\n\t"
+-
+- /* Check for Cyrix */
+- "\nTryCyrix:\n\t"
+- "cmpl $0x69727943, %%ebx\n\t"
+- "jne NotSupported2\n\t"
+- "cmpl $0x736e4978, %%edx\n\t"
+- "jne NotSupported3\n\t"
+- "cmpl $0x64616574, %%ecx\n\t"
+- "jne NotSupported4\n\t"
+- /* Drop through to Cyrix... */
+-
+-
+- /* Cyrix Section */
+- /* See if extended CPUID level 80000001 is supported */
+- /* The value of CPUID/80000001 for the 6x86MX is undefined
+- according to the Cyrix CPU Detection Guide (Preliminary
+- Rev. 1.01 table 1), so we'll check the value of eax for
+- CPUID/0 to see if standard CPUID level 2 is supported.
+- According to the table, the only CPU which supports level
+- 2 is also the only one which supports extended CPUID levels.
+- */
+- "cmpl $0x2, %%eax\n\t"
+- "jne MMXtest\n\t" /* Use standard CPUID instead */
+-
+- /* Extended CPUID supported (in theory), so get extended
+- features */
+- "movl $0x80000001, %%eax\n\t"
+- "cpuid\n\t"
+- "testl $0x00800000, %%eax\n\t" /* Test for MMX */
+- "jz NotSupported5\n\t" /* MMX not supported */
+- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */
+- "jnz EMMXSupported\n\t"
+- "movl $1, %0\n\n\t" /* MMX Supported */
+- "jmp Return\n\n"
+- "EMMXSupported:\n\t"
+- "movl $3, %0\n\n\t" /* EMMX and MMX Supported */
+- "jmp Return\n\t"
+-
+-
+- /* AMD Section */
+- "AMD:\n\t"
+-
+- /* See if extended CPUID is supported */
+- "movl $0x80000000, %%eax\n\t"
+- "cpuid\n\t"
+- "cmpl $0x80000000, %%eax\n\t"
+- "jl MMXtest\n\t" /* Use standard CPUID instead */
+-
+- /* Extended CPUID supported, so get extended features */
+- "movl $0x80000001, %%eax\n\t"
+- "cpuid\n\t"
+- "testl $0x00800000, %%edx\n\t" /* Test for MMX */
+- "jz NotSupported6\n\t" /* MMX not supported */
+- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */
+- "jnz ThreeDNowSupported\n\t"
+- "movl $1, %0\n\n\t" /* MMX Supported */
+- "jmp Return\n\n"
+- "ThreeDNowSupported:\n\t"
+- "testl $0x40000000, %%edx\n\t" /* Test AMD Extended MMX */
+- "jnz AMDXMMXSupported\n\t"
+- "movl $5, %0\n\n\t" /* 3DNow! and MMX Supported */
+- "jmp Return\n\t"
+- "AMDXMMXSupported:\n\t"
+- "movl $13, %0\n\n\t" /* XMMX, 3DNow! and MMX Supported */
+- "jmp Return\n\t"
+-
+-
+- /* Intel Section */
+- "Intel:\n\t"
+-
+- /* Check for MMX */
+- "MMXtest:\n\t"
+- "movl $1, %%eax\n\t"
+- "cpuid\n\t"
+- "testl $0x00800000, %%edx\n\t" /* Test for MMX */
+- "jz NotSupported7\n\t" /* MMX Not supported */
+- "movl $1, %0\n\n\t" /* MMX Supported */
+- "jmp Return\n\t"
+-
+- /* Nothing supported */
+- "\nNotSupported1:\n\t"
+- "#movl $101, %0\n\n\t"
+- "\nNotSupported2:\n\t"
+- "#movl $102, %0\n\n\t"
+- "\nNotSupported3:\n\t"
+- "#movl $103, %0\n\n\t"
+- "\nNotSupported4:\n\t"
+- "#movl $104, %0\n\n\t"
+- "\nNotSupported5:\n\t"
+- "#movl $105, %0\n\n\t"
+- "\nNotSupported6:\n\t"
+- "#movl $106, %0\n\n\t"
+- "\nNotSupported7:\n\t"
+- "#movl $107, %0\n\n\t"
+- "movl $0, %0\n\n\t"
+-
+- "Return:\n\t"
+- "popl %%ebx\n\t"
+- : "=X" (rval)
+- : /* no input */
+- : "eax", "ecx", "edx"
+- );
+-
+- /* Return */
+- return(rval);
+-}
+-
+-/* Function to test if mmx instructions are supported...
+-*/
+-static inline int
+-mmx_ok(void)
+-{
+- /* Returns 1 if MMX instructions are supported, 0 otherwise */
+- return ( mm_support() & 0x1 );
+-}
+-
+-int mmx_supported (void);
+-int xmmx_supported (void);
+-
+-
+-/* MMX optimized implementations */
+-void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny);
+-void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny);
+-void zoom_filter_mmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2,
+- int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
+-void zoom_filter_xmmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2,
+- int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]);
+-
+-
+-/* Helper functions for the instruction macros that follow...
+- (note that memory-to-register, m2r, instructions are nearly
+- as efficient as register-to-register, r2r, instructions;
+- however, memory-to-memory instructions are really simulated
+- as a convenience, and are only 1/3 as efficient)
+-*/
+-#ifdef MMX_TRACE
+-
+-/* Include the stuff for printing a trace to stderr...
+-*/
+-
+-#include <stdio.h>
+-
+-#define mmx_i2r(op, imm, reg) \
+- { \
+- mmx_t mmx_trace; \
+- mmx_trace.uq = (imm); \
+- printf(#op "_i2r(" #imm "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#reg "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ (#op " %0, %%" #reg \
+- : /* nothing */ \
+- : "X" (imm)); \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#reg "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#define mmx_m2r(op, mem, reg) \
+- { \
+- mmx_t mmx_trace; \
+- mmx_trace = (mem); \
+- printf(#op "_m2r(" #mem "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#reg "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ (#op " %0, %%" #reg \
+- : /* nothing */ \
+- : "m" (mem)); \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#reg "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#define mmx_r2m(op, reg, mem) \
+- { \
+- mmx_t mmx_trace; \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#op "_r2m(" #reg "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- mmx_trace = (mem); \
+- printf(#mem "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ (#op " %%" #reg ", %0" \
+- : "=m" (mem) \
+- : /* nothing */ ); \
+- mmx_trace = (mem); \
+- printf(#mem "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#define mmx_r2r(op, regs, regd) \
+- { \
+- mmx_t mmx_trace; \
+- __asm__ __volatile__ ("movq %%" #regs ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#op "_r2r(" #regs "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ ("movq %%" #regd ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#regd "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \
+- __asm__ __volatile__ ("movq %%" #regd ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- printf(#regd "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#define mmx_m2m(op, mems, memd) \
+- { \
+- mmx_t mmx_trace; \
+- mmx_trace = (mems); \
+- printf(#op "_m2m(" #mems "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- mmx_trace = (memd); \
+- printf(#memd "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+- #op " %1, %%mm0\n\t" \
+- "movq %%mm0, %0" \
+- : "=m" (memd) \
+- : "m" (mems)); \
+- mmx_trace = (memd); \
+- printf(#memd "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#else
+-
+-/* These macros are a lot simpler without the tracing...
+-*/
+-
+-#define mmx_i2r(op, imm, reg) \
+- __asm__ __volatile__ (#op " %0, %%" #reg \
+- : /* nothing */ \
+- : "X" (imm) )
+-
+-#define mmx_m2r(op, mem, reg) \
+- __asm__ __volatile__ (#op " %0, %%" #reg \
+- : /* nothing */ \
+- : "m" (mem))
+-
+-#define mmx_r2m(op, reg, mem) \
+- __asm__ __volatile__ (#op " %%" #reg ", %0" \
+- : "=m" (mem) \
+- : /* nothing */ )
+-
+-#define mmx_r2r(op, regs, regd) \
+- __asm__ __volatile__ (#op " %" #regs ", %" #regd)
+-
+-#define mmx_m2m(op, mems, memd) \
+- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+- #op " %1, %%mm0\n\t" \
+- "movq %%mm0, %0" \
+- : "=m" (memd) \
+- : "m" (mems))
+-
+-#endif
+-
+-
+-/* 1x64 MOVe Quadword
+- (this is both a load and a store...
+- in fact, it is the only way to store)
+-*/
+-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg)
+-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var)
+-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd)
+-#define movq(vars, vard) \
+- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \
+- "movq %%mm0, %0" \
+- : "=X" (vard) \
+- : "X" (vars))
+-
+-
+-/* 1x32 MOVe Doubleword
+- (like movq, this is both load and store...
+- but is most useful for moving things between
+- mmx registers and ordinary registers)
+-*/
+-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg)
+-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var)
+-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd)
+-#define movd(vars, vard) \
+- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \
+- "movd %%mm0, %0" \
+- : "=X" (vard) \
+- : "X" (vars))
+-
+-
+-/* 2x32, 4x16, and 8x8 Parallel ADDs
+-*/
+-#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg)
+-#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd)
+-#define paddd(vars, vard) mmx_m2m(paddd, vars, vard)
+-
+-#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg)
+-#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd)
+-#define paddw(vars, vard) mmx_m2m(paddw, vars, vard)
+-
+-#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg)
+-#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd)
+-#define paddb(vars, vard) mmx_m2m(paddb, vars, vard)
+-
+-
+-/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic
+-*/
+-#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg)
+-#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd)
+-#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard)
+-
+-#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg)
+-#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd)
+-#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard)
+-
+-
+-/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic
+-*/
+-#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg)
+-#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd)
+-#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard)
+-
+-#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg)
+-#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd)
+-#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard)
+-
+-
+-/* 2x32, 4x16, and 8x8 Parallel SUBs
+-*/
+-#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg)
+-#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd)
+-#define psubd(vars, vard) mmx_m2m(psubd, vars, vard)
+-
+-#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg)
+-#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd)
+-#define psubw(vars, vard) mmx_m2m(psubw, vars, vard)
+-
+-#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg)
+-#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd)
+-#define psubb(vars, vard) mmx_m2m(psubb, vars, vard)
+-
+-
+-/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic
+-*/
+-#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg)
+-#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd)
+-#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard)
+-
+-#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg)
+-#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd)
+-#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard)
+-
+-
+-/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic
+-*/
+-#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg)
+-#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd)
+-#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard)
+-
+-#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg)
+-#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd)
+-#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard)
+-
+-
+-/* 4x16 Parallel MULs giving Low 4x16 portions of results
+-*/
+-#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg)
+-#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd)
+-#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard)
+-
+-
+-/* 4x16 Parallel MULs giving High 4x16 portions of results
+-*/
+-#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg)
+-#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd)
+-#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard)
+-
+-
+-/* 4x16->2x32 Parallel Mul-ADD
+- (muls like pmullw, then adds adjacent 16-bit fields
+- in the multiply result to make the final 2x32 result)
+-*/
+-#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg)
+-#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd)
+-#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard)
+-
+-
+-/* 1x64 bitwise AND
+-*/
+-#ifdef BROKEN_PAND
+-#define pand_m2r(var, reg) \
+- { \
+- mmx_m2r(pandn, (mmx_t) -1LL, reg); \
+- mmx_m2r(pandn, var, reg); \
+- }
+-#define pand_r2r(regs, regd) \
+- { \
+- mmx_m2r(pandn, (mmx_t) -1LL, regd); \
+- mmx_r2r(pandn, regs, regd) \
+- }
+-#define pand(vars, vard) \
+- { \
+- movq_m2r(vard, mm0); \
+- mmx_m2r(pandn, (mmx_t) -1LL, mm0); \
+- mmx_m2r(pandn, vars, mm0); \
+- movq_r2m(mm0, vard); \
+- }
+-#else
+-#define pand_m2r(var, reg) mmx_m2r(pand, var, reg)
+-#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd)
+-#define pand(vars, vard) mmx_m2m(pand, vars, vard)
+-#endif
+-
+-
+-/* 1x64 bitwise AND with Not the destination
+-*/
+-#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg)
+-#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd)
+-#define pandn(vars, vard) mmx_m2m(pandn, vars, vard)
+-
+-
+-/* 1x64 bitwise OR
+-*/
+-#define por_m2r(var, reg) mmx_m2r(por, var, reg)
+-#define por_r2r(regs, regd) mmx_r2r(por, regs, regd)
+-#define por(vars, vard) mmx_m2m(por, vars, vard)
+-
+-
+-/* 1x64 bitwise eXclusive OR
+-*/
+-#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg)
+-#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd)
+-#define pxor(vars, vard) mmx_m2m(pxor, vars, vard)
+-
+-
+-/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality
+- (resulting fields are either 0 or -1)
+-*/
+-#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg)
+-#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd)
+-#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard)
+-
+-#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg)
+-#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd)
+-#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard)
+-
+-#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg)
+-#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd)
+-#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard)
+-
+-
+-/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than
+- (resulting fields are either 0 or -1)
+-*/
+-#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg)
+-#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd)
+-#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard)
+-
+-#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg)
+-#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd)
+-#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard)
+-
+-#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg)
+-#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd)
+-#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard)
+-
+-
+-/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical
+-*/
+-#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg)
+-#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg)
+-#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd)
+-#define psllq(vars, vard) mmx_m2m(psllq, vars, vard)
+-
+-#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg)
+-#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg)
+-#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd)
+-#define pslld(vars, vard) mmx_m2m(pslld, vars, vard)
+-
+-#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg)
+-#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg)
+-#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd)
+-#define psllw(vars, vard) mmx_m2m(psllw, vars, vard)
+-
+-
+-/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical
+-*/
+-#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg)
+-#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg)
+-#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd)
+-#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard)
+-
+-#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg)
+-#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg)
+-#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd)
+-#define psrld(vars, vard) mmx_m2m(psrld, vars, vard)
+-
+-#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg)
+-#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg)
+-#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd)
+-#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard)
+-
+-
+-/* 2x32 and 4x16 Parallel Shift Right Arithmetic
+-*/
+-#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg)
+-#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg)
+-#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd)
+-#define psrad(vars, vard) mmx_m2m(psrad, vars, vard)
+-
+-#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg)
+-#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg)
+-#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd)
+-#define psraw(vars, vard) mmx_m2m(psraw, vars, vard)
+-
+-
+-/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate
+- (packs source and dest fields into dest in that order)
+-*/
+-#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg)
+-#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd)
+-#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard)
+-
+-#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg)
+-#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd)
+-#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard)
+-
+-
+-/* 4x16->8x8 PACK and Unsigned Saturate
+- (packs source and dest fields into dest in that order)
+-*/
+-#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg)
+-#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd)
+-#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard)
+-
+-
+-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low
+- (interleaves low half of dest with low half of source
+- as padding in each result field)
+-*/
+-#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg)
+-#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd)
+-#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard)
+-
+-#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg)
+-#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd)
+-#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard)
+-
+-#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg)
+-#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd)
+-#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard)
+-
+-
+-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High
+- (interleaves high half of dest with high half of source
+- as padding in each result field)
+-*/
+-#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg)
+-#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd)
+-#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard)
+-
+-#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg)
+-#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd)
+-#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard)
+-
+-#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg)
+-#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd)
+-#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard)
+-
+-
+-/* Empty MMx State
+- (used to clean-up when going from mmx to float use
+- of the registers that are shared by both; note that
+- there is no float-to-mmx operation needed, because
+- only the float tag word info is corruptible)
+-*/
+-#ifdef MMX_TRACE
+-
+-#define emms() \
+- { \
+- printf("emms()\n"); \
+- __asm__ __volatile__ ("emms" \
+- "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"); \
+- }
+-
+-#else
+-
+-#define emms() __asm__ __volatile__ ("emms"::: \
+- "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)")
+-
+-#endif
+-
+-#endif
+-
+diff -Naur /home/d4rk/goom2k4-0/src/motif_goom1.h /src/motif_goom1.h
+--- /home/d4rk/goom2k4-0/src/motif_goom1.h 2005-02-07 06:46:42.000000000 -0700
++++ /src/motif_goom1.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,1026 +0,0 @@
+-static Motif CONV_MOTIF1 = {
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,14,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,13,9,9,7,2,2,9,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11,
+- 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,12,7,4,0,0,0,2,0,0,3,14,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,12,10,9,9,4,1,0,
+- 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,10,3,0,0,0,1,1,3,5,0,0,1,14,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,14,6,3,1,1,4,9,1,
+- 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 10,3,0,0,2,7,13,14,14,14,7,0,0,2,14,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,12,1,9,15,15,15,15,3,
+- 0,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,4,
+- 0,0,2,10,15,15,15,15,15,15,1,0,0,10,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,9,0,2,14,15,15,15,7,
+- 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,14,6,0,0,
+- 2,9,15,15,15,15,15,15,15,13,0,0,3,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,11,0,0,10,15,15,15,9,
+- 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,13,3,0,1,5,
+- 5,4,4,4,6,12,15,15,15,13,0,0,7,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,14,0,0,5,15,15,15,10,
+- 0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,11,1,0,3,3,1,
+- 0,0,0,0,0,0,5,13,15,12,0,0,13,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,13,14,15,
+- 15,15,15,15,15,15,15,15,14,0,0,1,15,15,15,12,
+- 0,3,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,10,1,2,4,0,0,1,
+- 9,12,12,12,9,3,0,2,14,5,0,7,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,14,7,4,4,1,1,12,
+- 15,15,15,15,15,15,15,15,14,1,0,0,12,15,15,15,
+- 1,0,12,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,10,0,3,2,0,0,3,12,
+- 15,15,15,15,15,14,2,1,13,2,0,12,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,14,3,0,0,0,0,0,2,
+- 13,15,15,15,15,15,15,15,14,1,0,0,8,15,15,15,
+- 1,0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,12,2,1,0,0,0,9,14,15,
+- 15,15,15,15,15,14,1,1,11,0,3,14,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,7,4,11,12,10,1,0,
+- 3,12,15,15,15,15,15,15,13,1,1,0,4,15,15,15,
+- 2,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,14,2,1,0,0,3,12,15,15,15,
+- 15,15,15,15,15,11,0,5,9,1,12,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,5,1,13,15,15,12,1,
+- 0,1,9,15,15,15,15,15,14,2,5,0,1,14,15,15,
+- 2,0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,14,3,0,0,0,7,14,15,15,15,15,
+- 15,15,15,15,15,9,0,8,7,4,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,7,0,7,8,11,15,13,
+- 2,0,0,3,10,15,15,15,15,5,11,0,0,11,15,15,
+- 6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,6,0,0,0,8,15,15,15,15,15,15,
+- 15,15,15,15,15,6,0,4,0,6,15,15,15,15,15,15,
+- 14,9,14,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,11,0,3,3,0,8,15,
+- 14,5,0,0,0,4,12,15,15,5,13,2,0,6,15,15,
+- 12,0,0,11,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,10,0,0,0,8,15,15,15,15,15,15,15,
+- 15,15,15,15,10,1,7,6,4,13,15,15,15,15,13,11,
+- 6,0,8,11,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,1,1,11,2,0,5,
+- 14,15,8,0,0,0,0,7,15,5,14,6,0,2,15,15,
+- 15,3,0,5,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,13,1,0,0,7,15,15,15,15,15,15,15,15,
+- 15,15,15,15,7,9,15,15,15,15,15,15,12,6,2,1,
+- 1,1,8,6,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,4,0,6,12,1,0,
+- 3,13,15,11,2,0,0,0,8,4,14,10,0,0,13,15,
+- 15,7,0,1,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,5,0,0,5,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,13,15,15,15,15,14,8,3,1,2,7,11,
+- 5,4,5,6,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,8,0,1,14,11,0,
+- 0,1,9,15,14,5,0,0,2,4,14,13,0,0,10,15,
+- 15,12,0,0,12,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,10,0,0,1,14,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,14,13,7,2,0,5,9,15,15,15,
+- 5,3,6,9,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,13,0,0,9,15,12,
+- 2,0,0,4,13,14,4,0,3,2,12,15,1,0,5,15,
+- 15,14,1,0,8,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,2,0,0,9,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,12,11,6,1,0,2,3,10,15,15,15,15,7,
+- 1,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,5,0,3,14,15,
+- 9,2,0,0,1,6,12,13,13,1,9,12,0,0,2,14,
+- 15,15,4,0,4,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,10,0,0,2,14,15,15,15,15,15,15,15,15,15,15,
+- 13,9,6,0,1,2,9,10,15,15,15,15,14,7,1,0,
+- 6,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,15,
+- 4,4,11,6,1,0,0,1,1,0,10,4,0,0,0,12,
+- 15,15,9,0,1,14,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,3,0,0,8,15,15,15,15,15,15,15,13,12,4,4,
+- 1,1,3,10,12,15,15,15,15,15,9,2,1,0,1,6,
+- 6,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,4,0,3,14,
+- 4,3,15,15,14,9,7,9,1,0,0,0,0,1,0,7,
+- 15,15,13,0,0,9,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 13,0,0,1,14,15,15,15,15,15,12,9,1,0,1,4,
+- 7,15,15,15,15,15,15,14,8,2,0,0,0,2,13,9,
+- 0,4,14,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,
+- 3,0,8,14,15,15,15,15,10,5,4,4,7,4,0,3,
+- 15,15,15,4,0,3,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 5,0,0,5,15,15,15,15,14,8,7,8,10,12,14,15,
+- 15,15,15,15,15,15,11,1,0,0,0,5,11,15,13,1,
+- 1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,3,0,4,
+- 4,0,0,2,6,10,15,15,15,15,15,15,15,10,0,0,
+- 12,15,15,9,0,0,12,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 1,0,0,10,15,15,15,15,15,13,14,15,15,15,15,15,
+- 15,15,15,15,14,7,1,0,0,3,12,15,15,15,6,0,
+- 7,15,15,15,12,10,9,10,12,14,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,0,
+- 8,3,1,4,1,0,1,12,15,15,15,15,15,14,2,0,
+- 6,15,15,15,2,0,6,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 0,0,1,14,15,15,15,15,14,5,15,15,15,15,15,15,
+- 15,15,15,7,2,0,0,1,8,15,15,15,15,12,0,2,
+- 14,15,12,4,0,0,0,0,0,1,5,10,14,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,14,0,0,
+- 5,4,1,14,15,10,7,13,15,15,15,15,15,15,8,0,
+- 1,14,15,15,7,0,1,14,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,
+- 0,0,4,15,15,15,15,15,13,2,13,15,15,15,15,15,
+- 12,7,0,0,0,0,5,12,15,15,15,15,14,3,0,9,
+- 11,1,0,0,1,1,0,1,0,0,0,0,2,12,15,15,
+- 15,15,15,15,15,15,15,14,15,15,15,15,15,15,2,0,
+- 5,2,1,14,15,14,13,15,15,15,15,15,15,15,12,0,
+- 0,10,15,15,13,0,0,9,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,
+- 0,0,4,15,15,15,15,15,12,0,12,15,15,15,12,6,
+- 0,0,0,0,6,14,15,15,15,15,15,15,7,0,0,12,
+- 1,0,0,2,2,1,1,7,12,8,3,0,0,1,13,15,
+- 15,15,15,15,15,8,4,8,12,15,15,15,15,15,8,0,
+- 4,2,0,14,15,11,9,15,15,15,15,15,15,15,15,3,
+- 0,5,15,15,15,5,0,3,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,
+- 0,0,4,15,15,15,15,15,12,0,12,15,13,3,1,0,
+- 0,0,5,12,15,15,15,15,15,15,15,12,0,0,7,7,
+- 0,0,0,0,0,0,0,1,12,15,15,12,3,0,5,15,
+- 15,15,15,14,5,0,0,0,0,2,2,3,7,14,9,8,
+- 14,2,1,14,15,2,12,13,15,15,15,15,15,15,15,9,
+- 0,0,13,15,15,10,0,0,12,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,
+- 0,0,5,15,15,15,15,15,12,0,11,10,1,0,0,1,
+- 5,14,15,15,15,15,15,15,15,15,15,6,0,2,7,0,
+- 0,0,0,1,2,7,4,0,3,14,15,15,14,2,0,12,
+- 15,15,15,9,0,1,2,1,0,0,0,0,0,1,3,7,
+- 15,3,0,14,15,4,12,15,15,15,15,15,15,15,15,14,
+- 1,0,8,15,15,14,1,0,8,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,
+- 0,0,4,15,15,15,15,15,12,0,2,0,0,1,10,15,
+- 15,15,15,15,15,15,15,15,15,15,12,0,0,6,0,0,
+- 0,1,10,14,15,15,11,1,0,9,15,15,15,8,0,9,
+- 15,15,12,4,8,14,15,8,1,0,0,0,0,0,1,9,
+- 15,2,0,13,15,1,9,15,15,15,15,15,15,15,15,15,
+- 6,0,1,14,15,14,1,0,3,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14,
+- 1,0,1,14,15,15,15,15,12,1,3,7,9,13,15,15,
+- 15,15,15,15,15,15,15,15,15,15,3,0,2,3,0,4,
+- 0,8,15,15,15,15,15,13,1,2,14,15,15,10,0,6,
+- 15,14,2,6,15,15,15,1,3,7,3,0,0,0,0,1,
+- 11,1,0,11,12,0,12,15,15,15,15,15,15,15,15,15,
+- 11,0,0,9,15,15,4,0,0,12,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 6,0,0,9,15,15,15,15,15,12,14,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,11,0,0,3,0,8,14,
+- 2,5,15,15,15,15,15,15,5,0,8,15,15,12,0,4,
+- 15,5,2,14,15,15,10,0,13,15,13,2,4,5,5,0,
+- 9,1,0,10,9,1,14,15,15,15,15,15,15,15,15,15,
+- 13,0,0,3,15,15,9,0,0,8,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 12,0,0,3,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,3,0,1,1,5,14,15,
+- 11,0,12,15,15,15,15,15,14,1,1,14,15,12,0,4,
+- 10,0,9,15,15,11,1,8,15,15,8,1,14,15,14,2,
+- 5,0,0,10,6,2,15,15,15,15,15,15,15,15,15,15,
+- 15,3,0,0,12,15,13,0,0,2,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,3,0,0,10,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,10,0,0,1,0,11,15,15,
+- 15,2,6,15,15,15,15,15,15,6,0,9,15,13,0,6,
+- 3,0,13,15,14,2,6,15,15,13,1,8,15,15,15,4,
+- 3,1,0,10,7,2,15,15,15,15,15,15,15,15,15,15,
+- 15,9,0,0,6,15,15,3,0,0,13,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,9,0,0,2,14,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,11,10,2,0,3,0,3,15,15,15,
+- 15,8,1,14,15,15,15,15,15,13,0,2,15,9,1,10,
+- 0,3,15,15,6,2,14,15,14,3,1,14,15,15,15,2,
+- 4,0,0,12,5,3,15,15,15,15,15,15,15,15,15,15,
+- 15,14,1,0,1,14,15,5,0,0,12,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,4,0,0,6,15,15,15,15,15,15,15,15,14,12,
+- 12,9,5,4,4,3,0,0,0,0,4,0,8,15,15,15,
+- 15,13,1,10,15,15,15,15,15,15,2,0,11,3,5,10,
+- 0,7,15,9,1,11,15,15,8,0,6,15,15,15,10,0,
+- 3,0,0,13,3,6,15,15,15,15,15,15,15,15,15,15,
+- 15,15,6,0,0,12,15,5,0,0,7,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,13,1,0,0,8,14,15,15,13,6,4,4,1,0,
+- 0,0,0,0,0,0,2,0,0,4,3,0,12,15,15,15,
+- 15,15,5,3,15,15,15,15,14,8,0,0,1,1,12,9,
+- 0,9,10,0,6,15,15,15,2,2,14,15,15,13,2,0,
+- 4,0,1,13,0,10,15,15,15,15,15,15,15,15,15,15,
+- 15,15,13,1,0,10,15,10,0,0,5,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,9,0,0,0,3,2,2,1,0,0,0,1,4,
+- 4,5,10,12,12,12,11,0,0,11,4,0,12,15,15,15,
+- 15,15,12,0,7,13,15,15,5,0,0,0,1,6,15,9,
+- 0,3,0,0,1,6,14,10,0,12,15,15,11,2,0,2,
+- 3,0,3,12,1,11,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,3,0,6,8,7,0,0,5,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,9,1,0,0,0,2,6,10,12,12,14,15,
+- 15,15,15,15,11,5,4,0,2,14,4,0,12,15,15,15,
+- 15,15,15,4,0,3,13,6,0,0,0,1,2,14,15,12,
+- 0,0,0,0,0,0,2,2,6,15,14,8,0,0,0,7,
+- 4,0,4,12,0,12,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,12,0,0,0,0,0,0,1,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,12,2,0,0,0,1,6,11,15,15,15,
+- 15,15,15,15,2,1,0,0,9,15,6,0,7,15,15,15,
+- 15,15,15,13,2,0,0,0,0,0,0,1,12,15,15,15,
+- 4,0,0,0,0,0,0,6,13,6,1,0,0,4,13,15,
+- 6,0,6,12,0,12,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,14,5,0,0,0,0,0,5,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,14,5,0,0,0,0,0,2,4,5,
+- 7,3,6,3,0,2,0,2,15,15,11,0,0,9,15,15,
+- 15,15,15,15,11,0,0,0,0,0,2,11,15,15,15,15,
+- 12,1,0,0,1,4,6,10,2,0,0,0,7,14,15,15,
+- 9,0,9,9,0,12,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,13,9,8,9,7,13,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,12,6,1,0,0,0,0,0,
+- 0,0,0,2,8,0,0,9,15,15,14,4,0,0,3,10,
+- 14,15,15,15,15,13,3,0,0,4,14,15,15,15,15,15,
+- 15,11,2,0,0,1,1,0,0,0,1,11,15,15,15,15,
+- 9,0,10,5,3,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,14,12,10,5,4,6,
+- 2,4,10,14,8,0,1,14,15,15,15,14,5,0,0,0,
+- 1,2,4,4,4,3,1,2,9,14,15,15,15,15,15,15,
+- 15,15,15,11,11,13,10,9,9,11,15,15,15,15,15,15,
+- 10,0,8,2,4,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 2,7,15,14,1,0,6,15,15,15,15,15,15,10,6,4,
+- 2,2,4,4,4,3,9,14,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 11,0,3,1,4,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11,
+- 1,10,15,9,0,0,13,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 11,0,11,11,11,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,2,
+- 5,15,14,2,0,5,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 14,1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,
+- 13,15,11,0,0,12,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,1,
+- 15,15,5,0,3,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,10,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,12,2,3,
+- 15,14,1,0,7,15,15,15,15,15,13,15,15,15,15,14,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,13,12,12,11,9,4,7,14,15,
+- 14,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,12,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,14,3,0,10,
+- 15,9,0,0,8,7,4,2,2,1,0,3,4,3,4,9,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,14,13,11,7,4,2,0,0,0,0,0,0,1,12,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,14,13,11,7,4,2,2,13,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,12,0,3,11,
+- 7,1,0,0,0,0,0,1,4,9,11,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,14,12,11,9,7,4,
+- 3,1,0,0,0,0,0,0,0,0,0,2,11,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,13,11,8,
+- 4,3,1,0,0,0,0,3,8,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,14,11,3,0,0,0,
+- 0,0,0,2,6,9,12,14,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,13,9,6,3,1,0,0,0,0,0,0,
+- 0,0,0,0,1,4,7,11,12,12,12,14,15,15,15,15,
+- 15,15,15,15,15,15,15,14,12,11,7,4,2,0,0,0,
+- 0,0,0,1,5,10,13,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,14,12,7,3,1,0,0,0,2,5,
+- 2,0,2,14,15,15,15,15,15,15,15,15,15,14,13,12,
+- 11,9,6,4,2,0,0,0,0,0,0,0,0,1,2,4,
+- 5,9,11,13,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,14,12,11,7,4,3,1,0,0,0,0,0,0,0,1,
+- 4,5,10,14,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,13,10,5,1,0,0,0,1,0,0,2,13,14,
+- 1,0,8,15,15,14,12,11,9,8,4,3,2,1,0,0,
+- 0,0,0,0,1,3,2,3,5,9,10,12,13,14,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,13,11,10,6,4,
+- 3,1,0,0,0,0,0,0,0,0,1,4,7,11,13,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,11,4,0,0,0,1,4,9,13,13,1,0,0,1,7,
+- 0,0,7,8,5,2,0,0,0,0,0,0,1,2,3,4,
+- 5,9,10,12,14,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,14,11,8,4,3,1,0,0,0,0,0,
+- 0,0,0,0,1,4,5,9,12,13,15,15,15,15,15,15,
+- 15,15,14,12,9,8,8,7,4,2,5,4,5,5,12,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,14,10,5,
+- 1,0,1,3,6,11,14,15,15,15,15,13,12,8,3,2,
+- 0,0,1,1,3,3,4,5,8,10,12,13,14,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,
+- 11,9,6,4,2,1,0,0,0,0,0,0,0,1,2,4,
+- 6,10,11,13,15,15,15,15,15,15,15,15,13,11,9,7,
+- 4,2,1,0,0,0,0,2,4,7,12,14,14,14,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,10,5,1,1,3,
+- 8,12,14,15,15,15,15,15,15,15,15,15,15,15,15,9,
+- 3,11,14,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,8,6,9,9,9,9,9,8,5,4,4,3,1,0,
+- 0,0,0,0,1,2,3,2,4,5,9,11,12,14,15,15,
+- 15,15,15,15,15,15,15,14,12,9,5,2,0,0,0,0,
+- 0,1,2,4,7,10,14,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,14,9,4,1,3,9,13,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,
+- 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,13,3,1,1,1,1,1,1,1,0,0,0,0,2,3,
+- 5,8,10,12,14,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,12,5,2,0,0,0,1,3,4,7,10,
+- 12,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,13,11,13,13,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,14,12,12,12,13,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,8,1,0,1,4,7,11,13,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,13,7,8,11,14,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
+- };
+diff -Naur /home/d4rk/goom2k4-0/src/motif_goom2.h /src/motif_goom2.h
+--- /home/d4rk/goom2k4-0/src/motif_goom2.h 2005-02-07 06:46:42.000000000 -0700
++++ /src/motif_goom2.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,1026 +0,0 @@
+-static Motif CONV_MOTIF2 = {
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,12,5,14,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,12,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,14,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,10,0,12,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,6,0,12,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,7,0,8,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,13,2,0,10,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,5,0,0,10,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,9,0,0,12,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,14,9,0,0,1,14,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,8,0,0,8,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,14,8,3,0,0,0,9,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,11,0,0,2,14,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,13,9,5,3,4,1,0,0,0,0,7,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,14,4,0,0,4,11,13,13,15,15,14,12,10,8,5,
+- 6,4,1,0,0,0,0,0,0,0,0,0,0,14,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,12,1,0,0,0,0,0,0,0,0,0,0,0,0,
+- 0,0,0,0,0,0,0,0,0,0,0,0,9,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 13,9,10,13,14,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,12,3,0,0,0,0,0,0,0,0,0,0,0,
+- 0,0,0,0,0,2,5,6,0,0,0,0,12,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 5,0,0,0,3,10,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,14,9,2,1,0,0,0,1,4,6,6,1,
+- 0,0,0,8,13,15,15,15,12,1,0,2,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14,
+- 2,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,3,0,0,10,15,15,15,10,
+- 0,0,4,15,15,15,15,15,15,2,0,6,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,5,
+- 3,11,5,0,0,0,0,0,4,11,14,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,7,0,0,13,15,15,15,11,
+- 0,0,7,15,15,15,15,15,15,1,0,9,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,
+- 13,15,15,12,5,0,0,0,0,0,1,8,14,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,7,0,1,14,15,15,15,11,
+- 0,0,7,15,15,15,15,15,14,0,0,9,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,11,1,10,
+- 15,15,15,15,15,11,5,0,0,0,0,0,1,6,13,15,
+- 15,15,15,15,14,8,11,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,6,0,2,15,15,15,15,11,
+- 0,0,6,15,15,15,15,15,13,0,0,11,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,11,1,6,15,
+- 15,15,15,15,15,15,15,14,5,0,0,0,0,0,0,6,
+- 14,15,15,15,6,0,4,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,7,0,5,15,15,15,15,11,
+- 0,0,5,15,15,15,15,15,12,0,0,12,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,13,2,1,13,15,
+- 15,15,15,15,15,15,15,15,15,12,2,0,0,0,0,0,
+- 1,6,11,7,0,0,4,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,7,0,7,15,15,15,15,11,
+- 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,5,0,7,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,11,5,0,0,0,
+- 0,0,0,0,0,1,11,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11,
+- 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,10,0,4,14,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,13,7,0,
+- 0,0,0,0,0,1,6,12,14,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11,
+- 0,0,7,15,15,15,15,15,12,0,0,12,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,13,1,1,12,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,
+- 5,0,0,0,0,0,0,0,3,10,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11,
+- 0,0,7,15,15,15,15,15,11,0,0,13,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,14,4,0,8,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 13,0,0,0,1,0,0,0,0,1,13,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11,
+- 0,0,8,15,15,15,15,15,8,0,2,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,9,0,4,14,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14,
+- 4,0,0,5,13,12,6,2,0,2,13,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11,
+- 0,0,7,15,15,15,15,15,4,0,4,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,13,1,1,13,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11,
+- 0,0,1,13,15,15,15,14,9,13,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,5,0,6,15,15,15,15,11,
+- 0,0,8,15,15,15,15,15,2,0,8,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,5,0,9,15,15,15,15,15,15,
+- 15,15,15,15,15,15,14,11,15,15,15,15,15,15,15,9,
+- 0,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11,
+- 0,0,7,15,15,15,15,13,0,0,11,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,10,0,3,14,15,15,15,15,15,15,
+- 15,15,15,15,15,14,3,0,13,15,15,15,15,15,15,14,
+- 9,11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11,
+- 0,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,14,2,1,12,15,15,15,15,15,15,15,
+- 15,15,15,15,14,3,0,0,9,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,6,0,3,15,15,15,15,13,
+- 1,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,9,0,5,15,15,15,15,15,15,15,15,
+- 15,15,15,14,4,0,0,0,10,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,8,0,2,15,15,15,15,15,
+- 3,0,13,15,15,15,15,12,0,0,12,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,13,2,1,12,15,15,15,15,15,15,15,15,
+- 15,15,15,7,0,0,0,0,8,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,10,0,1,14,15,15,15,15,
+- 11,5,15,15,15,15,15,12,0,0,11,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,6,0,7,15,15,15,15,15,15,15,15,15,
+- 15,15,8,0,0,0,0,0,0,9,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,12,0,0,12,15,15,15,15,
+- 15,14,15,15,15,15,15,10,0,0,12,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,13,1,2,14,15,15,15,15,15,15,15,15,15,
+- 15,10,0,0,0,6,6,0,0,0,5,12,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12,
+- 15,15,15,15,15,15,15,15,13,0,0,11,15,15,15,15,
+- 15,15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,7,0,8,15,15,15,15,15,15,15,15,15,15,
+- 15,9,0,0,4,15,15,8,0,0,0,1,5,13,15,15,
+- 15,15,15,15,15,15,15,15,15,15,12,8,7,6,5,3,
+- 3,3,4,12,15,15,15,15,15,15,15,15,15,7,0,6,
+- 15,15,15,15,15,15,15,15,14,1,0,10,15,15,15,15,
+- 15,15,15,15,15,15,15,6,0,3,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,13,1,0,13,15,15,15,15,15,15,15,15,15,15,
+- 15,14,7,8,13,15,15,15,11,2,0,0,0,0,5,11,
+- 15,15,15,15,15,15,15,15,13,3,0,0,0,0,0,0,
+- 0,0,0,5,15,15,15,15,15,15,15,15,12,1,0,0,
+- 3,11,15,15,15,15,15,15,13,1,0,10,15,15,15,15,
+- 15,15,15,15,15,15,15,3,0,5,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,9,0,5,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,14,8,1,0,0,0,0,
+- 4,12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,
+- 0,0,0,2,15,15,15,15,15,15,15,14,4,0,0,0,
+- 0,0,9,15,15,15,15,15,14,1,0,10,15,15,15,15,
+- 15,15,15,15,15,15,15,2,0,9,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,14,4,0,11,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,14,8,2,0,0,
+- 0,0,4,10,14,15,15,15,4,0,0,0,0,0,0,0,
+- 0,0,0,3,15,15,15,15,15,15,15,6,0,0,0,2,
+- 3,0,0,8,15,15,15,15,14,1,0,10,15,15,15,15,
+- 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 14,5,0,4,14,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,14,9,3,
+- 0,0,0,0,2,5,10,15,5,0,1,11,11,12,13,15,
+- 11,0,0,7,15,15,15,15,15,15,8,0,0,0,1,12,
+- 14,6,0,0,7,14,15,15,14,1,0,9,15,15,15,15,
+- 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 9,0,1,13,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14,
+- 10,2,0,0,0,0,1,14,4,0,1,14,15,15,15,15,
+- 9,0,0,9,15,15,15,15,15,9,0,0,0,0,9,15,
+- 15,15,7,0,0,6,14,15,15,3,0,6,15,15,15,15,
+- 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,
+- 0,0,1,10,14,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,13,1,0,0,0,1,14,3,0,0,14,15,15,15,15,
+- 5,0,0,11,15,15,15,15,13,1,0,0,0,6,15,15,
+- 15,15,15,8,0,0,2,10,15,6,0,3,15,15,15,15,
+- 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1,
+- 0,0,0,0,3,9,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,6,1,0,0,0,8,15,1,0,0,14,15,15,15,15,
+- 4,0,0,13,15,15,15,14,4,0,0,0,3,14,15,15,
+- 15,15,15,15,5,0,0,1,14,9,0,1,14,15,15,15,
+- 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1,
+- 0,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 9,0,0,0,0,7,15,15,1,0,0,14,15,15,15,14,
+- 2,0,1,14,15,15,15,12,0,0,0,3,13,15,15,15,
+- 15,15,15,9,0,0,0,1,14,12,0,0,12,15,15,15,
+- 15,15,15,15,15,15,14,1,0,10,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,
+- 3,0,0,0,0,0,0,1,8,14,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,
+- 0,0,0,0,7,15,15,15,1,0,0,14,15,15,15,13,
+- 0,0,1,15,15,15,15,12,0,0,0,6,14,15,15,15,
+- 15,15,12,0,0,0,0,3,14,12,0,0,12,15,15,15,
+- 15,15,15,15,15,15,12,0,0,12,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,13,3,0,0,0,0,0,0,1,6,13,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,0,
+- 0,0,0,3,15,15,15,12,0,0,0,14,15,15,15,11,
+- 0,0,3,15,15,15,15,15,12,7,0,0,4,14,15,15,
+- 15,11,1,0,0,0,4,13,15,12,0,0,12,15,15,15,
+- 15,15,15,15,15,15,10,0,1,14,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,12,7,0,0,0,0,0,0,0,3,8,12,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,0,
+- 0,0,1,13,15,15,15,6,0,0,0,14,15,15,15,8,
+- 0,0,7,15,15,15,15,15,15,15,8,1,0,2,13,15,
+- 14,2,0,0,0,4,14,15,15,13,1,0,10,15,15,15,
+- 15,15,15,15,15,15,9,0,2,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,11,6,2,0,0,0,0,0,0,0,1,
+- 10,15,15,15,15,15,15,15,15,15,15,15,15,8,0,0,
+- 0,0,10,15,15,15,15,4,0,0,1,15,15,15,15,4,
+- 0,0,8,15,15,15,15,15,15,15,15,10,1,0,1,8,
+- 2,0,0,0,5,15,15,15,15,15,2,0,6,15,15,15,
+- 15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,9,1,0,0,0,0,0,0,
+- 0,1,7,13,14,15,15,15,15,15,15,15,9,0,0,0,
+- 0,6,15,15,15,15,15,4,0,0,4,15,15,15,14,1,
+- 0,0,9,15,15,15,15,15,15,15,15,15,12,2,0,0,
+- 0,0,0,4,14,15,15,15,15,15,4,0,4,15,15,15,
+- 15,15,15,15,15,15,7,0,0,14,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,14,11,6,2,0,0,0,
+- 0,0,0,0,1,9,12,15,15,15,15,14,3,0,0,0,
+- 4,15,15,15,15,15,15,4,0,0,3,6,4,4,2,0,
+- 0,0,13,15,15,15,15,15,15,15,15,15,15,12,1,0,
+- 0,0,3,14,15,15,15,15,15,15,4,0,4,15,15,15,
+- 15,15,15,15,15,15,5,0,0,12,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,8,2,0,
+- 0,0,0,0,0,0,0,1,9,15,15,5,0,0,0,0,
+- 12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,0,
+- 0,3,15,15,15,15,15,15,15,15,15,15,15,14,4,0,
+- 0,1,12,15,15,15,15,15,15,15,6,0,1,14,15,15,
+- 15,15,15,15,15,15,5,0,0,13,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,
+- 7,1,0,0,0,0,0,0,0,5,7,0,0,0,0,10,
+- 15,15,15,15,15,15,15,7,0,0,0,0,0,0,0,0,
+- 1,10,15,15,15,15,15,15,15,15,15,15,15,14,3,0,
+- 3,12,15,15,15,15,15,15,15,15,12,0,0,12,15,15,
+- 15,15,15,15,15,15,5,0,0,1,1,4,11,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,11,6,1,0,0,0,0,0,0,0,0,0,7,15,
+- 15,15,15,15,15,15,15,14,7,4,4,4,5,9,12,13,
+- 14,15,15,15,15,15,15,15,15,15,15,15,15,15,11,9,
+- 14,15,15,14,12,11,11,11,10,9,7,0,0,5,13,15,
+- 15,15,15,15,15,12,1,0,0,0,0,0,0,10,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,14,7,1,0,0,0,0,0,3,14,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,13,2,0,0,0,0,0,0,0,0,0,0,0,8,
+- 15,15,15,15,15,11,0,0,0,0,0,0,0,9,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,13,5,0,0,0,0,12,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,5,
+- 15,15,15,15,15,15,10,5,6,7,7,7,9,14,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,8,3,2,2,2,2,5,14,15,
+- 15,15,15,15,15,15,15,15,15,10,3,0,6,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,13,3,1,0,1,0,1,1,2,4,4,3,9,14,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,12,4,0,1,6,7,7,4,1,3,13,
+- 15,15,15,15,15,15,15,15,15,15,14,10,13,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,11,11,15,15,15,15,
+- 15,15,15,14,14,14,14,14,14,14,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,14,2,0,4,13,15,15,15,15,10,0,12,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,14,13,14,12,12,12,12,12,12,12,
+- 12,14,15,15,15,15,15,15,15,15,4,14,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,7,1,5,14,15,15,15,15,15,12,1,11,
+- 15,15,15,13,12,13,15,15,14,11,13,15,15,15,15,15,
+- 15,15,15,11,6,3,1,1,1,0,0,0,0,0,0,0,
+- 0,1,4,7,11,14,15,15,15,14,4,15,13,10,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,14,7,4,5,
+- 12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,13,1,1,14,15,15,14,10,12,15,11,1,12,
+- 15,15,11,1,0,4,15,15,6,0,2,14,15,15,15,15,
+- 15,15,14,8,6,3,3,2,2,1,0,0,0,0,0,0,
+- 0,0,0,0,0,3,11,15,15,11,8,15,12,6,15,9,
+- 8,15,15,15,15,15,15,15,15,15,15,15,10,4,4,1,
+- 4,15,15,15,15,11,6,2,8,14,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,12,0,4,15,15,15,11,2,10,15,9,1,13,
+- 15,13,1,7,6,2,14,14,1,2,1,14,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,13,12,12,12,12,12,12,
+- 11,11,11,10,9,10,12,15,15,6,7,15,9,4,15,4,
+- 1,14,15,15,15,15,15,15,15,15,15,15,2,11,15,4,
+- 4,15,15,15,15,3,9,4,0,9,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,12,0,4,15,15,15,5,0,6,6,1,9,15,
+- 15,4,1,13,10,1,13,9,2,7,1,14,14,14,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,3,5,15,3,5,14,1,
+- 0,12,13,9,14,15,15,15,15,15,15,15,2,2,4,1,
+- 6,15,15,15,14,1,5,6,0,9,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,12,0,4,15,15,15,12,4,2,2,10,15,15,
+- 11,0,6,15,12,0,10,7,9,10,1,14,7,14,15,15,
+- 15,15,15,15,15,15,13,12,11,11,10,9,9,10,11,13,
+- 15,15,15,15,15,15,15,15,15,1,9,15,2,7,14,1,
+- 0,10,7,0,8,15,15,15,15,15,15,15,11,4,4,4,
+- 13,15,15,15,15,10,2,2,4,14,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,15,
+- 4,2,14,15,15,1,9,5,14,9,1,14,8,14,15,15,
+- 15,15,15,15,15,10,3,0,1,0,0,0,0,0,0,5,
+- 15,15,15,15,15,15,15,15,15,1,9,14,1,8,14,1,
+- 0,11,13,6,11,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,11,
+- 0,6,15,15,15,1,5,3,13,10,0,6,8,15,15,15,
+- 15,15,15,15,15,15,13,12,12,11,10,9,9,10,11,13,
+- 15,15,15,15,15,15,15,15,15,1,9,12,1,11,15,4,
+- 1,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 14,10,4,2,12,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,12,1,3,14,15,15,15,15,15,15,15,15,4,
+- 3,14,15,15,15,5,1,8,15,14,5,2,9,15,15,15,
+- 15,15,15,15,15,15,15,15,15,11,9,13,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,1,9,12,1,12,15,13,
+- 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 10,2,9,2,3,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,14,4,0,5,14,15,15,15,15,15,15,11,0,
+- 6,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,8,1,0,3,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,1,9,15,11,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 7,1,12,6,1,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,11,1,0,3,8,9,9,10,11,9,5,4,
+- 13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,12,9,13,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,5,11,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 10,3,4,1,5,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,12,2,0,0,0,0,0,0,1,8,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,14,12,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,13,8,8,10,9,10,11,14,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
+- };
+diff -Naur /home/d4rk/goom2k4-0/src/plugin_info.c /src/plugin_info.c
+--- /home/d4rk/goom2k4-0/src/plugin_info.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/plugin_info.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,202 +0,0 @@
+-#include "goom_plugin_info.h"
+-#include "goom_fx.h"
+-#include "cpu_info.h"
+-#include "default_scripts.h"
+-#include "drawmethods.h"
+-#include <math.h>
+-#include <stdio.h>
+-
+-
+-#ifdef CPU_POWERPC
+-#include <sys/types.h>
+-#include <sys/sysctl.h>
+-#include "ppc_zoom_ultimate.h"
+-#include "ppc_drawings.h"
+-#endif /* CPU_POWERPC */
+-
+-
+-#ifdef CPU_X86
+-#include "mmx.h"
+-#endif /* CPU_X86 */
+-
+-
+-
+-static void setOptimizedMethods(PluginInfo *p) {
+-
+- unsigned int cpuFlavour = cpu_flavour();
+-
+- /* set default methods */
+- p->methods.draw_line = draw_line;
+- p->methods.zoom_filter = zoom_filter_c;
+-/* p->methods.create_output_with_brightness = create_output_with_brightness;*/
+-
+-#ifdef CPU_X86
+- if (cpuFlavour & CPU_OPTION_XMMX) {
+-#ifdef VERBOSE
+- printf ("Extented MMX detected. Using the fastest methods !\n");
+-#endif
+- p->methods.draw_line = draw_line_mmx;
+- p->methods.zoom_filter = zoom_filter_xmmx;
+- }
+- else if (cpuFlavour & CPU_OPTION_MMX) {
+-#ifdef VERBOSE
+- printf ("MMX detected. Using fast methods !\n");
+-#endif
+- p->methods.draw_line = draw_line_mmx;
+- p->methods.zoom_filter = zoom_filter_mmx;
+- }
+-#ifdef VERBOSE
+- else
+- printf ("Too bad ! No SIMD optimization available for your CPU.\n");
+-#endif
+-#endif /* CPU_X86 */
+-
+-#ifdef CPU_POWERPC
+-
+- if ((cpuFlavour & CPU_OPTION_64_BITS) != 0) {
+-/* p->methods.create_output_with_brightness = ppc_brightness_G5; */
+- p->methods.zoom_filter = ppc_zoom_generic;
+- }
+- else if ((cpuFlavour & CPU_OPTION_ALTIVEC) != 0) {
+-/* p->methods.create_output_with_brightness = ppc_brightness_G4; */
+- p->methods.zoom_filter = ppc_zoom_G4;
+- }
+- else
+- {
+-/* p->methods.create_output_with_brightness = ppc_brightness_generic;*/
+- p->methods.zoom_filter = ppc_zoom_generic;
+- }
+-#endif /* CPU_POWERPC */
+-
+-}
+-
+-void plugin_info_init(PluginInfo *pp, int nbVisuals) {
+-
+- PluginInfo p;
+- int i;
+-
+- p.sound.speedvar = p.sound.accelvar = p.sound.totalgoom = 0;
+- p.sound.prov_max = 0;
+- p.sound.goom_limit = 1;
+- p.sound.allTimesMax = 1;
+-
+- p.sound.volume_p = secure_f_feedback("Sound Volume");
+- p.sound.accel_p = secure_f_feedback("Sound Acceleration");
+- p.sound.speed_p = secure_f_feedback("Sound Speed");
+- p.sound.goom_limit_p = secure_f_feedback("Goom Limit");
+- p.sound.last_goom_p = secure_f_feedback("Goom Detection");
+- p.sound.last_biggoom_p = secure_f_feedback("Big Goom Detection");
+- p.sound.goom_power_p = secure_f_feedback("Goom Power");
+-
+- p.sound.biggoom_speed_limit_p = secure_i_param("Big Goom Speed Limit");
+- IVAL(p.sound.biggoom_speed_limit_p) = 10;
+- IMIN(p.sound.biggoom_speed_limit_p) = 0;
+- IMAX(p.sound.biggoom_speed_limit_p) = 100;
+- ISTEP(p.sound.biggoom_speed_limit_p) = 1;
+-
+- p.sound.biggoom_factor_p = secure_i_param("Big Goom Factor");
+- IVAL(p.sound.biggoom_factor_p) = 10;
+- IMIN(p.sound.biggoom_factor_p) = 0;
+- IMAX(p.sound.biggoom_factor_p) = 100;
+- ISTEP(p.sound.biggoom_factor_p) = 1;
+-
+- p.sound.params = plugin_parameters ("Sound", 11);
+-
+- p.nbParams = 0;
+- p.nbVisuals = nbVisuals;
+- p.visuals = (VisualFX**)malloc(sizeof(VisualFX*)*nbVisuals);
+-
+- *pp = p;
+- pp->sound.params.params[0] = &pp->sound.biggoom_speed_limit_p;
+- pp->sound.params.params[1] = &pp->sound.biggoom_factor_p;
+- pp->sound.params.params[2] = 0;
+- pp->sound.params.params[3] = &pp->sound.volume_p;
+- pp->sound.params.params[4] = &pp->sound.accel_p;
+- pp->sound.params.params[5] = &pp->sound.speed_p;
+- pp->sound.params.params[6] = 0;
+- pp->sound.params.params[7] = &pp->sound.goom_limit_p;
+- pp->sound.params.params[8] = &pp->sound.goom_power_p;
+- pp->sound.params.params[9] = &pp->sound.last_goom_p;
+- pp->sound.params.params[10] = &pp->sound.last_biggoom_p;
+-
+- pp->statesNumber = 8;
+- pp->statesRangeMax = 510;
+- {
+- GoomState states[8] = {
+- {1,0,0,1,4, 0, 100},
+- {1,0,0,0,1, 101, 140},
+- {1,0,0,1,2, 141, 200},
+- {0,1,0,1,2, 201, 260},
+- {0,1,0,1,0, 261, 330},
+- {0,1,1,1,4, 331, 400},
+- {0,0,1,0,5, 401, 450},
+- {0,0,1,1,1, 451, 510}};
+- for (i=0;i<8;++i)
+- pp->states[i] = states[i];
+- }
+- pp->curGState = &(pp->states[6]);
+-
+- /* datas for the update loop */
+- pp->update.lockvar = 0;
+- pp->update.goomvar = 0;
+- pp->update.loopvar = 0;
+- pp->update.stop_lines = 0;
+- pp->update.ifs_incr = 1; /* dessiner l'ifs (0 = non: > = increment) */
+- pp->update.decay_ifs = 0; /* disparition de l'ifs */
+- pp->update.recay_ifs = 0; /* dedisparition de l'ifs */
+- pp->update.cyclesSinceLastChange = 0;
+- pp->update.drawLinesDuration = 80;
+- pp->update.lineMode= pp->update.drawLinesDuration;
+-
+- pp->update.switchMultAmount = (29.0f/30.0f);
+- pp->update.switchIncrAmount = 0x7f;
+- pp->update.switchMult = 1.0f;
+- pp->update.switchIncr = pp->update.switchIncrAmount;
+-
+- pp->update.stateSelectionRnd = 0;
+- pp->update.stateSelectionBlocker = 0;
+- pp->update.previousZoomSpeed = 128;
+- pp->update.timeOfTitleDisplay = 0;
+-
+- pp->update_message.affiche = 0;
+-
+- {
+- ZoomFilterData zfd = {
+- 127, 8, 16,
+- 1, 1, 0, NORMAL_MODE,
+- 0, 0, 0, 0, 0
+- };
+- pp->update.zoomFilterData = zfd;
+- }
+-
+- setOptimizedMethods(pp);
+-
+- pp->scanner = gsl_new();
+- pp->main_scanner = gsl_new();
+- pp->main_script_str = GOOM_MAIN_SCRIPT;
+-
+- for (i = 0; i < 0xffff; i++) {
+- pp->sintable[i] = (int) (1024 * sin ((double) i * 360 / (sizeof (pp->sintable) / sizeof (pp->sintable[0]) - 1) * 3.141592 / 180) + .5);
+- /* sintable [us] = (int)(1024.0f * sin (us*2*3.31415f/0xffff)) ; */
+- }
+-}
+-
+-void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual) {
+- p->visuals[i] = visual;
+- if (i == p->nbVisuals-1) {
+- ++i;
+- p->nbParams = 1;
+- while (i--) {
+- if (p->visuals[i]->params)
+- p->nbParams++;
+- }
+- p->params = (PluginParameters *)malloc(sizeof(PluginParameters)*p->nbParams);
+- i = p->nbVisuals;
+- p->nbParams = 1;
+- p->params[0] = p->sound.params;
+- while (i--) {
+- if (p->visuals[i]->params)
+- p->params[p->nbParams++] = *(p->visuals[i]->params);
+- }
+- }
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/pngload.c /src/pngload.c
+--- /home/d4rk/goom2k4-0/src/pngload.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/pngload.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,141 +0,0 @@
+-#include <png.h>
+-
+-int
+-loadpng (char *file_name, int *w, int *h, unsigned int ***buf)
+-{
+- FILE *fp;
+- png_uint_32 width, height;
+- int bit_depth,
+-
+- color_type, interlace_type, compression_type, filter_type;
+- int rowbytes;
+-
+- png_structp png_ptr;
+- png_infop info_ptr;
+- png_infop end_info;
+-
+- int x, y;
+- unsigned int **row_pointers;
+-
+- /* OUVERTURE DU FICHIER */
+-
+- fp = fopen (file_name, "rb");
+-
+- if (!fp) {
+- // fprintf (stderr, "Couldn't open file\n");
+- return 1;
+- }
+-
+- /* CREATION DES STRUCTURES */
+- png_ptr = png_create_read_struct
+- (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, NULL, NULL);
+- if (!png_ptr) {
+- fprintf (stderr, "Memory error\n");
+- return 1;
+- }
+-
+- info_ptr = png_create_info_struct (png_ptr);
+- if (!info_ptr) {
+- png_destroy_read_struct (&png_ptr, (png_infopp) NULL, (png_infopp) NULL);
+- fprintf (stderr, "Read error 1\n");
+- return 1;
+- }
+-
+- end_info = png_create_info_struct (png_ptr);
+- if (!end_info) {
+- png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp) NULL);
+- fprintf (stderr, "Read error 2\n");
+- return 1;
+- }
+-
+- /* CHARGEMENT DE L'IMAGE */
+- if (setjmp (png_ptr->jmpbuf)) {
+- png_destroy_read_struct (&png_ptr, &info_ptr, &end_info);
+- fclose (fp);
+- fprintf (stderr, "Erreur de chargement\n");
+- return 1;
+- }
+-
+- png_init_io (png_ptr, fp);
+- png_set_read_status_fn (png_ptr, NULL);
+-
+- png_read_info (png_ptr, info_ptr);
+-
+- png_get_IHDR (png_ptr, info_ptr, &width, &height,
+- &bit_depth, &color_type, &interlace_type,
+- &compression_type, &filter_type);
+-/*
+- printf ("taille : %dx%d\n",width,height);
+- printf ("depth : %d\n",bit_depth);
+- printf ("color type : ");
+- switch (color_type) {
+- case PNG_COLOR_TYPE_GRAY:
+- printf ("PNG_COLOR_TYPE_GRAY (bit depths 1, 2, 4, 8, 16)\n");
+- break;
+- case PNG_COLOR_TYPE_GRAY_ALPHA:
+- printf ("PNG_COLOR_TYPE_GRAY_ALPHA (bit depths 8, 16)\n");
+- break;
+- case PNG_COLOR_TYPE_PALETTE:
+- printf ("PNG_COLOR_TYPE_PALETTE (bit depths 1, 2, 4, 8)\n");
+- break;
+- case PNG_COLOR_TYPE_RGB:
+- printf ("PNG_COLOR_TYPE_RGB (bit_depths 8, 16)\n");
+- break;
+- case PNG_COLOR_TYPE_RGB_ALPHA:
+- printf ("PNG_COLOR_TYPE_RGB_ALPHA (bit_depths 8, 16)\n");
+- break;
+- }
+- */
+- // printf ("PNG_COLOR_MASK_ALPHA : %x\n", PNG_COLOR_MASK_ALPHA);
+- // printf ("PNG_COLOR_MASK_COLOR : %x\n", PNG_COLOR_MASK_COLOR);
+- // printf ("PNG_COLOR_MASK_PALETTE : %x\n", PNG_COLOR_MASK_PALETTE);
+-
+- if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8)
+- png_set_palette_to_rgb (png_ptr);
+-
+- if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
+- png_set_gray_1_2_4_to_8 (png_ptr);
+- else if (color_type == PNG_COLOR_TYPE_GRAY ||
+- color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+- png_set_gray_to_rgb (png_ptr);
+-
+- if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS))
+- png_set_tRNS_to_alpha (png_ptr);
+-
+- png_read_update_info (png_ptr, info_ptr);
+-
+-// printf ("channels : %d\n", png_get_channels (png_ptr, info_ptr));
+- rowbytes = png_get_rowbytes (png_ptr, info_ptr);
+-// printf ("rowbytes : %d\n", rowbytes);
+-
+- row_pointers = (unsigned int **) malloc (height * sizeof (unsigned int *));
+-
+- for (y = 0; y < height; y++)
+- row_pointers[y] = (unsigned int *) malloc (4 * width);
+- png_read_image (png_ptr, (png_bytepp) row_pointers);
+-
+- // for (y=0;y<height;y++) {
+-// for (x=0;x<width;x++) {
+-// if (row_pointers[y][x] & 0xf000)
+- // printf ("%x ",(((unsigned int**)row_pointers)[y][x])&0xf);
+- // else
+-// printf (" ");
+- // }
+- // printf ("\n");
+- // }
+-
+- png_read_end (png_ptr, end_info);
+- png_destroy_read_struct (&png_ptr, &info_ptr, &end_info);
+-
+- (*buf) = (unsigned int **) malloc (height * sizeof (void *));
+-
+- for (y = 0; y < height; y++) {
+- (*buf)[y] = (unsigned int *) malloc (width * 4);
+- for (x = 0; x < width; x++)
+- (*buf)[y][x] = row_pointers[y][x];
+- }
+- *w = width;
+- *h = height;
+-
+- return 0;
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s /src/powerpc/Copie de ppc_zoom_ultimate.s
+--- /home/d4rk/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s 2005-02-07 06:46:41.000000000 -0700
++++ /src/powerpc/Copie de ppc_zoom_ultimate.s 1969-12-31 17:00:00.000000000 -0700
+@@ -1,305 +0,0 @@
+-; PowerPC optimized zoom for Goom
+-; © 2001-2003 Guillaume Borios
+-; This Source Code is released under the terms of the General Public License
+-
+-; Change log :
+-; 21 Dec 2003 : Use of altivec is now determined with a parameter
+-
+-; Section definition : We use a read only section
+-.text
+-
+-; name of the function to call by C program : ppc_zoom
+-; We declare this label as a global to extend its scope outside this file
+-.globl _ppc_zoom_generic
+-.globl _ppc_zoom_G4
+-
+-; Description :
+-; This routine dynamically computes and applies a zoom filter
+-
+-; parameters :
+-; r3 <=> unsigned int * frompixmap
+-; r4 <=> unsigned int * topixmap
+-; r5 <=> unsigned int sizeX (in pixels)
+-; r6 <=> unsigned int sizeY (in pixels)
+-; r7 <=> unsigned int * brutS
+-; r8 <=> unsigned int * brutD
+-; r9 <=> unsigned int buffratio
+-; r10 <=> int [16][16] precalccoeffs
+-
+-; globals after init
+-; r3 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r3)
+-; r4 <=> topixmap - 1 byte needed for preincremental fetch (replaces r4)
+-; r5 <=> ax = x max in 16th of pixels (replaces old r5)
+-; r6 <=> ay = y max in 16th of pixels (replaces old r6)
+-; r20 <=> row size in bytes
+-; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing)
+-; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7)
+-; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8)
+-
+-; ABI notes :
+-; r1 is the Stack Pointer (SP) => Do not use
+-; r13..r31 are non-volatiles => Do not use
+-
+-_ppc_zoom_generic:
+-
+-; Saves the used non volatile registers in the Mach-O stack s Red-Zone
+-stmw r18,-56(r1)
+-
+-; init
+-li r18,0 ; Default value if out of range : 0 (Black)
+-mr r11,r10
+-lis r12,0xFF
+-mullw r2,r5,r6 ; Number of pixels to compute
+-subi r30,r8,0
+-slwi r20,r5,2
+-srawi r19,r20,2
+-ori r12,r12,0xFF
+-subi r5,r5,1
+-subi r6,r6,1
+-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed)
+-subi r31,r7,0
+-subi r4,r4,4
+-slwi r5,r5,4
+-slwi r6,r6,4
+-
+-;pre init for loop
+-lwz r2,0(r31) ; px
+-lwz r29,4(r31) ; py
+-lwz r8,0(r30) ; px2
+-lwz r10,4(r30) ; py2
+-
+-L1:
+-
+-; computes dynamically the position to fetch
+-sub r8,r8,r2
+-sub r10,r10,r29
+-mullw r8,r8,r9
+-addi r31,r31,8
+-mullw r10,r10,r9
+-addi r30,r30,8
+-
+-srawi r8,r8,16
+-srawi r10,r10,16
+-add r2,r2,r8
+-add r29,r29,r10
+-
+-; if px>ax or py>ay goto outofrange
+-; computes the attenuation coeffs and the original point address
+-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16)
+-cmpl cr6,0,r2,r5
+-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10)
+-cmpl cr7,0,r29,r6
+-srawi r29,r29,4 ; pos computing
+-bge- cr6,L4
+-srawi r2,r2,4 ; pos computing
+-mullw r29, r29,r19 ; pos computing
+-bge- cr7,L4
+-
+-; Channels notation : 00112233 (AARRVVBB)
+-
+-add r2,r2,r29 ; pos computing
+-lwzx r10,r11,r10 ; Loads coefs
+-slwi r2,r2,2 ; pos computing
+-add r2,r2,r3 ; pos computing
+-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011)
+-lwz r25,0(r2) ; Loads col1 -> r25
+-lwz r26,4(r2) ; Loads col2 -> r26
+-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022)
+-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033)
+-add r2,r2,r20 ; Adds one line for future load of col3 and col4
+-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX
+-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044)
+-andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00
+-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3
+-
+-
+-; computes final pixel color
+-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX
+-lwz r27,0(r2) ; Loads col3 -> r27
+-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3
+-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2
+-andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00
+-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2
+-lwz r28,4(r2) ; Loads col4 -> r28
+-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3
+-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX
+-add r25,r25,r29 ; Adds col1 & col2 channel 2
+-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3
+-andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00
+-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2
+-lwz r2,0(r31) ; px
+-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3
+-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX
+-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3
+-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2
+-lwz r8,0(r30) ; px2
+-andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00
+-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3
+-lwz r10,4(r30) ; py2
+-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2
+-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8
+-lwz r29,4(r31) ; py
+-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2
+-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF)
+-stwu r7,4(r4) ; Stores the computed pixel
+-bdnz L1 ; Iterate again if needed
+-b L3 ;goto end ; If not, returns from the function
+-
+-
+-; if out of range
+-L4:
+-stwu r18,4(r4)
+-lwz r8,0(r30) ; px2
+-lwz r10,4(r30) ; py2
+-lwz r2,0(r31) ; px
+-lwz r29,4(r31) ; py
+-bdnz L1
+-
+-
+-L3:
+-
+-; Restore saved registers and return
+-lmw r18,-56(r1)
+-blr
+-
+-
+-
+-
+-
+-
+-
+-
+-_ppc_zoom_G4:
+-
+-; Saves the used non volatile registers in the Mach-O stack s Red-Zone
+-stmw r17,-60(r1)
+-
+-; init
+-li r18,0 ; Default value if out of range : 0 (Black)
+-mr r11,r10
+-lis r12,0xFF
+-mullw r2,r5,r6 ; Number of pixels to compute
+-subi r30,r8,0
+-slwi r20,r5,2
+-srawi r19,r20,2
+-ori r12,r12,0xFF
+-subi r5,r5,1
+-subi r6,r6,1
+-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed)
+-subi r31,r7,0
+-subi r4,r4,4
+-slwi r5,r5,4
+-slwi r6,r6,4
+-
+-;pre init for loop
+-lwz r2,0(r31) ; px
+-lwz r29,4(r31) ; py
+-lwz r8,0(r30) ; px2
+-lwz r10,4(r30) ; py2
+-
+-;*********************
+-lis r17,0x0F01
+-
+-L100:
+-
+-; computes dynamically the position to fetch
+-;mullw r8,r8,r29
+-;mullw r2,r2,r29
+-;add r2,r8,r2
+-;srawi r2,r2,17
+-
+-sub r8,r8,r2
+-sub r10,r10,r29
+-mullw r8,r8,r9
+-addi r31,r31,8
+-mullw r10,r10,r9
+-addi r30,r30,8
+-
+-dst r30,r17,0
+-
+-srawi r8,r8,16
+-srawi r10,r10,16
+-add r2,r2,r8
+-add r29,r29,r10
+-
+-dst r31,r17,1
+-
+-; if px>ax or py>ay goto outofrange
+-; computes the attenuation coeffs and the original point address
+-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16)
+-cmpl cr6,0,r2,r5
+-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10)
+-cmpl cr7,0,r29,r6
+-srawi r29,r29,4 ; pos computing
+-bge- cr6,L400
+-srawi r2,r2,4 ; pos computing
+-mullw r29, r29,r19 ; pos computing
+-bge- cr7,L400
+-
+-; Channels notation : 00112233 (AARRVVBB)
+-
+-add r2,r2,r29 ; pos computing
+-lwzx r10,r11,r10 ; Loads coefs
+-slwi r2,r2,2 ; pos computing
+-add r2,r2,r3 ; pos computing
+-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011)
+-lwz r25,0(r2) ; Loads col1 -> r25
+-lwz r26,4(r2) ; Loads col2 -> r26
+-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022)
+-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033)
+-add r2,r2,r20 ; Adds one line for future load of col3 and col4
+-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX
+-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044)
+-dst r2,r17,2
+-andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00
+-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3
+-
+-
+-; computes final pixel color
+-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX
+-lwz r27,0(r2) ; Loads col3 -> r27
+-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3
+-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2
+-andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00
+-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2
+-lwz r28,4(r2) ; Loads col4 -> r28
+-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3
+-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX
+-add r25,r25,r29 ; Adds col1 & col2 channel 2
+-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3
+-andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00
+-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2
+-lwz r2,0(r31) ; px
+-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3
+-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX
+-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3
+-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2
+-lwz r8,0(r30) ; px2
+-andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00
+-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3
+-lwz r10,4(r30) ; py2
+-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2
+-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8
+-lwz r29,4(r31) ; py
+-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2
+-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF)
+-stwu r7,4(r4) ; Stores the computed pixel
+-bdnz L100 ; Iterate again if needed
+-b L300 ;goto end ; If not, returns from the function
+-
+-
+-; if out of range
+-L400:
+-stwu r18,4(r4)
+-lwz r8,0(r30) ; px2
+-lwz r10,4(r30) ; py2
+-lwz r2,0(r31) ; px
+-lwz r29,4(r31) ; py
+-bdnz L100
+-
+-
+-L300:
+-
+-; Restore saved registers and return
+-lmw r17,-60(r1)
+-blr
+diff -Naur /home/d4rk/goom2k4-0/src/powerpc/ppc_doubling.s /src/powerpc/ppc_doubling.s
+--- /home/d4rk/goom2k4-0/src/powerpc/ppc_doubling.s 2005-02-07 06:46:41.000000000 -0700
++++ /src/powerpc/ppc_doubling.s 1969-12-31 17:00:00.000000000 -0700
+@@ -1,50 +0,0 @@
+-.section regular,__TEXT
+-.globl _ppc_doubling ; name of the function to call by C program
+-
+-; width (src width)->r3
+-; myx (src) ->r4
+-; myX (dest) ->r5
+-; myX2 (dest + 1 complete line)->r6
+-; heigth (src height)->r7
+-; inc (increment for next line in dest) ->r8
+-
+-_ppc_doubling:
+-
+-mtspr ctr,r3
+-
+-addi r4,r4,-4
+-addi r5,r5,-4
+-addi r6,r6,-4
+-
+-1:;boucle:
+-
+-lwzu r10,4(r4)
+-stwu r10,4(r5)
+-stwu r10,4(r5)
+-stwu r10,4(r6)
+-stwu r10,4(r6)
+-
+-bdnz 1boucle
+-
+-subi r7,r7,1
+-add r5,r5,r8
+-cmpwi cr1,r7,0
+-add r6,r6,r8
+-mtspr ctr,r3
+-bgt cr1,1boucle
+-
+-blr
+-
+-;backup
+-
+-lwzu r10,4(r4)
+-stwu r10,4(r5)
+-stwu r10,4(r6)
+-stwu r10,4(r5)
+-stwu r10,4(r6)
+-
+-lwzu r10,4(r4)
+-stwu r10,4(r5)
+-stwu r10,4(r6)
+-stwu r10,4(r5)
+-stwu r10,4(r6)
+diff -Naur /home/d4rk/goom2k4-0/src/ppc_drawings.h /src/ppc_drawings.h
+--- /home/d4rk/goom2k4-0/src/ppc_drawings.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/ppc_drawings.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,18 +0,0 @@
+-/*
+- * ppc_drawings.h
+- * Goom
+- *
+- * Created by Guillaume Borios on Sun Dec 28 2003.
+- * Copyright (c) 2003 iOS. All rights reserved.
+- *
+- */
+-
+-/* Generic PowerPC Code */
+-void ppc_brightness_generic(Pixel *src, Pixel *dest, int size, int coeff);
+-
+-/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */
+-void ppc_brightness_G4(Pixel *src, Pixel *dest, int size, int coeff);
+-
+-/* G5 Specific PowerPC Code (Possible use of Altivec) */
+-void ppc_brightness_G5(Pixel *src, Pixel *dest, int size, int coeff);
+-
+diff -Naur /home/d4rk/goom2k4-0/src/ppc_drawings.s /src/ppc_drawings.s
+--- /home/d4rk/goom2k4-0/src/ppc_drawings.s 2005-02-07 06:46:41.000000000 -0700
++++ /src/ppc_drawings.s 1969-12-31 17:00:00.000000000 -0700
+@@ -1,381 +0,0 @@
+-; PowerPC optimized drawing methods for Goom
+-; © 2003 Guillaume Borios
+-; This Source Code is released under the terms of the General Public License
+-
+-; Change log :
+-; 30 May 2003 : File creation
+-
+-; Section definition : We use a read only code section for the whole file
+-.section __TEXT,__text,regular,pure_instructions
+-
+-
+-; --------------------------------------------------------------------------------------
+-; Single 32b pixel drawing macros
+-; Usage :
+-; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4
+-; Only the work registers (WR) can be touched by the macros
+-;
+-; Available methods :
+-; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW)
+-; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST)
+-; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing
+-; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST)
+-; DRAWMETHOD_B_OR_MACRO : Bitwise OR
+-; DRAWMETHOD_BAND_MACRO : Bitwise AND
+-; DRAWMETHOD_BXOR_MACRO : Bitwise XOR
+-; DRAWMETHOD_BNOT_MACRO : Bitwise NOT
+-; --------------------------------------------------------------------------------------
+-
+-.macro DRAWMETHOD_OVRW_MACRO
+- stw $2,0($1) ;; *$1 <- $2
+-.endmacro
+-
+-.macro DRAWMETHOD_B_OR_MACRO
+- lwz $3,0($0) ;; $3 <- *$0
+- or $3,$3,$2 ;; $3 <- $3 | $2
+- stw $3,0($1) ;; *$1 <- $3
+-.endmacro
+-
+-.macro DRAWMETHOD_BAND_MACRO
+- lwz $3,0($0) ;; $3 <- *$0
+- and $3,$3,$2 ;; $3 <- $3 & $2
+- stw $3,0($1) ;; *$1 <- $3
+-.endmacro
+-
+-.macro DRAWMETHOD_BXOR_MACRO
+- lwz $3,0($0) ;; $3 <- *$0
+- xor $3,$3,$2 ;; $3 <- $3 ^ $2
+- stw $3,0($1) ;; *$1 <- $3
+-.endmacro
+-
+-.macro DRAWMETHOD_BNOT_MACRO
+- lwz $3,0($0) ;; $3 <- *$0
+- nand $3,$3,$3 ;; $3 <- ~$3
+- stw $3,0($1) ;; *$1 <- $3
+-.endmacro
+-
+-.macro DRAWMETHOD_PLUS_MACRO
+- lwz $4,0($0) ;; $4 <- *$0
+- andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00
+- andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00
+- add $3,$3,$5 ;; $3 <- $3 + $5
+- rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15)
+- srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension)
+- or $3,$3,$5 ;; $3 <- $3 | $5
+- lis $5,0xFF ;; $5 <- 0x00FF00FF
+- addi $5,$5,0xFF
+- and $4,$4,$5 ;; $4 <- $4 & $5
+- and $6,$2,$5 ;; $6 <- $2 & $5
+- add $4,$4,$6 ;; $4 <- $4 + $6
+- rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7)
+- srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension)
+- rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23)
+- srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension)
+- rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31]
+- or $4,$4,$6 ;; $4 <- $4 | $6
+- rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23]
+- stw $4,0($1) ;; *$1 <- $4
+-.endmacro
+-
+-.macro DRAWMETHOD_HALF_MACRO
+- lwz $4,0($0) ;; $4 <- *$0
+- andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00
+- andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00
+- add $3,$3,$5 ;; $3 <- $3 + $5
+- lis $5,0xFF ;; $5 <- 0x00FF00FF
+- addi $5,$5,0xFF
+- and $4,$4,$5 ;; $4 <- $4 & $5
+- and $5,$2,$5 ;; $5 <- $2 & $5
+- add $4,$4,$5 ;; $4 <- $4 + $5
+- srwi $4,$4,1 ;; $4 <- $4 >> 1
+- rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22]
+- stw $4,0($1) ;; *$1 <- $4
+-.endmacro
+-
+-.macro DRAWMETHOD_DFLT_MACRO
+- DRAWMETHOD_PLUS_MACRO
+-.endmacro
+-
+-; --------------------------------------------------------------------------------------
+-
+-
+-
+-; **************************************************************************************
+-; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col);
+-; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col);
+-; **************************************************************************************
+-.globl _DRAWMETHOD_PLUS_2_PPC
+-.align 3
+-_DRAWMETHOD_PLUS_2_PPC:
+- DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9
+- blr ;; return
+-
+-.globl _DRAWMETHOD_PLUS_PPC
+-.align 3
+-_DRAWMETHOD_PLUS_PPC:
+- DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9
+- blr ;; return
+-
+-
+-; **************************************************************************************
+-; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col);
+-; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col);
+-; **************************************************************************************
+-.globl _DRAWMETHOD_HALF_2_PPC
+-.align 3
+-_DRAWMETHOD_HALF_2_PPC:
+- DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8
+- blr ;; return
+-
+-.globl _DRAWMETHOD_HALF_PPC
+-.align 3
+-_DRAWMETHOD_HALF_PPC:
+- DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7
+- blr ;; return
+-
+-
+-; **************************************************************************************
+-; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col,
+-; unsigned int screenx, unsigned int screeny)
+-; **************************************************************************************
+-.globl _DRAW_LINE_PPC
+-.align 3
+-_DRAW_LINE_PPC:
+- ;; NOT IMPLEMENTED YET
+- blr ;; return
+-
+-
+-; **************************************************************************************
+-; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff)
+-; **************************************************************************************
+-
+-
+-.const
+-.align 4
+-vectorZERO:
+- .long 0,0,0,0
+- .long 0x10101000, 0x10101001, 0x10101002, 0x10101003
+- .long 0x10101004, 0x10101005, 0x10101006, 0x10101007
+- .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B
+- .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F
+-
+-
+-.section __TEXT,__text,regular,pure_instructions
+-
+-.globl _ppc_brightness_G4
+-.align 3
+-_ppc_brightness_G4:
+-
+-
+-;; PowerPC Altivec code
+- srwi r5,r5,2
+- mtctr r5
+-
+-;;vrsave
+- mfspr r11,256
+- lis r12,0xCFFC
+- mtspr 256,r12
+-
+- mflr r0
+- bcl 20,31,"L00000000001$pb"
+-"L00000000001$pb":
+- mflr r10
+- mtlr r0
+-
+- addis r9,r10,ha16(vectorZERO-"L00000000001$pb")
+- addi r9,r9,lo16(vectorZERO-"L00000000001$pb")
+-
+- vxor v0,v0,v0 ;; V0 = NULL vector
+-
+- addi r9,r9,16
+- lvx v10,0,r9
+- addi r9,r9,16
+- lvx v11,0,r9
+- addi r9,r9,16
+- lvx v12,0,r9
+- addi r9,r9,16
+- lvx v13,0,r9
+-
+- addis r9,r10,ha16(vectortmpwork-"L00000000001$pb")
+- addi r9,r9,lo16(vectortmpwork-"L00000000001$pb")
+- stw r6,0(r9)
+- li r6,8
+- stw r6,4(r9)
+- lvx v9,0,r9
+- li r9,128
+- vspltw v8,v9,0
+- vspltw v9,v9,1
+-
+-;; elt counter
+- li r9,0
+- lis r7,0x0F01
+- b L7
+-.align 4
+-L7:
+- lvx v1,r9,r3
+-
+- vperm v4,v1,v0,v10
+- ;*********************
+- add r10,r9,r3
+- ;*********************
+- vperm v5,v1,v0,v11
+- vperm v6,v1,v0,v12
+- vperm v7,v1,v0,v13
+-
+- vmulouh v4,v4,v8
+- ;*********************
+- dst r10,r7,3
+- ;*********************
+- vmulouh v5,v5,v8
+- vmulouh v6,v6,v8
+- vmulouh v7,v7,v8
+- vsrw v4,v4,v9
+- vsrw v5,v5,v9
+- vsrw v6,v6,v9
+- vsrw v7,v7,v9
+-
+- vpkuwus v4,v4,v5
+- vpkuwus v6,v6,v7
+- vpkuhus v1,v4,v6
+-
+- stvx v1,r9,r4
+- addi r9,r9,16
+-
+- bdnz L7
+-
+- mtspr 256,r11
+- blr
+-
+-
+-.globl _ppc_brightness_G5
+-.align 3
+-_ppc_brightness_G5:
+-
+-;; PowerPC Altivec G5 code
+- srwi r5,r5,2
+- mtctr r5
+-
+-;;vrsave
+- mfspr r11,256
+- lis r12,0xCFFC
+- mtspr 256,r12
+-
+- mflr r0
+- bcl 20,31,"L00000000002$pb"
+-"L00000000002$pb":
+- mflr r10
+- mtlr r0
+-
+- addis r9,r10,ha16(vectorZERO-"L00000000002$pb")
+- addi r9,r9,lo16(vectorZERO-"L00000000002$pb")
+-
+- vxor v0,v0,v0 ;; V0 = NULL vector
+-
+- addi r9,r9,16
+- lvx v10,0,r9
+- addi r9,r9,16
+- lvx v11,0,r9
+- addi r9,r9,16
+- lvx v12,0,r9
+- addi r9,r9,16
+- lvx v13,0,r9
+-
+- addis r9,r10,ha16(vectortmpwork-"L00000000002$pb")
+- addi r9,r9,lo16(vectortmpwork-"L00000000002$pb")
+- stw r6,0(r9)
+- li r6,8
+- stw r6,4(r9)
+- lvx v9,0,r9
+- li r9,128
+- vspltw v8,v9,0
+- vspltw v9,v9,1
+-
+-;; elt counter
+- li r9,0
+- lis r7,0x0F01
+- b L6
+-.align 4
+-L6:
+- lvx v1,r9,r3
+-
+- vperm v4,v1,v0,v10
+- ;*********************
+- add r10,r9,r3
+- ;*********************
+- vperm v5,v1,v0,v11
+- vperm v6,v1,v0,v12
+- vperm v7,v1,v0,v13
+-
+- vmulouh v4,v4,v8
+- vmulouh v5,v5,v8
+- vmulouh v6,v6,v8
+- vmulouh v7,v7,v8
+- vsrw v4,v4,v9
+- vsrw v5,v5,v9
+- vsrw v6,v6,v9
+- vsrw v7,v7,v9
+-
+- vpkuwus v4,v4,v5
+- vpkuwus v6,v6,v7
+- vpkuhus v1,v4,v6
+-
+- stvx v1,r9,r4
+- addi r9,r9,16
+-
+- bdnz L6
+-
+- mtspr 256,r11
+- blr
+-
+-
+-.globl _ppc_brightness_generic
+-.align 3
+-_ppc_brightness_generic:
+- lis r12,0x00FF
+- ori r12,r12,0x00FF
+- subi r3,r3,4
+- subi r4,r4,4
+- mtctr r5
+- b L1
+-.align 4
+-L1:
+- lwzu r7,4(r3)
+-
+- rlwinm r8,r7,16,24,31
+- rlwinm r9,r7,24,24,31
+- mullw r8,r8,r6
+- rlwinm r10,r7,0,24,31
+- mullw r9,r9,r6
+- srwi r8,r8,8
+- mullw r10,r10,r6
+- srwi r9,r9,8
+-
+- rlwinm. r11,r8,0,0,23
+- beq L2
+- li r8,0xFF
+-L2:
+- srwi r10,r10,8
+- rlwinm. r11,r9,0,0,23
+- beq L3
+- li r9,0xFF
+-L3:
+- rlwinm r7,r8,16,8,15
+- rlwinm. r11,r10,0,0,23
+- beq L4
+- li r10,0xFF
+-L4:
+- rlwimi r7,r9,8,16,23
+- rlwimi r7,r10,0,24,31
+-
+- stwu r7,4(r4)
+- bdnz L1
+-
+- blr
+-
+-
+-
+-.static_data
+-.align 4
+-vectortmpwork:
+- .long 0,0,0,0
+-
+diff -Naur /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.h /src/ppc_zoom_ultimate.h
+--- /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/ppc_zoom_ultimate.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,14 +0,0 @@
+-/*
+- * ppc_zoom_ultimate.h
+- * Goom
+- *
+- * Created by Guillaume Borios on Sun Dec 28 2003.
+- * Copyright (c) 2003 iOS. All rights reserved.
+- *
+- */
+-
+-/* Generic PowerPC Code */
+-void ppc_zoom_generic (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
+-
+-/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */
+-void ppc_zoom_G4 (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
+\ No newline at end of file
+diff -Naur /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.s /src/ppc_zoom_ultimate.s
+--- /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.s 2005-02-07 06:46:41.000000000 -0700
++++ /src/ppc_zoom_ultimate.s 1969-12-31 17:00:00.000000000 -0700
+@@ -1,323 +0,0 @@
+-; PowerPC optimized zoom for Goom
+-; © 2001-2003 Guillaume Borios
+-; This Source Code is released under the terms of the General Public License
+-
+-; Change log :
+-; 21 Dec 2003 : Use of altivec is now determined with a parameter
+-
+-; Section definition : We use a read only section
+-.text
+-
+-; name of the function to call by C program : ppc_zoom
+-; We declare this label as a global to extend its scope outside this file
+-.globl _ppc_zoom_generic
+-.globl _ppc_zoom_G4
+-
+-; Description :
+-; This routine dynamically computes and applies a zoom filter
+-
+-; parameters :
+-; r3 <=> unsigned int sizeX (in pixels)
+-; r4 <=> unsigned int sizeY (in pixels)
+-; r5 <=> unsigned int * frompixmap
+-; r6 <=> unsigned int * topixmap
+-; r7 <=> unsigned int * brutS
+-; r8 <=> unsigned int * brutD
+-; r9 <=> unsigned int buffratio
+-; r10 <=> int [16][16] precalccoeffs
+-
+-; globals after init
+-; r5 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r5)
+-; r6 <=> topixmap - 1 byte needed for preincremental fetch (replaces r6)
+-; r3 <=> ax = x max in 16th of pixels (replaces old r3)
+-; r4 <=> ay = y max in 16th of pixels (replaces old r4)
+-; r20 <=> row size in bytes
+-; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing)
+-; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7)
+-; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8)
+-
+-; ABI notes :
+-; r1 is the Stack Pointer (SP) => Do not use
+-; r13..r31 are non-volatiles => Do not use
+-
+-_ppc_zoom_generic:
+-
+-; Saves the used non volatile registers in the Mach-O stack s Red-Zone
+-stmw r18,-56(r1)
+-
+-; init
+-li r18,0 ; Default value if out of range : 0 (Black)
+-mr r11,r10
+-lis r12,0xFF
+-mullw r2,r3,r4 ; Number of pixels to compute
+-subi r30,r8,0
+-slwi r20,r3,2
+-srawi r19,r20,2
+-ori r12,r12,0xFF
+-subi r3,r3,1
+-subi r4,r4,1
+-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed)
+-subi r31,r7,0
+-subi r6,r6,4
+-slwi r3,r3,4
+-slwi r4,r4,4
+-
+-;pre init for loop
+-lwz r2,0(r31) ; px
+-lwz r29,4(r31) ; py
+-lwz r8,0(r30) ; px2
+-lwz r10,4(r30) ; py2
+-
+-b L1
+-.align 5
+-L1:
+-
+-; computes dynamically the position to fetch
+-sub r8,r8,r2
+-sub r10,r10,r29
+-mullw r8,r8,r9
+-addi r31,r31,8
+-mullw r10,r10,r9
+-addi r30,r30,8
+-
+-srawi r8,r8,16
+-srawi r10,r10,16
+-add r2,r2,r8
+-add r29,r29,r10
+-
+-; if px>ax or py>ay goto outofrange
+-; computes the attenuation coeffs and the original point address
+-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16)
+-cmpl cr4,0,r2,r3
+-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10)
+-cmpl cr7,0,r29,r4
+-srawi r29,r29,4 ; pos computing
+-bge- cr4,L4
+-srawi r2,r2,4 ; pos computing
+-mullw r29, r29,r19 ; pos computing
+-bge- cr7,L4
+-
+-; Channels notation : 00112233 (AARRVVBB)
+-
+-add r2,r2,r29 ; pos computing
+-lwzx r10,r11,r10 ; Loads coefs
+-slwi r2,r2,2 ; pos computing
+-add r2,r2,r5 ; pos computing
+-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011)
+-lwz r25,0(r2) ; Loads col1 -> r25
+-lwz r26,4(r2) ; Loads col2 -> r26
+-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022)
+-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033)
+-add r2,r2,r20 ; Adds one line for future load of col3 and col4
+-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX
+-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044)
+-andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00
+-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3
+-
+-
+-; computes final pixel color
+-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX
+-lwz r27,0(r2) ; Loads col3 -> r27
+-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3
+-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2
+-andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00
+-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2
+-lwz r28,4(r2) ; Loads col4 -> r28
+-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3
+-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX
+-add r25,r25,r29 ; Adds col1 & col2 channel 2
+-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3
+-andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00
+-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2
+-lwz r2,0(r31) ; px
+-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3
+-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX
+-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3
+-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2
+-lwz r8,0(r30) ; px2
+-andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00
+-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3
+-lwz r10,4(r30) ; py2
+-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2
+-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8
+-lwz r29,4(r31) ; py
+-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2
+-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF)
+-stwu r7,4(r6) ; Stores the computed pixel
+-bdnz L1 ; Iterate again if needed
+-b L3 ;goto end ; If not, returns from the function
+-
+-
+-; if out of range
+-L4:
+-stwu r18,4(r6)
+-lwz r8,0(r30) ; px2
+-lwz r10,4(r30) ; py2
+-lwz r2,0(r31) ; px
+-lwz r29,4(r31) ; py
+-bdnz L1
+-
+-
+-L3:
+-
+-; Restore saved registers and return
+-lmw r18,-56(r1)
+-blr
+-
+-
+-
+-
+-
+-
+-
+-
+-_ppc_zoom_G4:
+-
+-; Saves the used non volatile registers in the Mach-O stack s Red-Zone
+-stmw r17,-60(r1)
+-
+-; init
+-li r18,0 ; Default value if out of range : 0 (Black)
+-mr r11,r10
+-lis r12,0xFF
+-mullw r2,r3,r4 ; Number of pixels to compute
+-subi r30,r8,0
+-slwi r20,r3,2
+-srawi r19,r20,2
+-ori r12,r12,0xFF
+-subi r3,r3,1
+-subi r4,r4,1
+-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed)
+-subi r31,r7,0
+-subi r6,r6,4
+-slwi r3,r3,4
+-slwi r4,r4,4
+-
+-;pre init for loop
+-lwz r2,0(r31) ; px
+-lwz r29,4(r31) ; py
+-lwz r8,0(r30) ; px2
+-lwz r10,4(r30) ; py2
+-
+-;*********************
+-lis r17,0x0F01
+-
+-b L100
+-.align 5
+-L100:
+-
+-addi r6,r6,4
+-
+-; Optimization to ensure the destination buffer
+-; won't be loaded into the data cache
+-rlwinm. r0,r6,0,27,31
+-bne+ L500
+-dcbz 0,r6
+-;dcba 0,r6
+-L500:
+-
+-; computes dynamically the position to fetch
+-;mullw r8,r8,r29
+-;mullw r2,r2,r29
+-;add r2,r8,r2
+-;srawi r2,r2,17
+-
+-sub r8,r8,r2
+-sub r10,r10,r29
+-mullw r8,r8,r9
+-addi r31,r31,8
+-mullw r10,r10,r9
+-addi r30,r30,8
+-
+-dst r30,r17,0
+-
+-srawi r8,r8,16
+-srawi r10,r10,16
+-add r2,r2,r8
+-add r29,r29,r10
+-
+-dst r31,r17,1
+-
+-; if px>ax or py>ay goto outofrange
+-; computes the attenuation coeffs and the original point address
+-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16)
+-cmpl cr4,0,r2,r3
+-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10)
+-cmpl cr7,0,r29,r4
+-srawi r29,r29,4 ; pos computing
+-bge- cr4,L400
+-srawi r2,r2,4 ; pos computing
+-mullw r29, r29,r19 ; pos computing
+-bge- cr7,L400
+-
+-; Channels notation : 00112233 (AARRVVBB)
+-
+-add r2,r2,r29 ; pos computing
+-lwzx r10,r11,r10 ; Loads coefs
+-slwi r2,r2,2 ; pos computing
+-add r2,r2,r5 ; pos computing
+-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011)
+-lwz r25,0(r2) ; Loads col1 -> r25
+-lwz r26,4(r2) ; Loads col2 -> r26
+-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022)
+-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033)
+-add r2,r2,r20 ; Adds one line for future load of col3 and col4
+-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX
+-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044)
+-dst r2,r17,2
+-rlwinm r25,r25,0,16,23 ; Masks col1 channel 2 : 0x0000XX00
+-;andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00
+-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3
+-
+-
+-; computes final pixel color
+-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX
+-lwz r27,0(r2) ; Loads col3 -> r27
+-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3
+-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2
+-rlwinm r29,r26,0,16,23 ; Masks col2 channel 2 : 0x0000XX00
+-;andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00
+-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2
+-lwz r28,4(r2) ; Loads col4 -> r28
+-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3
+-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX
+-add r25,r25,r29 ; Adds col1 & col2 channel 2
+-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3
+-rlwinm r29,r27,0,16,23 ; Masks col3 channel 2 : 0x0000XX00
+-;andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00
+-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2
+-lwz r2,0(r31) ; px
+-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3
+-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX
+-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3
+-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2
+-lwz r8,0(r30) ; px2
+-rlwinm r28,r28,0,16,23 ; Masks col4 channel 2 : 0x0000XX00
+-;andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00
+-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3
+-lwz r10,4(r30) ; py2
+-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2
+-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8
+-lwz r29,4(r31) ; py
+-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2
+-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF)
+-stw r7,0(r6) ; Stores the computed pixel
+-bdnz L100 ; Iterate again if needed
+-b L300 ;goto end ; If not, returns from the function
+-
+-
+-; if out of range
+-L400:
+-stw r18,0(r6)
+-lwz r8,0(r30) ; px2
+-lwz r10,4(r30) ; py2
+-lwz r2,0(r31) ; px
+-lwz r29,4(r31) ; py
+-bdnz L100
+-
+-
+-L300:
+-
+-; Restore saved registers and return
+-lmw r17,-60(r1)
+-blr
+diff -Naur /home/d4rk/goom2k4-0/src/sound_tester.c /src/sound_tester.c
+--- /home/d4rk/goom2k4-0/src/sound_tester.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/sound_tester.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,138 +0,0 @@
+-#include "sound_tester.h"
+-
+-#include <stdlib.h>
+-#include <string.h>
+-
+-/* some constants */
+-#define BIG_GOOM_DURATION 100
+-#define BIG_GOOM_SPEED_LIMIT 0.1f
+-
+-#define ACCEL_MULT 0.95f
+-#define SPEED_MULT 0.99f
+-
+-
+-void evaluate_sound(gint16 data[2][512], SoundInfo *info) {
+-
+- int i;
+- float difaccel;
+- float prevspeed;
+-
+- /* find the max */
+- int incvar = 0;
+- for (i = 0; i < 512; i+=2) {
+- if (incvar < data[0][i])
+- incvar = data[0][i];
+- }
+-
+- if (incvar > info->allTimesMax)
+- info->allTimesMax = incvar;
+-
+- /* volume sonore */
+- info->volume = (float)incvar / (float)info->allTimesMax;
+- memcpy(info->samples[0],data[0],512*sizeof(short));
+- memcpy(info->samples[1],data[1],512*sizeof(short));
+-
+- difaccel = info->accelvar;
+- info->accelvar = info->volume; /* accel entre 0 et 1 */
+-
+- /* transformations sur la vitesse du son */
+- if (info->speedvar > 1.0f)
+- info->speedvar = 1.0f;
+-
+- if (info->speedvar < 0.1f)
+- info->accelvar *= (1.0f - (float)info->speedvar);
+- else if (info->speedvar < 0.3f)
+- info->accelvar *= (0.9f - (float)(info->speedvar-0.1f)/2.0f);
+- else
+- info->accelvar *= (0.8f - (float)(info->speedvar-0.3f)/4.0f);
+-
+- /* adoucissement de l'acceleration */
+- info->accelvar *= ACCEL_MULT;
+- if (info->accelvar < 0)
+- info->accelvar = 0;
+-
+- difaccel = info->accelvar - difaccel;
+- if (difaccel < 0)
+- difaccel = - difaccel;
+-
+- /* mise a jour de la vitesse */
+- prevspeed = info->speedvar;
+- info->speedvar = (info->speedvar + difaccel * 0.5f) / 2;
+- info->speedvar *= SPEED_MULT;
+- info->speedvar = (info->speedvar + 3.0f * prevspeed) / 4.0f;
+- if (info->speedvar < 0)
+- info->speedvar = 0;
+- if (info->speedvar > 1)
+- info->speedvar = 1;
+-
+- /* temps du goom */
+- info->timeSinceLastGoom++;
+- info->timeSinceLastBigGoom++;
+- info->cycle++;
+-
+- /* detection des nouveaux gooms */
+- if ((info->speedvar > (float)IVAL(info->biggoom_speed_limit_p)/100.0f)
+- && (info->accelvar > info->bigGoomLimit)
+- && (info->timeSinceLastBigGoom > BIG_GOOM_DURATION)) {
+- info->timeSinceLastBigGoom = 0;
+- }
+-
+- if (info->accelvar > info->goom_limit) {
+- /* TODO: tester && (info->timeSinceLastGoom > 20)) { */
+- info->totalgoom ++;
+- info->timeSinceLastGoom = 0;
+- info->goomPower = info->accelvar - info->goom_limit;
+- }
+-
+- if (info->accelvar > info->prov_max)
+- info->prov_max = info->accelvar;
+-
+- if (info->goom_limit>1)
+- info->goom_limit=1;
+-
+- /* toute les 2 secondes : vérifier si le taux de goom est correct
+- * et le modifier sinon.. */
+- if (info->cycle % 64 == 0) {
+- if (info->speedvar<0.01f)
+- info->goom_limit *= 0.91;
+- if (info->totalgoom > 4) {
+- info->goom_limit+=0.02;
+- }
+- if (info->totalgoom > 7) {
+- info->goom_limit*=1.03f;
+- info->goom_limit+=0.03;
+- }
+- if (info->totalgoom > 16) {
+- info->goom_limit*=1.05f;
+- info->goom_limit+=0.04;
+- }
+- if (info->totalgoom == 0) {
+- info->goom_limit = info->prov_max - 0.02;
+- }
+- if ((info->totalgoom == 1) && (info->goom_limit > 0.02))
+- info->goom_limit-=0.01;
+- info->totalgoom = 0;
+- info->bigGoomLimit = info->goom_limit * (1.0f + (float)IVAL(info->biggoom_factor_p)/500.0f);
+- info->prov_max = 0;
+- }
+-
+- /* mise a jour des parametres pour la GUI */
+- FVAL(info->volume_p) = info->volume;
+- info->volume_p.change_listener(&info->volume_p);
+- FVAL(info->speed_p) = info->speedvar * 4;
+- info->speed_p.change_listener(&info->speed_p);
+- FVAL(info->accel_p) = info->accelvar;
+- info->accel_p.change_listener(&info->accel_p);
+-
+- FVAL(info->goom_limit_p) = info->goom_limit;
+- info->goom_limit_p.change_listener(&info->goom_limit_p);
+- FVAL(info->goom_power_p) = info->goomPower;
+- info->goom_power_p.change_listener(&info->goom_power_p);
+- FVAL(info->last_goom_p) = 1.0-((float)info->timeSinceLastGoom/20.0f);
+- info->last_goom_p.change_listener(&info->last_goom_p);
+- FVAL(info->last_biggoom_p) = 1.0-((float)info->timeSinceLastBigGoom/40.0f);
+- info->last_biggoom_p.change_listener(&info->last_biggoom_p);
+-
+- /* bigGoomLimit ==goomLimit*9/8+7 ? */
+- }
+-
+diff -Naur /home/d4rk/goom2k4-0/src/sound_tester.h /src/sound_tester.h
+--- /home/d4rk/goom2k4-0/src/sound_tester.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/sound_tester.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,11 +0,0 @@
+-#ifndef _SOUND_TESTER_H
+-#define _SOUND_TESTER_H
+-
+-#include "goom_plugin_info.h"
+-#include "goom_config.h"
+-
+-/** change les donnees du SoundInfo */
+-void evaluate_sound(gint16 data[2][512], SoundInfo *sndInfo);
+-
+-#endif
+-
+diff -Naur /home/d4rk/goom2k4-0/src/surf3d.c /src/surf3d.c
+--- /home/d4rk/goom2k4-0/src/surf3d.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/surf3d.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,107 +0,0 @@
+-#include "surf3d.h"
+-#include "goom_plugin_info.h"
+-#include <stdlib.h>
+-#include <stdio.h>
+-#include <string.h>
+-
+-grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center) {
+- int x = defx;
+- int y = defz;
+- grid3d *g = malloc (sizeof(grid3d));
+- surf3d *s = &(g->surf);
+- s->nbvertex = x*y;
+- s->vertex = malloc (x*y*sizeof(v3d));
+- s->svertex = malloc (x*y*sizeof(v3d));
+- s->center = center;
+-
+- g->defx=defx;
+- g->sizex=sizex;
+- g->defz=defz;
+- g->sizez=sizez;
+- g->mode=0;
+-
+- while (y) {
+- --y;
+- x = defx;
+- while (x) {
+- --x;
+- s->vertex[x+defx*y].x = (float)(x-defx/2)*sizex/defx;
+- s->vertex[x+defx*y].y = 0;
+- s->vertex[x+defx*y].z = (float)(y-defz/2)*sizez/defz;
+- }
+- }
+- return g;
+-}
+-
+-void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow,
+- int dist, Pixel *buf, Pixel *back, int W,int H) {
+-
+- int x;
+- v2d v2,v2x;
+-
+- v2d *v2_array = malloc(g->surf.nbvertex * sizeof(v2d));
+- v3d_to_v2d(g->surf.svertex, g->surf.nbvertex, W, H, dist, v2_array);
+-
+- for (x=0;x<g->defx;x++) {
+- int z;
+- v2x = v2_array[x];
+-
+- for (z=1;z<g->defz;z++) {
+- v2 = v2_array[z*g->defx + x];
+- if (((v2.x != -666) || (v2.y!=-666))
+- && ((v2x.x != -666) || (v2x.y!=-666))) {
+- plug->methods.draw_line (buf,v2x.x,v2x.y,v2.x,v2.y, colorlow, W, H);
+- plug->methods.draw_line (back,v2x.x,v2x.y,v2.x,v2.y, color, W, H);
+- }
+- v2x = v2;
+- }
+- }
+-
+- free(v2_array);
+-}
+-
+-void surf3d_rotate (surf3d *s, float angle) {
+- int i;
+- float cosa;
+- float sina;
+- SINCOS(angle,sina,cosa);
+- for (i=0;i<s->nbvertex;i++) {
+- Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina);
+- }
+-}
+-
+-void surf3d_translate (surf3d *s) {
+- int i;
+- for (i=0;i<s->nbvertex;i++) {
+- TRANSLATE_V3D(s->center,s->svertex[i]);
+- }
+-}
+-
+-void grid3d_update (grid3d *g, float angle, float *vals, float dist) {
+- int i;
+- float cosa;
+- float sina;
+- surf3d *s = &(g->surf);
+- v3d cam = s->center;
+- cam.z += dist;
+-
+- SINCOS((angle/4.3f),sina,cosa);
+- cam.y += sina*2.0f;
+- SINCOS(angle,sina,cosa);
+-
+- if (g->mode==0) {
+- if (vals)
+- for (i=0;i<g->defx;i++)
+- s->vertex[i].y = s->vertex[i].y*0.2 + vals[i]*0.8;
+-
+- for (i=g->defx;i<s->nbvertex;i++) {
+- s->vertex[i].y *= 0.255f;
+- s->vertex[i].y += (s->vertex[i-g->defx].y * 0.777f);
+- }
+- }
+-
+- for (i=0;i<s->nbvertex;i++) {
+- Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina);
+- TRANSLATE_V3D(cam,s->svertex[i]);
+- }
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/surf3d.h /src/surf3d.h
+--- /home/d4rk/goom2k4-0/src/surf3d.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/surf3d.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,38 +0,0 @@
+-#ifndef _SURF3D_H
+-#define _SURF3D_H
+-
+-#include "v3d.h"
+-#include "goom_graphic.h"
+-#include "goom_typedefs.h"
+-
+-typedef struct {
+- v3d *vertex;
+- v3d *svertex;
+- int nbvertex;
+-
+- v3d center;
+-} surf3d;
+-
+-typedef struct {
+- surf3d surf;
+-
+- int defx;
+- int sizex;
+- int defz;
+- int sizez;
+- int mode;
+-} grid3d;
+-
+-/* hi-level */
+-
+-/* works on grid3d */
+-grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center);
+-void grid3d_update (grid3d *s, float angle, float *vals, float dist);
+-
+-/* low level */
+-void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H);
+-void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, int dist, Pixel *buf, Pixel *back, int W,int H);
+-void surf3d_rotate (surf3d *s, float angle);
+-void surf3d_translate (surf3d *s);
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/surf3d.s /src/surf3d.s
+--- /home/d4rk/goom2k4-0/src/surf3d.s 2005-02-07 06:46:41.000000000 -0700
++++ /src/surf3d.s 1969-12-31 17:00:00.000000000 -0700
+@@ -1,484 +0,0 @@
+- .file "surf3d.c"
+- .version "01.01"
+-gcc2_compiled.:
+-.text
+- .align 4
+-.globl grid3d_new
+- .type grid3d_new,@function
+-grid3d_new:
+- pushl %ebp
+- movl %esp,%ebp
+- subl $44,%esp
+- pushl %edi
+- pushl %esi
+- pushl %ebx
+- movl 20(%ebp),%eax
+- movl 12(%ebp),%esi
+- movl %eax,-8(%ebp)
+- addl $-12,%esp
+- pushl $44
+- call malloc
+- movl %esi,%edx
+- imull -8(%ebp),%edx
+- movl %eax,%edi
+- movl %edx,-12(%ebp)
+- leal (%edx,%edx,2),%ebx
+- movl %edx,8(%edi)
+- addl $-12,%esp
+- sall $2,%ebx
+- pushl %ebx
+- call malloc
+- addl $32,%esp
+- movl %eax,(%edi)
+- addl $-12,%esp
+- pushl %ebx
+- call malloc
+- movl %eax,4(%edi)
+- movl 24(%ebp),%eax
+- movl %eax,12(%edi)
+- movl 28(%ebp),%eax
+- movl %eax,16(%edi)
+- movl 32(%ebp),%eax
+- movl %eax,20(%edi)
+- movl 8(%ebp),%eax
+- movl %eax,28(%edi)
+- movl %esi,24(%edi)
+- movl -8(%ebp),%edx
+- movl 16(%ebp),%eax
+- movl %edx,32(%edi)
+- movl %eax,36(%edi)
+- movl $0,40(%edi)
+- testl %edx,%edx
+- je .L480
+- movl %esi,%eax
+- movl %esi,-28(%ebp)
+- shrl $31,%eax
+- addl %eax,%esi
+- movl -8(%ebp),%eax
+- shrl $31,%eax
+- addl -8(%ebp),%eax
+- movl -12(%ebp),%edx
+- sarl $1,%eax
+- movl %edx,-24(%ebp)
+- negl -28(%ebp)
+- movl %esi,-16(%ebp)
+- movl %eax,-20(%ebp)
+- .p2align 4,,7
+-.L481:
+- movl -28(%ebp),%eax
+- addl %eax,-24(%ebp)
+- decl -8(%ebp)
+- movl 12(%ebp),%esi
+- testl %esi,%esi
+- je .L479
+- movl -8(%ebp),%eax
+- subl -20(%ebp),%eax
+- movl %eax,-4(%ebp)
+- fildl -4(%ebp)
+- movl %esi,-4(%ebp)
+- movl -24(%ebp),%edx
+- leal (%edx,%esi),%eax
+- movl -16(%ebp),%ebx
+- fildl 16(%ebp)
+- leal (%eax,%eax,2),%eax
+- sarl $1,%ebx
+- leal 0(,%eax,4),%ecx
+- fmulp %st,%st(1)
+- fildl 20(%ebp)
+- fdivrp %st,%st(1)
+- fildl 8(%ebp)
+- fildl -4(%ebp)
+- jmp .L484
+-.L487:
+- fxch %st(2)
+- .p2align 4,,7
+-.L484:
+- decl %esi
+- movl %esi,%eax
+- movl (%edi),%edx
+- subl %ebx,%eax
+- movl %eax,-4(%ebp)
+- fildl -4(%ebp)
+- addl $-12,%ecx
+- fmul %st(2),%st
+- fdiv %st(1),%st
+- fstps (%edx,%ecx)
+- fxch %st(2)
+- movl (%edi),%eax
+- movl $0,4(%eax,%ecx)
+- movl (%edi),%eax
+- fsts 8(%eax,%ecx)
+- testl %esi,%esi
+- jne .L487
+- fstp %st(0)
+- fstp %st(0)
+- fstp %st(0)
+-.L479:
+- cmpl $0,-8(%ebp)
+- jne .L481
+-.L480:
+- leal -56(%ebp),%esp
+- popl %ebx
+- movl %edi,%eax
+- popl %esi
+- popl %edi
+- leave
+- ret
+-.Lfe1:
+- .size grid3d_new,.Lfe1-grid3d_new
+-.section .rodata
+- .align 8
+-.LC48:
+- .long 0x0,0x3fe00000
+- .align 4
+-.LC49:
+- .long 0x3f19999a
+- .align 4
+-.LC50:
+- .long 0x3ee3d70a
+-.text
+- .align 4
+-.globl grid3d_update
+- .type grid3d_update,@function
+-grid3d_update:
+- pushl %ebp
+- movl %esp,%ebp
+- subl $32,%esp
+- pushl %esi
+- pushl %ebx
+- flds 12(%ebp)
+- movl 8(%ebp),%ebx
+- movl 16(%ebp),%ecx
+- fld %st(0)
+-#APP
+- fsin
+-#NO_APP
+- fstps -4(%ebp)
+- flds -4(%ebp)
+- fxch %st(1)
+-#APP
+- fcos
+-#NO_APP
+- fstps -4(%ebp)
+- flds -4(%ebp)
+- cmpl $0,40(%ebx)
+- jne .L519
+- testl %ecx,%ecx
+- je .L520
+- xorl %esi,%esi
+- cmpl 24(%ebx),%esi
+- jge .L520
+- fldl .LC48
+- xorl %edx,%edx
+- .p2align 4,,7
+-.L524:
+- movl (%ebx),%eax
+- fld %st(0)
+- fld %st(1)
+- fxch %st(1)
+- fmuls 4(%eax,%edx)
+- fxch %st(1)
+- fmuls (%ecx,%esi,4)
+- faddp %st,%st(1)
+- incl %esi
+- fstps 4(%eax,%edx)
+- addl $12,%edx
+- cmpl 24(%ebx),%esi
+- jl .L524
+- fstp %st(0)
+-.L520:
+- movl 24(%ebx),%esi
+- cmpl 8(%ebx),%esi
+- jge .L519
+- leal (%esi,%esi,2),%eax
+- flds .LC49
+- flds .LC50
+- leal 0(,%eax,4),%ecx
+- .p2align 4,,7
+-.L529:
+- movl (%ebx),%eax
+- flds 4(%eax,%ecx)
+- fmul %st(2),%st
+- fstps 4(%eax,%ecx)
+- movl %esi,%eax
+- subl 24(%ebx),%eax
+- movl (%ebx),%edx
+- leal (%eax,%eax,2),%eax
+- flds 4(%edx,%eax,4)
+- fmul %st(1),%st
+- fadds 4(%edx,%ecx)
+- incl %esi
+- fstps 4(%edx,%ecx)
+- addl $12,%ecx
+- cmpl 8(%ebx),%esi
+- jl .L529
+- fstp %st(0)
+- fstp %st(0)
+-.L519:
+- xorl %esi,%esi
+- cmpl 8(%ebx),%esi
+- jge .L536
+- xorl %ecx,%ecx
+- .p2align 4,,7
+-.L534:
+- movl (%ebx),%eax
+- flds (%eax,%ecx)
+- flds 8(%eax,%ecx)
+- fmul %st(2),%st
+- fxch %st(1)
+- fmul %st(3),%st
+- fsubp %st,%st(1)
+- movl 4(%ebx),%edx
+- incl %esi
+- fstps (%edx,%ecx)
+- movl (%ebx),%eax
+- flds (%eax,%ecx)
+- flds 8(%eax,%ecx)
+- fxch %st(1)
+- fmul %st(2),%st
+- fxch %st(1)
+- fmul %st(3),%st
+- faddp %st,%st(1)
+- movl 4(%ebx),%edx
+- fstps 8(%edx,%ecx)
+- movl (%ebx),%eax
+- flds 4(%eax,%ecx)
+- movl 4(%ebx),%edx
+- fstps 4(%edx,%ecx)
+- movl 4(%ebx),%eax
+- flds (%eax,%ecx)
+- fadds 12(%ebx)
+- fstps (%eax,%ecx)
+- movl 4(%ebx),%eax
+- flds 4(%eax,%ecx)
+- fadds 16(%ebx)
+- fstps 4(%eax,%ecx)
+- movl 4(%ebx),%eax
+- flds 8(%eax,%ecx)
+- fadds 20(%ebx)
+- fstps 8(%eax,%ecx)
+- addl $12,%ecx
+- cmpl 8(%ebx),%esi
+- jl .L534
+-.L536:
+- fstp %st(0)
+- fstp %st(0)
+- popl %ebx
+- popl %esi
+- leave
+- ret
+-.Lfe2:
+- .size grid3d_update,.Lfe2-grid3d_update
+-.section .rodata
+- .align 4
+-.LC51:
+- .long 0x40000000
+- .align 8
+-.LC52:
+- .long 0x0,0x42380000
+-.text
+- .align 4
+-.globl surf3d_draw
+- .type surf3d_draw,@function
+-surf3d_draw:
+- pushl %ebp
+- movl %esp,%ebp
+- subl $60,%esp
+- pushl %edi
+- pushl %esi
+- pushl %ebx
+- movl $0,-20(%ebp)
+- movl -20(%ebp),%edx
+- movl 8(%ebp),%eax
+- cmpl 8(%eax),%edx
+- jge .L493
+- fldl .LC52
+- flds .LC51
+- xorl %edi,%edi
+- .p2align 4,,7
+-.L495:
+- movl 8(%ebp),%eax
+- movl 4(%eax),%eax
+- movl %eax,-36(%ebp)
+- fcoms 8(%eax,%edi)
+- fnstsw %ax
+- andb $69,%ah
+- cmpb $1,%ah
+- jne .L496
+- fildl 16(%ebp)
+- movl -36(%ebp),%edx
+- fld %st(0)
+- fmuls (%edx,%edi)
+- fdivs 8(%edx,%edi)
+- fld %st(3)
+- faddp %st,%st(1)
+- fstpl -32(%ebp)
+- movl -32(%ebp),%eax
+- movl -28(%ebp),%edx
+- movl %eax,-40(%ebp)
+- sarl $16,-40(%ebp)
+- movl -36(%ebp),%edx
+- fmuls 4(%edx,%edi)
+- fdivs 8(%edx,%edi)
+- movl -40(%ebp),%ecx
+- fld %st(2)
+- faddp %st,%st(1)
+- fstpl -32(%ebp)
+- movl -32(%ebp),%eax
+- movl -28(%ebp),%edx
+- movl %eax,-44(%ebp)
+- movl 28(%ebp),%eax
+- sarl $1,%eax
+- addl %eax,%ecx
+- movl 32(%ebp),%eax
+- sarl $16,-44(%ebp)
+- sarl $1,%eax
+- movl %ecx,%ebx
+- subl -44(%ebp),%eax
+- movl %eax,%esi
+- cmpl 28(%ebp),%ebx
+- jge .L496
+- testl %ecx,%ecx
+- jl .L496
+- cmpl 32(%ebp),%esi
+- jge .L496
+- testl %eax,%eax
+- jge .L499
+-.L496:
+- xorl %esi,%esi
+- xorl %ebx,%ebx
+-.L499:
+- movl 20(%ebp),%eax
+- movl %ebx,%edx
+- leal (%eax,%edx,4),%edx
+- movl 28(%ebp),%eax
+- imull %esi,%eax
+- leal (%edx,%eax,4),%eax
+- testl %ebx,%ebx
+- je .L494
+- testl %esi,%esi
+- je .L494
+-#APP
+- movd (%eax), %mm0
+- paddusb 12(%ebp), %mm0
+- movd %mm0, (%eax)
+-#NO_APP
+-.L494:
+- incl -20(%ebp)
+- addl $12,%edi
+- movl -20(%ebp),%eax
+- movl 8(%ebp),%edx
+- cmpl 8(%edx),%eax
+- jl .L495
+- fstp %st(0)
+- fstp %st(0)
+-.L493:
+- popl %ebx
+- popl %esi
+- popl %edi
+- leave
+- ret
+-.Lfe3:
+- .size surf3d_draw,.Lfe3-surf3d_draw
+- .align 4
+-.globl surf3d_rotate
+- .type surf3d_rotate,@function
+-surf3d_rotate:
+- pushl %ebp
+- movl %esp,%ebp
+- subl $32,%esp
+- pushl %esi
+- pushl %ebx
+- flds 12(%ebp)
+- movl 8(%ebp),%ebx
+- fld %st(0)
+-#APP
+- fsin
+-#NO_APP
+- fstps -4(%ebp)
+- flds -4(%ebp)
+- fxch %st(1)
+-#APP
+- fcos
+-#NO_APP
+- fstps -4(%ebp)
+- xorl %esi,%esi
+- flds -4(%ebp)
+- cmpl 8(%ebx),%esi
+- jge .L537
+- xorl %ecx,%ecx
+- .p2align 4,,7
+-.L508:
+- movl (%ebx),%eax
+- flds (%eax,%ecx)
+- flds 8(%eax,%ecx)
+- fmul %st(2),%st
+- fxch %st(1)
+- fmul %st(3),%st
+- fsubp %st,%st(1)
+- movl 4(%ebx),%edx
+- incl %esi
+- fstps (%edx,%ecx)
+- movl (%ebx),%eax
+- flds (%eax,%ecx)
+- flds 8(%eax,%ecx)
+- fxch %st(1)
+- fmul %st(2),%st
+- fxch %st(1)
+- fmul %st(3),%st
+- faddp %st,%st(1)
+- movl 4(%ebx),%edx
+- fstps 8(%edx,%ecx)
+- movl (%ebx),%eax
+- flds 4(%eax,%ecx)
+- movl 4(%ebx),%edx
+- fstps 4(%edx,%ecx)
+- addl $12,%ecx
+- cmpl 8(%ebx),%esi
+- jl .L508
+-.L537:
+- fstp %st(0)
+- fstp %st(0)
+- popl %ebx
+- popl %esi
+- leave
+- ret
+-.Lfe4:
+- .size surf3d_rotate,.Lfe4-surf3d_rotate
+- .align 4
+-.globl surf3d_translate
+- .type surf3d_translate,@function
+-surf3d_translate:
+- pushl %ebp
+- movl %esp,%ebp
+- pushl %ebx
+- movl 8(%ebp),%ecx
+- xorl %ebx,%ebx
+- cmpl 8(%ecx),%ebx
+- jge .L512
+- xorl %edx,%edx
+- .p2align 4,,7
+-.L514:
+- movl 4(%ecx),%eax
+- flds (%eax,%edx)
+- fadds 12(%ecx)
+- incl %ebx
+- fstps (%eax,%edx)
+- movl 4(%ecx),%eax
+- flds 4(%eax,%edx)
+- fadds 16(%ecx)
+- fstps 4(%eax,%edx)
+- movl 4(%ecx),%eax
+- flds 8(%eax,%edx)
+- fadds 20(%ecx)
+- fstps 8(%eax,%edx)
+- addl $12,%edx
+- cmpl 8(%ecx),%ebx
+- jl .L514
+-.L512:
+- popl %ebx
+- leave
+- ret
+-.Lfe5:
+- .size surf3d_translate,.Lfe5-surf3d_translate
+- .ident "GCC: (GNU) 2.95.3 19991030 (prerelease)"
+diff -Naur /home/d4rk/goom2k4-0/src/tentacle3d.c /src/tentacle3d.c
+--- /home/d4rk/goom2k4-0/src/tentacle3d.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/tentacle3d.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,290 +0,0 @@
+-#include <stdlib.h>
+-
+-#include "v3d.h"
+-#include "surf3d.h"
+-#include "goom_tools.h"
+-#include "goom_config.h"
+-#include "goom_plugin_info.h"
+-#include "tentacle3d.h"
+-
+-#define D 256.0f
+-
+-#define nbgrid 6
+-#define definitionx 15
+-#define definitionz 45
+-
+-typedef struct _TENTACLE_FX_DATA {
+- PluginParam enabled_bp;
+- PluginParameters params;
+-
+- float cycle;
+- grid3d *grille[nbgrid];
+- float *vals;
+-
+-#define NB_TENTACLE_COLORS 4
+- int colors[NB_TENTACLE_COLORS];
+-
+- int col;
+- int dstcol;
+- float lig;
+- float ligs;
+-
+- /* statics from pretty_move */
+- float distt;
+- float distt2;
+- float rot; /* entre 0 et 2 * M_PI */
+- int happens;
+- int rotation;
+- int lock;
+-} TentacleFXData;
+-
+-static void tentacle_new (TentacleFXData *data);
+-static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H,
+- short[2][512], float, int drawit, TentacleFXData *data);
+-static void tentacle_free (TentacleFXData *data);
+-
+-/*
+- * VisualFX wrapper for the tentacles
+- */
+-
+-static void tentacle_fx_init(VisualFX *_this, PluginInfo *info) {
+-
+- TentacleFXData *data = (TentacleFXData*)malloc(sizeof(TentacleFXData));
+-
+- data->enabled_bp = secure_b_param("Enabled", 1);
+- data->params = plugin_parameters ("3D Tentacles", 1);
+- data->params.params[0] = &data->enabled_bp;
+-
+- data->cycle = 0.0f;
+- data->col = (0x28<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x5f<<(BLEU*8));
+- data->dstcol = 0;
+- data->lig = 1.15f;
+- data->ligs = 0.1f;
+-
+- data->distt = 10.0f;
+- data->distt2 = 0.0f;
+- data->rot = 0.0f; /* entre 0 et 2 * M_PI */
+- data->happens = 0;
+-
+- data->rotation = 0;
+- data->lock = 0;
+- data->colors[0] = (0x18<<(ROUGE*8))|(0x4c<<(VERT*8))|(0x2f<<(BLEU*8));
+- data->colors[1] = (0x48<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x6f<<(BLEU*8));
+- data->colors[2] = (0x58<<(ROUGE*8))|(0x3c<<(VERT*8))|(0x0f<<(BLEU*8));
+- data->colors[3] = (0x87<<(ROUGE*8))|(0x55<<(VERT*8))|(0x74<<(BLEU*8));
+- tentacle_new(data);
+-
+- _this->params = &data->params;
+- _this->fx_data = (void*)data;
+-}
+-
+-static void tentacle_fx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo)
+-{
+- TentacleFXData *data = (TentacleFXData*)_this->fx_data;
+- if (BVAL(data->enabled_bp)) {
+- tentacle_update(goomInfo, dest, src, goomInfo->screen.width,
+- goomInfo->screen.height, goomInfo->sound.samples,
+- (float)goomInfo->sound.accelvar,
+- goomInfo->curGState->drawTentacle, data);
+- }
+-}
+-
+-static void tentacle_fx_free(VisualFX *_this) {
+- tentacle_free((TentacleFXData*)_this->fx_data);
+- free(_this->fx_data);
+-}
+-
+-VisualFX tentacle_fx_create(void) {
+- VisualFX fx;
+- fx.init = tentacle_fx_init;
+- fx.apply = tentacle_fx_apply;
+- fx.free = tentacle_fx_free;
+- return fx;
+-}
+-
+-/* ----- */
+-
+-static void tentacle_free (TentacleFXData *data) {
+- /* TODO : un vrai FREE GRID!! */
+- free (data->vals);
+-}
+-
+-static void tentacle_new (TentacleFXData *data) {
+- int tmp;
+-
+- v3d center = {0,-17.0,0};
+- data->vals = (float*)malloc ((definitionx+20)*sizeof(float));
+-
+- for (tmp=0;tmp<nbgrid;tmp++) {
+- int x,z;
+- z = 45 + rand() % 30;
+- x = 85 + rand() % 5;
+- center.z = z;
+- data->grille[tmp] = grid3d_new (x, definitionx, z, definitionz + rand() % 10, center);
+- center.y += 8;
+- }
+-}
+-
+-static inline unsigned char lighten (unsigned char value, float power)
+-{
+- int val = value;
+- float t = (float) val * log10(power) / 2.0;
+-
+- if (t > 0) {
+- val = (int) t; /* (32.0f * log (t)); */
+- if (val > 255)
+- val = 255;
+- if (val < 0)
+- val = 0;
+- return val;
+- }
+- else {
+- return 0;
+- }
+-}
+-
+-static void lightencolor (int *col, float power)
+-{
+- unsigned char *color;
+-
+- color = (unsigned char *) col;
+- *color = lighten (*color, power);
+- color++;
+- *color = lighten (*color, power);
+- color++;
+- *color = lighten (*color, power);
+- color++;
+- *color = lighten (*color, power);
+-}
+-
+-/* retourne x>>s , en testant le signe de x */
+-#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s))
+-
+-static int evolutecolor (unsigned int src,unsigned int dest,
+- unsigned int mask, unsigned int incr) {
+-
+- int color = src & (~mask);
+- src &= mask;
+- dest &= mask;
+-
+- if ((src!=mask)
+- &&(src<dest))
+- src += incr;
+-
+- if (src>dest)
+- src -= incr;
+- return (src&mask)|color;
+-}
+-
+-static void pretty_move (PluginInfo *goomInfo, float cycle, float *dist, float *dist2, float *rotangle, TentacleFXData *fx_data) {
+-
+- float tmp;
+-
+- /* many magic numbers here... I don't really like that. */
+- if (fx_data->happens)
+- fx_data->happens -= 1;
+- else if (fx_data->lock == 0) {
+- fx_data->happens = goom_irand(goomInfo->gRandom,200)?0:100+goom_irand(goomInfo->gRandom,60);
+- fx_data->lock = fx_data->happens * 3 / 2;
+- }
+- else fx_data->lock --;
+-
+- tmp = fx_data->happens?8.0f:0;
+- *dist2 = fx_data->distt2 = (tmp + 15.0f*fx_data->distt2)/16.0f;
+-
+- tmp = 30+D-90.0f*(1.0f+sin(cycle*19/20));
+- if (fx_data->happens)
+- tmp *= 0.6f;
+-
+- *dist = fx_data->distt = (tmp + 3.0f*fx_data->distt)/4.0f;
+-
+- if (!fx_data->happens){
+- tmp = M_PI*sin(cycle)/32+3*M_PI/2;
+- }
+- else {
+- fx_data->rotation = goom_irand(goomInfo->gRandom,500)?fx_data->rotation:goom_irand(goomInfo->gRandom,2);
+- if (fx_data->rotation)
+- cycle *= 2.0f*M_PI;
+- else
+- cycle *= -1.0f*M_PI;
+- tmp = cycle - (M_PI*2.0) * floor(cycle/(M_PI*2.0));
+- }
+-
+- if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot+2.0*M_PI))) {
+- fx_data->rot = (tmp + 15.0f*(fx_data->rot+2*M_PI)) / 16.0f;
+- if (fx_data->rot>2.0*M_PI)
+- fx_data->rot -= 2.0*M_PI;
+- *rotangle = fx_data->rot;
+- }
+- else if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot-2.0*M_PI))) {
+- fx_data->rot = (tmp + 15.0f*(fx_data->rot-2.0*M_PI)) / 16.0f;
+- if (fx_data->rot<0.0f)
+- fx_data->rot += 2.0*M_PI;
+- *rotangle = fx_data->rot;
+- }
+- else
+- *rotangle = fx_data->rot = (tmp + 15.0f*fx_data->rot) / 16.0f;
+-}
+-
+-static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H,
+- short data[2][512], float rapport, int drawit, TentacleFXData *fx_data) {
+-
+- int tmp;
+- int tmp2;
+-
+- int color;
+- int colorlow;
+-
+- float dist,dist2,rotangle;
+-
+- if ((!drawit) && (fx_data->ligs>0.0f))
+- fx_data->ligs = -fx_data->ligs;
+-
+- fx_data->lig += fx_data->ligs;
+-
+- if (fx_data->lig > 1.01f) {
+- if ((fx_data->lig>10.0f) | (fx_data->lig<1.1f)) fx_data->ligs = -fx_data->ligs;
+-
+- if ((fx_data->lig<6.3f)&&(goom_irand(goomInfo->gRandom,30)==0))
+- fx_data->dstcol=goom_irand(goomInfo->gRandom,NB_TENTACLE_COLORS);
+-
+- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff,0x01);
+- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff00,0x0100);
+- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff0000,0x010000);
+- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff000000,0x01000000);
+-
+- color = fx_data->col;
+- colorlow = fx_data->col;
+-
+- lightencolor(&color,fx_data->lig * 2.0f + 2.0f);
+- lightencolor(&colorlow,(fx_data->lig/3.0f)+0.67f);
+-
+- rapport = 1.0f + 2.0f * (rapport - 1.0f);
+- rapport *= 1.2f;
+- if (rapport > 1.12f)
+- rapport = 1.12f;
+-
+- pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data);
+-
+- for (tmp=0;tmp<nbgrid;tmp++) {
+- for (tmp2=0;tmp2<definitionx;tmp2++) {
+- float val = (float)(ShiftRight(data[0][goom_irand(goomInfo->gRandom,511)],10)) * rapport;
+- fx_data->vals[tmp2] = val;
+- }
+-
+- grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2);
+- }
+- fx_data->cycle+=0.01f;
+- for (tmp=0;tmp<nbgrid;tmp++)
+- grid3d_draw (goomInfo, fx_data->grille[tmp],color,colorlow,dist,buf,back,W,H);
+- }
+- else {
+- fx_data->lig = 1.05f;
+- if (fx_data->ligs < 0.0f)
+- fx_data->ligs = -fx_data->ligs;
+- pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data);
+- fx_data->cycle+=0.1f;
+- if (fx_data->cycle > 1000)
+- fx_data->cycle = 0;
+- }
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/tentacle3d.h /src/tentacle3d.h
+--- /home/d4rk/goom2k4-0/src/tentacle3d.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/tentacle3d.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,8 +0,0 @@
+-#ifndef _TENTACLE3D_H
+-#define _TENTACLE3D_H
+-
+-#include "goom_visual_fx.h"
+-
+-VisualFX tentacle_fx_create(void);
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/TODO /src/TODO
+--- /home/d4rk/goom2k4-0/src/TODO 2005-02-07 06:46:41.000000000 -0700
++++ /src/TODO 1969-12-31 17:00:00.000000000 -0700
+@@ -1,32 +0,0 @@
+-Idees:
+-
+-- Flash lights (Phosphor)
+- --> --> -->
+- <-- <-- <--
+-
+-- Re-remplir RAND regulierement (1/tour)
+-
+-- Un effect qui affecte la displacement map:
+-
+-- Enregistrer l'etat de la config, s'en servir pour definir un etat de goom.
+-
+-- PluginParam de type Button, avec juste un listener en donnee.
+-
+-- PluginParam de type TextField.
+-
+-- Liste des modes possibles pour l'effet de BG.
+-
+-- Goom lui-meme : liste des effets actifs.
+- mode automatique / manuel (plus de changement aleatoires)
+-
+-- Possibilite d'envoyer des commandes format text au Core. exemples :
+-" BRIGHT_FLASH.SCREEN_BRIGHTNESS=200.0
+- if SOUND.GOOM_DETECTION > 0
+- 3D_TENTACLES.ENABLED = 1
+- endif
+- CORE.MAIN_SCRIPT="..."
+-"
+- void goom_execute_script(const char *cmds);
+- void goom_set_main_script(const char *script); /// peut retourner un message d'erreur ?
+- char *goom_create_state_script(); /* retourne un script permettant de remettre goom dans l'etat actuel */
+-
+diff -Naur /home/d4rk/goom2k4-0/src/v3d.c /src/v3d.c
+--- /home/d4rk/goom2k4-0/src/v3d.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/v3d.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,15 +0,0 @@
+-#include "v3d.h"
+-
+-void v3d_to_v2d(v3d *v3, int nbvertex, int width, int height, float distance, v2d *v2) {
+- int i;
+- for (i=0;i<nbvertex;++i) {
+- if (v3[i].z > 2) {
+- int Xp, Yp;
+- F2I((distance * v3[i].x / v3[i].z),Xp);
+- F2I((distance * v3[i].y / v3[i].z),Yp);
+- v2[i].x = Xp + (width>>1);
+- v2[i].y = -Yp + (height>>1);
+- }
+- else v2[i].x=v2[i].y=-666;
+- }
+-}
+diff -Naur /home/d4rk/goom2k4-0/src/v3d.h /src/v3d.h
+--- /home/d4rk/goom2k4-0/src/v3d.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/v3d.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,65 +0,0 @@
+-#ifndef _V3D_H
+-#define _V3D_H
+-
+-#include <math.h>
+-#include <stdlib.h>
+-#include <stdio.h>
+-
+-#include "mathtools.h"
+-
+-typedef struct {
+- float x,y,z;
+-} v3d;
+-
+-typedef struct {
+- int x,y;
+-} v2d;
+-
+-typedef struct {
+- double x,y;
+-} v2g;
+-
+-/*
+- * projete le vertex 3D sur le plan d'affichage
+- * retourne (0,0) si le point ne doit pas etre affiche.
+- *
+- * bonne valeur pour distance : 256
+- */
+-#define V3D_TO_V2D(v3,v2,width,height,distance) \
+-{ \
+- int Xp, Yp; \
+- if (v3.z > 2) { \
+- F2I((distance * v3.x / v3.z),Xp) ; \
+- F2I((distance * v3.y / v3.z),Yp) ; \
+- v2.x = Xp + (width>>1); \
+- v2.y = -Yp + (height>>1); \
+- } \
+- else v2.x=v2.y=-666; \
+-}
+-
+-void v3d_to_v2d(v3d *src, int nbvertex, int width, int height, float distance, v2d *v2_array);
+-
+-/*
+- * rotation selon Y du v3d vi d'angle a (cosa=cos(a), sina=sin(a))
+- * centerz = centre de rotation en z
+- */
+-#define Y_ROTATE_V3D(vi,vf,sina,cosa)\
+-{\
+- vf.x = vi.x * cosa - vi.z * sina;\
+- vf.z = vi.x * sina + vi.z * cosa;\
+- vf.y = vi.y;\
+-}
+-
+-/*
+- * translation
+- */
+-#define TRANSLATE_V3D(vsrc,vdest)\
+-{\
+- vdest.x += vsrc.x;\
+- vdest.y += vsrc.y;\
+- vdest.z += vsrc.z;\
+-}
+-
+-#define MUL_V3D(lf,v) {v.x*=lf;v.y*=lf;v.z*=lf;}
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/xmmx.c /src/xmmx.c
+--- /home/d4rk/goom2k4-0/src/xmmx.c 2005-02-07 06:46:41.000000000 -0700
++++ /src/xmmx.c 1969-12-31 17:00:00.000000000 -0700
+@@ -1,393 +0,0 @@
+-
+-#ifdef HAVE_MMX
+-
+-/* a definir pour avoir exactement le meme resultat que la fonction C
+- * (un chouillat plus lent).. mais la difference est assez peu notable.
+- */
+-// #define STRICT_COMPAT
+-
+-#define BUFFPOINTNB 16
+-#define BUFFPOINTMASK 0xffff
+-#define BUFFINCR 0xff
+-
+-#define sqrtperte 16
+-/* faire : a % sqrtperte <=> a & pertemask*/
+-#define PERTEMASK 0xf
+-/* faire : a / sqrtperte <=> a >> PERTEDEC*/
+-#define PERTEDEC 4
+-
+-
+-/*#define MMX_TRACE*/
+-#include "mmx.h"
+-/*#include "xmmx.h"*/
+-#include "goom_graphic.h"
+-
+-int xmmx_supported (void) {
+- return (mm_support()&0x8)>>3;
+-}
+-
+-void zoom_filter_xmmx (int prevX, int prevY,
+- Pixel *expix1, Pixel *expix2,
+- int *lbruS, int *lbruD, int buffratio,
+- int precalCoef[16][16])
+-{
+- int bufsize = prevX * prevY; /* taille du buffer */
+- volatile int loop; /* variable de boucle */
+-
+- mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */
+- mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */
+-
+- volatile mmx_t prevXY;
+- volatile mmx_t ratiox;
+- /* volatile mmx_t interpix; */
+-
+- expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0;
+-
+- prevXY.ud[0] = (prevX-1)<<PERTEDEC;
+- prevXY.ud[1] = (prevY-1)<<PERTEDEC;
+-
+- ratiox.d[0] = buffratio;
+- ratiox.d[1] = buffratio;
+-
+- asm volatile
+- ("\n\t movq %[ratio], %%mm6"
+- "\n\t pslld $16, %%mm6" /* mm6 = [rat16=buffratio<<16 | rat16=buffratio<<16] */
+- "\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */
+- ::[ratio]"m"(ratiox));
+-
+- loop=0;
+-
+- /*
+- * NOTE : mm6 et mm7 ne sont pas modifies dans la boucle.
+- */
+- while (loop < bufsize)
+- {
+- /* Thread #1
+- * pre : mm6 = [rat16|rat16]
+- * post : mm0 = S + ((D-S)*rat16 format [X|Y]
+- * modified = mm0,mm1,mm2
+- */
+-
+- asm volatile
+- ("#1 \n\t movq %[brutS], %%mm0"
+- "#1 \n\t movq %[brutD], %%mm1"
+- "#1 \n\t psubd %%mm0, %%mm1" /* mm1 = D - S */
+- "#1 \n\t movq %%mm1, %%mm2" /* mm2 = D - S */
+- "#1 \n\t pslld $16, %%mm1"
+- "#1 \n\t pmullw %%mm6, %%mm2"
+- "#1 \n\t pmulhuw %%mm6, %%mm1"
+-
+- "#1 \n\t pslld $16, %%mm0"
+- "#1 \n\t paddd %%mm2, %%mm1" /* mm1 = (D - S) * buffratio >> 16 */
+-
+- "#1 \n\t paddd %%mm1, %%mm0" /* mm0 = S + mm1 */
+- "#1 \n\t psrld $16, %%mm0"
+- :
+- : [brutS]"g"(brutS[loop])
+- , [brutD]"g"(brutD[loop])
+- ); /* mm0 = S */
+-
+- /*
+- * pre : mm0 : position vector on screen
+- * prevXY : coordinate of the lower-right point on screen
+- * post : clipped mm0
+- * modified : mm0,mm1,mm2
+- */
+- asm volatile
+- ("#1 \n\t movq %[prevXY], %%mm1"
+- "#1 \n\t pcmpgtd %%mm0, %%mm1"
+- /* mm0 en X contient (idem pour Y) :
+- * 1111 si prevXY > px
+- * 0000 si prevXY <= px */
+-#ifdef STRICT_COMPAT
+- "#1 \n\t movq %%mm1, %%mm2"
+- "#1 \n\t punpckhdq %%mm2, %%mm2"
+- "#1 \n\t punpckldq %%mm1, %%mm1"
+- "#1 \n\t pand %%mm2, %%mm0"
+-#endif
+-
+- "#1 \n\t pand %%mm1, %%mm0" /* on met a zero la partie qui deborde */
+- ::[prevXY]"m"(prevXY));
+-
+- /* Thread #2
+- * pre : mm0 : clipped position on screen
+- *
+- * post : mm3 : coefs for this position
+- * mm1 : X vector [0|X]
+- *
+- * modif : eax,esi
+- */
+- __asm__ __volatile__ (
+- "#2 \n\t movd %%mm0,%%esi"
+- "#2 \n\t movq %%mm0,%%mm1"
+-
+- "#2 \n\t andl $15,%%esi"
+- "#2 \n\t psrlq $32,%%mm1"
+-
+- "#2 \n\t shll $6,%%esi"
+- "#2 \n\t movd %%mm1,%%eax"
+-
+- "#2 \n\t addl %[precalCoef],%%esi"
+- "#2 \n\t andl $15,%%eax"
+-
+- "#2 \n\t movd (%%esi,%%eax,4),%%mm3"
+- ::[precalCoef]"g"(precalCoef):"eax","esi");
+-
+- /*
+- * extraction des coefficients... (Thread #3)
+- *
+- * pre : coef dans mm3
+- *
+- * post : coef extraits dans mm3 (c1 & c2)
+- * et mm4 (c3 & c4)
+- *
+- * modif : mm5
+- */
+-
+- /* (Thread #4)
+- * pre : mm0 : Y pos [*|Y]
+- * mm1 : X pos [*|X]
+- *
+- * post : mm0 : expix1[position]
+- * mm2 : expix1[position+largeur]
+- *
+- * modif : eax, esi
+- */
+- __asm__ __volatile__ (
+- "#2 \n\t psrld $4, %%mm0"
+- "#2 \n\t psrld $4, %%mm1" /* PERTEDEC = $4 */
+-
+- "#4 \n\t movd %%mm1,%%eax"
+- "#3 \n\t movq %%mm3,%%mm5"
+-
+- "#4 \n\t mull %[prevX]"
+- "#4 \n\t movd %%mm0,%%esi"
+-
+- "#3 \n\t punpcklbw %%mm5, %%mm3"
+- "#4 \n\t addl %%esi, %%eax"
+-
+- "#3 \n\t movq %%mm3, %%mm4"
+- "#3 \n\t movq %%mm3, %%mm5"
+-
+- "#4 \n\t movl %[expix1], %%esi"
+- "#3 \n\t punpcklbw %%mm5, %%mm3"
+-
+- "#4 \n\t movq (%%esi,%%eax,4),%%mm0"
+- "#3 \n\t punpckhbw %%mm5, %%mm4"
+-
+- "#4 \n\t addl %[prevX],%%eax"
+- "#4 \n\t movq (%%esi,%%eax,4),%%mm2"
+-
+- :
+- : [expix1] "g"(expix1)
+- , [prevX] "g"(prevX)
+- :"eax","esi"
+- );
+-
+- /*
+- * pre : mm0 : expix1[position]
+- * mm2 : expix1[position+largeur]
+- * mm3 & mm4 : coefs
+- */
+-
+- /* recopie des deux premiers pixels dans mm0 et mm1 */
+- movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */
+-
+- /* depackage du premier pixel */
+- punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */
+-
+- /* extraction des coefficients... */
+-
+- movq_r2r (mm3, mm5); /* c2-c2-c2-c2-c1-c1-c1-c1 */
+-
+- /*^en parrallele^*/ /* depackage du 2ieme pixel */
+- /*^*/ punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */
+-
+- punpcklbw_r2r (mm7, mm5); /* 00-c1-00-c1-00-c1-00-c1 */
+- punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */
+-
+- /* multiplication des pixels par les coefficients */
+- pmullw_r2r (mm5, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */
+- pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */
+- paddw_r2r (mm1, mm0);
+-
+- /* ...extraction des 2 derniers coefficients */
+- movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */
+- punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */
+- punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */
+-
+- /* recuperation des 2 derniers pixels */
+- movq_r2r (mm2, mm1);
+-
+- /* depackage des pixels */
+- punpcklbw_r2r (mm7, mm1);
+- punpckhbw_r2r (mm7, mm2);
+-
+- /* multiplication pas les coeffs */
+- pmullw_r2r (mm4, mm1);
+- pmullw_r2r (mm5, mm2);
+-
+- /* ajout des valeurs obtenues à la valeur finale */
+- paddw_r2r (mm1, mm0);
+- paddw_r2r (mm2, mm0);
+-
+- /* division par 256 = 16+16+16+16, puis repackage du pixel final */
+- psrlw_i2r (8, mm0);
+- packuswb_r2r (mm7, mm0);
+-
+- movd_r2m (mm0,expix2[loop]);
+-
+- ++loop;
+- }
+- __asm__ __volatile__ ("femms\n");
+-}
+-
+-#define DRAWMETHOD_PLUS_XMMX(_out,_backbuf,_col) \
+-{ \
+- movd_m2r(_backbuf, mm0); \
+- paddusb_m2r(_col, mm0); \
+- movd_r2m(mm0, _out); \
+-}
+-
+-#define DRAWMETHOD DRAWMETHOD_PLUS_XMMX(*p,*p,col)
+-
+-void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny)
+-{
+- int x, y, dx, dy, yy, xx;
+- Pixel *p;
+-
+- if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx))
+- goto end_of_line;
+-
+- dx = x2 - x1;
+- dy = y2 - y1;
+- if (x1 >= x2) {
+- int tmp;
+-
+- tmp = x1;
+- x1 = x2;
+- x2 = tmp;
+- tmp = y1;
+- y1 = y2;
+- y2 = tmp;
+- dx = x2 - x1;
+- dy = y2 - y1;
+- }
+-
+- /* vertical line */
+- if (dx == 0) {
+- if (y1 < y2) {
+- p = &(data[(screenx * y1) + x1]);
+- for (y = y1; y <= y2; y++) {
+- DRAWMETHOD;
+- p += screenx;
+- }
+- }
+- else {
+- p = &(data[(screenx * y2) + x1]);
+- for (y = y2; y <= y1; y++) {
+- DRAWMETHOD;
+- p += screenx;
+- }
+- }
+- goto end_of_line;
+- }
+- /* horizontal line */
+- if (dy == 0) {
+- if (x1 < x2) {
+- p = &(data[(screenx * y1) + x1]);
+- for (x = x1; x <= x2; x++) {
+- DRAWMETHOD;
+- p++;
+- }
+- goto end_of_line;
+- }
+- else {
+- p = &(data[(screenx * y1) + x2]);
+- for (x = x2; x <= x1; x++) {
+- DRAWMETHOD;
+- p++;
+- }
+- goto end_of_line;
+- }
+- }
+- /* 1 */
+- /* \ */
+- /* \ */
+- /* 2 */
+- if (y2 > y1) {
+- /* steep */
+- if (dy > dx) {
+- dx = ((dx << 16) / dy);
+- x = x1 << 16;
+- for (y = y1; y <= y2; y++) {
+- xx = x >> 16;
+- p = &(data[(screenx * y) + xx]);
+- DRAWMETHOD;
+- if (xx < (screenx - 1)) {
+- p++;
+- /* DRAWMETHOD; */
+- }
+- x += dx;
+- }
+- goto end_of_line;
+- }
+- /* shallow */
+- else {
+- dy = ((dy << 16) / dx);
+- y = y1 << 16;
+- for (x = x1; x <= x2; x++) {
+- yy = y >> 16;
+- p = &(data[(screenx * yy) + x]);
+- DRAWMETHOD;
+- if (yy < (screeny - 1)) {
+- p += screeny;
+- /* DRAWMETHOD; */
+- }
+- y += dy;
+- }
+- }
+- }
+- /* 2 */
+- /* / */
+- /* / */
+- /* 1 */
+- else {
+- /* steep */
+- if (-dy > dx) {
+- dx = ((dx << 16) / -dy);
+- x = (x1 + 1) << 16;
+- for (y = y1; y >= y2; y--) {
+- xx = x >> 16;
+- p = &(data[(screenx * y) + xx]);
+- DRAWMETHOD;
+- if (xx < (screenx - 1)) {
+- p--;
+- /* DRAWMETHOD; */
+- }
+- x += dx;
+- }
+- goto end_of_line;
+- }
+- /* shallow */
+- else {
+- dy = ((dy << 16) / dx);
+- y = y1 << 16;
+- for (x = x1; x <= x2; x++) {
+- yy = y >> 16;
+- p = &(data[(screenx * yy) + x]);
+- DRAWMETHOD;
+- if (yy < (screeny - 1)) {
+- p += screeny;
+- /* DRAWMETHOD; */
+- }
+- y += dy;
+- }
+- goto end_of_line;
+- }
+- }
+-end_of_line:
+- __asm__ __volatile__ ("femms\n");
+-}
+-
+-#endif
+diff -Naur /home/d4rk/goom2k4-0/src/xmmx.h /src/xmmx.h
+--- /home/d4rk/goom2k4-0/src/xmmx.h 2005-02-07 06:46:41.000000000 -0700
++++ /src/xmmx.h 1969-12-31 17:00:00.000000000 -0700
+@@ -1,537 +0,0 @@
+-/* xmmx.h
+-
+- eXtended MultiMedia eXtensions GCC interface library for IA32.
+-
+- To use this library, simply include this header file
+- and compile with GCC. You MUST have inlining enabled
+- in order for xmmx_ok() to work; this can be done by
+- simply using -O on the GCC command line.
+-
+- Compiling with -DXMMX_TRACE will cause detailed trace
+- output to be sent to stderr for each mmx operation.
+- This adds lots of code, and obviously slows execution to
+- a crawl, but can be very useful for debugging.
+-
+- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
+- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
+- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+- AND FITNESS FOR ANY PARTICULAR PURPOSE.
+-
+- 1999 by R. Fisher
+- Based on libmmx, 1997-99 by H. Dietz and R. Fisher
+-
+- Notes:
+- It appears that the latest gas has the pand problem fixed, therefore
+- I'll undefine BROKEN_PAND by default.
+-*/
+-
+-#ifndef _XMMX_H
+-#define _XMMX_H
+-
+-
+-/* Warning: at this writing, the version of GAS packaged
+- with most Linux distributions does not handle the
+- parallel AND operation mnemonic correctly. If the
+- symbol BROKEN_PAND is defined, a slower alternative
+- coding will be used. If execution of mmxtest results
+- in an illegal instruction fault, define this symbol.
+-*/
+-#undef BROKEN_PAND
+-
+-
+-/* The type of an value that fits in an (Extended) MMX register
+- (note that long long constant values MUST be suffixed
+- by LL and unsigned long long values by ULL, lest
+- they be truncated by the compiler)
+-*/
+-#ifndef _MMX_H
+-typedef union {
+- long long q; /* Quadword (64-bit) value */
+- unsigned long long uq; /* Unsigned Quadword */
+- int d[2]; /* 2 Doubleword (32-bit) values */
+- unsigned int ud[2]; /* 2 Unsigned Doubleword */
+- short w[4]; /* 4 Word (16-bit) values */
+- unsigned short uw[4]; /* 4 Unsigned Word */
+- char b[8]; /* 8 Byte (8-bit) values */
+- unsigned char ub[8]; /* 8 Unsigned Byte */
+- float s[2]; /* Single-precision (32-bit) value */
+-} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */
+-#endif
+-
+-
+-
+-/* Function to test if multimedia instructions are supported...
+-*/
+-static int
+-mm_support(void)
+-{
+- /* Returns 1 if MMX instructions are supported,
+- 3 if Cyrix MMX and Extended MMX instructions are supported
+- 5 if AMD MMX and 3DNow! instructions are supported
+- 0 if hardware does not support any of these
+- */
+- register int rval = 0;
+-
+- __asm__ __volatile__ (
+- /* See if CPUID instruction is supported ... */
+- /* ... Get copies of EFLAGS into eax and ecx */
+- "pushf\n\t"
+- "popl %%eax\n\t"
+- "movl %%eax, %%ecx\n\t"
+-
+- /* ... Toggle the ID bit in one copy and store */
+- /* to the EFLAGS reg */
+- "xorl $0x200000, %%eax\n\t"
+- "push %%eax\n\t"
+- "popf\n\t"
+-
+- /* ... Get the (hopefully modified) EFLAGS */
+- "pushf\n\t"
+- "popl %%eax\n\t"
+-
+- /* ... Compare and test result */
+- "xorl %%eax, %%ecx\n\t"
+- "testl $0x200000, %%ecx\n\t"
+- "jz NotSupported1\n\t" /* CPUID not supported */
+-
+-
+- /* Get standard CPUID information, and
+- go to a specific vendor section */
+- "movl $0, %%eax\n\t"
+- "cpuid\n\t"
+-
+- /* Check for Intel */
+- "cmpl $0x756e6547, %%ebx\n\t"
+- "jne TryAMD\n\t"
+- "cmpl $0x49656e69, %%edx\n\t"
+- "jne TryAMD\n\t"
+- "cmpl $0x6c65746e, %%ecx\n"
+- "jne TryAMD\n\t"
+- "jmp Intel\n\t"
+-
+- /* Check for AMD */
+- "\nTryAMD:\n\t"
+- "cmpl $0x68747541, %%ebx\n\t"
+- "jne TryCyrix\n\t"
+- "cmpl $0x69746e65, %%edx\n\t"
+- "jne TryCyrix\n\t"
+- "cmpl $0x444d4163, %%ecx\n"
+- "jne TryCyrix\n\t"
+- "jmp AMD\n\t"
+-
+- /* Check for Cyrix */
+- "\nTryCyrix:\n\t"
+- "cmpl $0x69727943, %%ebx\n\t"
+- "jne NotSupported2\n\t"
+- "cmpl $0x736e4978, %%edx\n\t"
+- "jne NotSupported3\n\t"
+- "cmpl $0x64616574, %%ecx\n\t"
+- "jne NotSupported4\n\t"
+- /* Drop through to Cyrix... */
+-
+-
+- /* Cyrix Section */
+- /* See if extended CPUID level 80000001 is supported */
+- /* The value of CPUID/80000001 for the 6x86MX is undefined
+- according to the Cyrix CPU Detection Guide (Preliminary
+- Rev. 1.01 table 1), so we'll check the value of eax for
+- CPUID/0 to see if standard CPUID level 2 is supported.
+- According to the table, the only CPU which supports level
+- 2 is also the only one which supports extended CPUID levels.
+- */
+- "cmpl $0x2, %%eax\n\t"
+- "jne MMXtest\n\t" /* Use standard CPUID instead */
+-
+- /* Extended CPUID supported (in theory), so get extended
+- features */
+- "movl $0x80000001, %%eax\n\t"
+- "cpuid\n\t"
+- "testl $0x00800000, %%eax\n\t" /* Test for MMX */
+- "jz NotSupported5\n\t" /* MMX not supported */
+- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */
+- "jnz EMMXSupported\n\t"
+- "movl $1, %0:\n\n\t" /* MMX Supported */
+- "jmp Return\n\n"
+- "EMMXSupported:\n\t"
+- "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */
+- "jmp Return\n\t"
+-
+-
+- /* AMD Section */
+- "AMD:\n\t"
+-
+- /* See if extended CPUID is supported */
+- "movl $0x80000000, %%eax\n\t"
+- "cpuid\n\t"
+- "cmpl $0x80000000, %%eax\n\t"
+- "jl MMXtest\n\t" /* Use standard CPUID instead */
+-
+- /* Extended CPUID supported, so get extended features */
+- "movl $0x80000001, %%eax\n\t"
+- "cpuid\n\t"
+- "testl $0x00800000, %%edx\n\t" /* Test for MMX */
+- "jz NotSupported6\n\t" /* MMX not supported */
+- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */
+- "jnz ThreeDNowSupported\n\t"
+- "movl $1, %0:\n\n\t" /* MMX Supported */
+- "jmp Return\n\n"
+- "ThreeDNowSupported:\n\t"
+- "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */
+- "jmp Return\n\t"
+-
+-
+- /* Intel Section */
+- "Intel:\n\t"
+-
+- /* Check for MMX */
+- "MMXtest:\n\t"
+- "movl $1, %%eax\n\t"
+- "cpuid\n\t"
+- "testl $0x00800000, %%edx\n\t" /* Test for MMX */
+- "jz NotSupported7\n\t" /* MMX Not supported */
+- "movl $1, %0:\n\n\t" /* MMX Supported */
+- "jmp Return\n\t"
+-
+- /* Nothing supported */
+- "\nNotSupported1:\n\t"
+- "#movl $101, %0:\n\n\t"
+- "\nNotSupported2:\n\t"
+- "#movl $102, %0:\n\n\t"
+- "\nNotSupported3:\n\t"
+- "#movl $103, %0:\n\n\t"
+- "\nNotSupported4:\n\t"
+- "#movl $104, %0:\n\n\t"
+- "\nNotSupported5:\n\t"
+- "#movl $105, %0:\n\n\t"
+- "\nNotSupported6:\n\t"
+- "#movl $106, %0:\n\n\t"
+- "\nNotSupported7:\n\t"
+- "#movl $107, %0:\n\n\t"
+- "movl $0, %0:\n\n\t"
+-
+- "Return:\n\t"
+- : "=a" (rval)
+- : /* no input */
+- : "eax", "ebx", "ecx", "edx"
+- );
+-
+- /* Return */
+- return(rval);
+-}
+-
+-/* Function to test if mmx instructions are supported...
+-*/
+-#ifndef _XMMX_H
+-inline extern int
+-mmx_ok(void)
+-{
+- /* Returns 1 if MMX instructions are supported, 0 otherwise */
+- return ( mm_support() & 0x1 );
+-}
+-#endif
+-
+-/* Function to test if xmmx instructions are supported...
+-*/
+-inline extern int
+-xmmx_ok(void)
+-{
+- /* Returns 1 if Extended MMX instructions are supported, 0 otherwise */
+- return ( (mm_support() & 0x2) >> 1 );
+-}
+-
+-
+-/* Helper functions for the instruction macros that follow...
+- (note that memory-to-register, m2r, instructions are nearly
+- as efficient as register-to-register, r2r, instructions;
+- however, memory-to-memory instructions are really simulated
+- as a convenience, and are only 1/3 as efficient)
+-*/
+-#ifdef XMMX_TRACE
+-
+-/* Include the stuff for printing a trace to stderr...
+-*/
+-
+-#include <stdio.h>
+-
+-#define mmx_i2r(op, imm, reg) \
+- { \
+- mmx_t mmx_trace; \
+- mmx_trace.uq = (imm); \
+- fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- fprintf(stderr, #reg "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ (#op " %0, %%" #reg \
+- : /* nothing */ \
+- : "X" (imm)); \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- fprintf(stderr, #reg "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#define mmx_m2r(op, mem, reg) \
+- { \
+- mmx_t mmx_trace; \
+- mmx_trace = (mem); \
+- fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- fprintf(stderr, #reg "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ (#op " %0, %%" #reg \
+- : /* nothing */ \
+- : "X" (mem)); \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- fprintf(stderr, #reg "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#define mmx_r2m(op, reg, mem) \
+- { \
+- mmx_t mmx_trace; \
+- __asm__ __volatile__ ("movq %%" #reg ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- mmx_trace = (mem); \
+- fprintf(stderr, #mem "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ (#op " %%" #reg ", %0" \
+- : "=X" (mem) \
+- : /* nothing */ ); \
+- mmx_trace = (mem); \
+- fprintf(stderr, #mem "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#define mmx_r2r(op, regs, regd) \
+- { \
+- mmx_t mmx_trace; \
+- __asm__ __volatile__ ("movq %%" #regs ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ ("movq %%" #regd ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- fprintf(stderr, #regd "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \
+- __asm__ __volatile__ ("movq %%" #regd ", %0" \
+- : "=X" (mmx_trace) \
+- : /* nothing */ ); \
+- fprintf(stderr, #regd "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#define mmx_m2m(op, mems, memd) \
+- { \
+- mmx_t mmx_trace; \
+- mmx_trace = (mems); \
+- fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- mmx_trace = (memd); \
+- fprintf(stderr, #memd "=0x%08x%08x) => ", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+- #op " %1, %%mm0\n\t" \
+- "movq %%mm0, %0" \
+- : "=X" (memd) \
+- : "X" (mems)); \
+- mmx_trace = (memd); \
+- fprintf(stderr, #memd "=0x%08x%08x\n", \
+- mmx_trace.d[1], mmx_trace.d[0]); \
+- }
+-
+-#else
+-
+-/* These macros are a lot simpler without the tracing...
+-*/
+-
+-#define mmx_i2r(op, imm, reg) \
+- __asm__ __volatile__ (#op " %0, %%" #reg \
+- : /* nothing */ \
+- : "X" (imm) )
+-
+-#define mmx_m2r(op, mem, reg) \
+- __asm__ __volatile__ (#op " %0, %%" #reg \
+- : /* nothing */ \
+- : "X" (mem))
+-
+-#define mmx_m2ir(op, mem, rs) \
+- __asm__ __volatile__ (#op " %0, %%" #rs \
+- : /* nothing */ \
+- : "X" (mem) )
+-
+-#define mmx_r2m(op, reg, mem) \
+- __asm__ __volatile__ (#op " %%" #reg ", %0" \
+- : "=X" (mem) \
+- : /* nothing */ )
+-
+-#define mmx_r2r(op, regs, regd) \
+- __asm__ __volatile__ (#op " %" #regs ", %" #regd)
+-
+-#define mmx_r2ir(op, rs1, rs2) \
+- __asm__ __volatile__ (#op " %%" #rs1 ", %%" #rs2 \
+- : /* nothing */ \
+- : /* nothing */ )
+-
+-#define mmx_m2m(op, mems, memd) \
+- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+- #op " %1, %%mm0\n\t" \
+- "movq %%mm0, %0" \
+- : "=X" (memd) \
+- : "X" (mems))
+-
+-#endif
+-
+-
+-
+-/* 1x64 MOVe Quadword
+- (this is both a load and a store...
+- in fact, it is the only way to store)
+-*/
+-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg)
+-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var)
+-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd)
+-#define movq(vars, vard) \
+- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \
+- "movq %%mm0, %0" \
+- : "=X" (vard) \
+- : "X" (vars))
+-
+-
+-/* 1x32 MOVe Doubleword
+- (like movq, this is both load and store...
+- but is most useful for moving things between
+- mmx registers and ordinary registers)
+-*/
+-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg)
+-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var)
+-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd)
+-#define movd(vars, vard) \
+- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \
+- "movd %%mm0, %0" \
+- : "=X" (vard) \
+- : "X" (vars))
+-
+-
+-
+-/* 4x16 Parallel MAGnitude
+-*/
+-#define pmagw_m2r(var, reg) mmx_m2r(pmagw, var, reg)
+-#define pmagw_r2r(regs, regd) mmx_r2r(pmagw, regs, regd)
+-#define pmagw(vars, vard) mmx_m2m(pmagw, vars, vard)
+-
+-
+-/* 4x16 Parallel ADDs using Saturation arithmetic
+- and Implied destination
+-*/
+-#define paddsiw_m2ir(var, rs) mmx_m2ir(paddsiw, var, rs)
+-#define paddsiw_r2ir(rs1, rs2) mmx_r2ir(paddsiw, rs1, rs2)
+-#define paddsiw(vars, vard) mmx_m2m(paddsiw, vars, vard)
+-
+-
+-/* 4x16 Parallel SUBs using Saturation arithmetic
+- and Implied destination
+-*/
+-#define psubsiw_m2ir(var, rs) mmx_m2ir(psubsiw, var, rs)
+-#define psubsiw_r2ir(rs1, rs2) mmx_r2ir(psubsiw, rs1, rs2)
+-#define psubsiw(vars, vard) mmx_m2m(psubsiw, vars, vard)
+-
+-
+-/* 4x16 Parallel MULs giving High 4x16 portions of results
+- Rounded with 1/2 bit 15.
+-*/
+-#define pmulhrw_m2r(var, reg) mmx_m2r(pmulhrw, var, reg)
+-#define pmulhrw_r2r(regs, regd) mmx_r2r(pmulhrw, regs, regd)
+-#define pmulhrw(vars, vard) mmx_m2m(pmulhrw, vars, vard)
+-
+-
+-/* 4x16 Parallel MULs giving High 4x16 portions of results
+- Rounded with 1/2 bit 15, storing to Implied register
+-*/
+-#define pmulhriw_m2ir(var, rs) mmx_m2ir(pmulhriw, var, rs)
+-#define pmulhriw_r2ir(rs1, rs2) mmx_r2ir(pmulhriw, rs1, rs2)
+-#define pmulhriw(vars, vard) mmx_m2m(pmulhriw, vars, vard)
+-
+-
+-/* 4x16 Parallel Muls (and ACcumulate) giving High 4x16 portions
+- of results Rounded with 1/2 bit 15, accumulating with Implied register
+-*/
+-#define pmachriw_m2ir(var, rs) mmx_m2ir(pmachriw, var, rs)
+-#define pmachriw_r2ir(rs1, rs2) mmx_r2ir(pmachriw, rs1, rs2)
+-#define pmachriw(vars, vard) mmx_m2m(pmachriw, vars, vard)
+-
+-
+-/* 8x8u Parallel AVErage
+-*/
+-#define paveb_m2r(var, reg) mmx_m2r(paveb, var, reg)
+-#define paveb_r2r(regs, regd) mmx_r2r(paveb, regs, regd)
+-#define paveb(vars, vard) mmx_m2m(paveb, vars, vard)
+-
+-
+-/* 8x8u Parallel DISTance and accumulate with
+- unsigned saturation to Implied register
+-*/
+-#define pdistib_m2ir(var, rs) mmx_m2ir(pdistib, var, rs)
+-#define pdistib(vars, vard) mmx_m2m(pdistib, vars, vard)
+-
+-
+-/* 8x8 Parallel conditional MoVe
+- if implied register field is Zero
+-*/
+-#define pmvzb_m2ir(var, rs) mmx_m2ir(pmvzb, var, rs)
+-
+-
+-/* 8x8 Parallel conditional MoVe
+- if implied register field is Not Zero
+-*/
+-#define pmvnzb_m2ir(var, rs) mmx_m2ir(pmvnzb, var, rs)
+-
+-
+-/* 8x8 Parallel conditional MoVe
+- if implied register field is Less than Zero
+-*/
+-#define pmvlzb_m2ir(var, rs) mmx_m2ir(pmvlzb, var, rs)
+-
+-
+-/* 8x8 Parallel conditional MoVe
+- if implied register field is Greater than or Equal to Zero
+-*/
+-#define pmvgezb_m2ir(var, rs) mmx_m2ir(pmvgezb, var, rs)
+-
+-
+-/* Fast Empty MMx State
+- (used to clean-up when going from mmx to float use
+- of the registers that are shared by both; note that
+- there is no float-to-xmmx operation needed, because
+- only the float tag word info is corruptible)
+-*/
+-#ifdef XMMX_TRACE
+-
+-#define femms() \
+- { \
+- fprintf(stderr, "femms()\n"); \
+- __asm__ __volatile__ ("femms"); \
+- }
+-
+-#else
+-
+-#define femms() __asm__ __volatile__ ("femms")
+-
+-#endif
+-
+-#endif
+-
diff --git a/src/visualizations/Goom/goom2k4-0/AUTHORS b/src/visualizations/Goom/goom2k4-0/AUTHORS
new file mode 100644
index 0000000000..af63c2f2e4
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/AUTHORS
@@ -0,0 +1,9 @@
+What a GOOM!
+============
+
+Copyright (c)2000-2004, Jean-Christophe Hoelt <jeko@ios-software.com>
+Programmer and Software Designer at iOS software.
+
+iTunes port/PowerPC/Core-Hacking: Guillaume Borios <gyom@ios-software.com>
+WINAMP/WMP port: Fred
+
diff --git a/src/visualizations/Goom/goom2k4-0/COPYING b/src/visualizations/Goom/goom2k4-0/COPYING
new file mode 100644
index 0000000000..a76126bf30
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/COPYING
@@ -0,0 +1,3 @@
+This program is under the LGPL.
+You can find the terms of this licence somewhere on the internet.
+(for exemple, search "LGPL" on your favorite search engine).
diff --git a/src/visualizations/Goom/goom2k4-0/ChangeLog b/src/visualizations/Goom/goom2k4-0/ChangeLog
new file mode 100644
index 0000000000..3c2a986e41
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/ChangeLog
@@ -0,0 +1,85 @@
+ChangeLogs for GOOM
+-------------------
+
+.10/03/2004: version 2k4-dev12
+ - A Goom Scripting Language embedded in. It allows hi level of
+ configuration and easy hacking of the effect's behaviour.
+ - Zoom filter now works on relative screen coordinates.
+.04/12/2003: version 2k4-dev2
+ A long time since last entry here but some work has been done during
+ this year, Goom v2 is now on the track and working pretty well.
+ Added:
+ - Configurability.
+ - A particule system for rain, fireworks and fountains.
+ - Dynamic brightness changes to make gooms more impressive.
+ - Cleaning the code.
+.30/12/2002:
+ Auto-CPU detection. New font.. now stored in the binary file.
+.28/12/2002:
+ Optimisation of the asm loop in ExtendedMMX
+.30/11/2002:
+ Added tentacle3d.
+.15/11/2002:
+ Dirty Hack to make inline asm compile well :
+ remove the -fPIC flag (by modifying ltconfig)
+.11/11/2002:
+ Partial rewriting of the sound evaluator.
+.10/11/2002:
+ bug fixes (crash with some song title, ...)
+ display/hide of the fps.
+ show information messages.
+.10/08/2002:
+ xmms-goom now uses SDL.
+.**/07/2002:
+ display the title.
+.07/06/2002: version 1.9
+ Slow change between FX.
+.20/04/2002: version 1.8.1
+ Hypercos effect.
+ - added a param to goom_core to force the fx change
+ - fullscreen for xmms works well
+ - keyboard input for xmms
+ - xmms-ctrl (control xmms from goom)
+ - auto-change fx after a large number of cycle with the same one
+.11/04/2002: version 1.8.0
+ IFS point effect..
+.10/12/2001:
+ Adding some new stuff from iGoom (circle line)
+ removing the init-close bug.
+ adding the oportunity to double the size of the pixel.
+.11/07/2001:
+ Hello mister proper.. The code is more portable now.
+.16/06/2001:
+ Fixing a little bug with the initial config loading.
+ Using the 2 new FX of the zoom filter.
+
+
+ChangeLogs for KOP2ZEDEMO: the zoom filter
+------------------------------------------
+
+.16/06/2001:
+ NEW FX -> vPlane & hPlane. (to do rotations)
+ NEW FX -> noisify ; to add noise to the transformation buffer.
+.03/01/2001:
+ All buffers are now created by a malloc
+ reduction of the performances... but it is now more configurable...
+ .(MMX version is now 50 clocks per pixel)
+.28/12/2000:
+ Optimizing a little the sinFilter
+.27/12/2000:
+ Optimizing the buffer generator
+ .(previous : 767 clocks/pixel => now : 234 clk/pxl)
+ Adding two effect: AMULETTE and SCRUNCH
+.22/12/2000:
+ Good optimization : reducing mem access
+ .(MMX version is now 45 clocks per pixel)
+.13/12/2000:
+ Unrolling loop
+.12/12/2000:
+ Optimisation of the ASM code -> 64bits RAM access
+ .(MMX version is now 55 clocks per pixel)
+.10/12/2000:
+ MMX version of the zoomer
+ .(MMX version is now 70 clocks per pixel)
+
+author: Jean-Christophe Hoelt <jeko@ios-software.com>
diff --git a/src/visualizations/Goom/goom2k4-0/KNOWNBUGS b/src/visualizations/Goom/goom2k4-0/KNOWNBUGS
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/KNOWNBUGS
@@ -0,0 +1 @@
+
diff --git a/src/visualizations/Goom/goom2k4-0/Makefile.am b/src/visualizations/Goom/goom2k4-0/Makefile.am
new file mode 100644
index 0000000000..a4392f2f03
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/Makefile.am
@@ -0,0 +1,7 @@
+SUBDIRS = src xmms-goom sdl-goom @MACFOLDER@
+
+#.pc file
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = libgoom2.pc
+
+DISTCLEANFILES = libgoom2.pc
diff --git a/src/visualizations/Goom/goom2k4-0/NEWS b/src/visualizations/Goom/goom2k4-0/NEWS
new file mode 100644
index 0000000000..38a7ad034a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/NEWS
@@ -0,0 +1 @@
+see ChangeLog
diff --git a/src/visualizations/Goom/goom2k4-0/README b/src/visualizations/Goom/goom2k4-0/README
new file mode 100644
index 0000000000..161ecb62c9
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/README
@@ -0,0 +1,25 @@
+**************************
+* What a GOOM! version 2 *
+**************************
+copyright 2000-2004, by Jean-Christophe Hoelt <jeko@ios-software.com>
+
+This is my first visual plugins for XMMS, and I think that it's the best
+I have ever done !
+
+ /-----------------\\
+--< where to get Goom >--
+ \\-----------------/
+
+You can find the last version on the website of
+iOS software:
+http://www.ios-software.com/
+
+ /------\\
+--< thanks >--
+ \\------/
+
+Skal for the code of IFS
+Burkhard for the initial fullscreen patch
+Gyom for the iTunes version
+Fred for the Windows version and a lot of other Goom Stuff
+
diff --git a/src/visualizations/Goom/goom2k4-0/autogen.sh b/src/visualizations/Goom/goom2k4-0/autogen.sh
new file mode 100755
index 0000000000..c817953cfb
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/autogen.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+if libtoolize --version 2> /dev/null; then
+aclocal -I m4 && libtoolize --copy --force && automake --foreign --add-missing && autoconf && ./configure $*
+else
+aclocal -I m4 && glibtoolize --copy --force && automake --foreign --add-missing && autoconf && ./configure $*
+fi
+
diff --git a/src/visualizations/Goom/goom2k4-0/configure.in b/src/visualizations/Goom/goom2k4-0/configure.in
new file mode 100644
index 0000000000..aab2d75ed2
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/configure.in
@@ -0,0 +1,147 @@
+AC_INIT(README)
+
+AM_DISABLE_STATIC
+AM_INIT_AUTOMAKE(SDL_Goom, 2k4)
+
+ACLOCAL="$ACLOCAL -I m4"
+
+AM_PROG_LIBTOOL
+AC_PROG_CC
+AC_PROG_LN_S
+AM_PROG_LEX
+AC_PROG_YACC
+
+AC_C_BIGENDIAN
+
+dnl Get the CFlags
+CFLAGS="${CFLAGS}"
+LDFLAGS="${LDFLAGS}"
+
+dnl *** check for xmms ***
+
+HAVE_XMMS="no"
+AM_CONDITIONAL(HAVE_XMMS,test "x$HAVE_XMMS" = "xyes")
+
+
+dnl *** SDL ***
+
+HAVE_SDL="no"
+AM_CONDITIONAL(HAVE_SDL,test "x$HAVE_SDL" = "xyes")
+
+
+dnl *** MMX ***
+
+dnl rm -f mmx_zoom.s
+HAVE_MMX="no"
+HAVE_PPC="no"
+MACTARGET="no"
+
+dnl HOST
+case "$host" in
+*-apple-darwin*)
+ MACTARGET="no"
+ MACFOLDER=""
+ AC_SUBST(MACFOLDER)
+ CCAS='$(CC)'
+ AC_SUBST(CCAS)
+ ;;
+*-*-cygwin*)
+ CFLAGS="$CFLAGS -mno-cygwin -mwindows"
+ LDFLAGS="$LDFLAGS -lmingw32"
+ ;;
+esac
+
+dnl ARCH
+case "$host" in
+i*86-*-*)
+ AC_DEFINE(HAVE_MMX)
+ AC_DEFINE(CPU_X86)
+ HAVE_MMX="yes"
+ ;;
+
+powerpc-*-*)
+ CCASFLAGS=-force_cpusubtype_ALL
+ AC_SUBST(CCASFLAGS)
+ AC_DEFINE(CPU_POWERPC)
+ HAVE_PPC="yes"
+ ;;
+
+esac
+AM_CONDITIONAL(HAVE_MMX,test "x$HAVE_MMX" = "xyes")
+AM_CONDITIONAL(HAVE_PPC,test "x$HAVE_PPC" = "xyes")
+AM_CONDITIONAL(MACTARGET,test "x$MACTARGET" = "xyes")
+
+
+AC_CHECK_HEADER(pthread.h,,AC_MSG_ERROR([*** POSIX thread support not installed - please install first ***]))
+
+PTHREAD_LIBS=error
+AC_CHECK_LIB(pthread, pthread_attr_init, PTHREAD_LIBS="-lpthread")
+
+if test "x$PTHREAD_LIBS" = xerror; then
+ AC_CHECK_LIB(pthreads, pthread_attr_init, PTHREAD_LIBS="-lpthreads")
+fi
+
+if test "x$PTHREAD_LIBS" = xerror; then
+ AC_CHECK_LIB(c_r, pthread_attr_init, PTHREAD_LIBS="-lc_r")
+fi
+
+if test "x$PTHREAD_LIBS" = xerror; then
+ AC_CHECK_FUNC(pthread_attr_init, PTHREAD_LIBS="")
+fi
+
+AC_SUBST(PTHREAD_LIBS)
+
+dnl rm -f mmx_zoom.s
+dnl echo -n checking for nasm...
+dnl if nasm -r 1> /dev/null 2> /dev/null
+dnl then
+dnl echo " `nasm -r` founded..";
+dnl else
+dnl echo " not found."
+dnl echo '*** NASM needed to build x86 assembly..***'
+dnl AC_MSG_ERROR
+dnl fi
+dnl esac
+
+dnl AC_DEFINE(USE_ASM_MMX)
+dnl ln -s mmx_zoom_x86.s mmx_zoom.s ;;
+dnl *)
+dnl ln -s mmx_zoom_dummy.s mmx_zoom.s ;;
+dnl esac
+
+AC_SUBST(CFLAGS)
+AC_SUBST(LDFLAGS)
+
+AC_OUTPUT(Makefile src/Makefile xmms-goom/Makefile sdl-goom/Makefile libgoom2.pc)
+
+dnl *** nice user info ***
+
+AC_MSG_NOTICE([goom2k4 was configured with the following options:])
+if test "x$HAVE_PPC" = "xyes"; then
+ AC_MSG_NOTICE([ ** PPC support enabled])
+else
+ AC_MSG_NOTICE([ PPC support disabled])
+fi
+if test "x$HAVE_MMX" = "xyes"; then
+ AC_MSG_NOTICE([ ** MMX support enabled])
+else
+ AC_MSG_NOTICE([ MMX support disabled])
+fi
+AC_MSG_NOTICE([ ** goom lib will be built])
+if test "x$HAVE_XMMS" = "xyes"; then
+ AC_MSG_NOTICE([ ** XMMS plugin will be built])
+else
+ AC_MSG_NOTICE([ XMMS plugin will not be built])
+fi
+if test "x$MACTARGET" = "xyes"; then
+ AC_MSG_NOTICE([ ** goom mac application will be built])
+ AC_MSG_NOTICE([ ** goom mac iTunes plugin will be built])
+else
+ AC_MSG_NOTICE([ goom mac application will not be built])
+ AC_MSG_NOTICE([ goom mac iTunes plugin will not be built])
+fi
+if test "x$HAVE_SDL" = "xyes"; then
+ AC_MSG_NOTICE([ ** goom sdl application will be built])
+else
+ AC_MSG_NOTICE([ goom sdl application will not be built])
+fi
diff --git a/src/visualizations/Goom/goom2k4-0/goom2k4.png b/src/visualizations/Goom/goom2k4-0/goom2k4.png
new file mode 100644
index 0000000000..957402dcfe
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/goom2k4.png
Binary files differ
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ABOUT-NLS b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ABOUT-NLS
new file mode 100644
index 0000000000..28d38c76fd
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ABOUT-NLS
@@ -0,0 +1,226 @@
+Notes on the Free Translation Project
+*************************************
+
+ Free software is going international! The Free Translation Project
+is a way to get maintainers of free software, translators, and users all
+together, so that will gradually become able to speak many languages.
+A few packages already provide translations for their messages.
+
+ If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site. But you do *not*
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+ Installers will find here some useful hints. These notes also
+explain how users should proceed for getting the programs to use the
+available translations. They tell how people wanting to contribute and
+work at translations should contact the appropriate team.
+
+ When reporting bugs in the `intl/' directory or bugs which may be
+related to internationalization, you should tell about the version of
+`gettext' which is used. The information can be found in the
+`intl/VERSION' file, in internationalized packages.
+
+One advise in advance
+=====================
+
+ If you want to exploit the full power of internationalization, you
+should configure it using
+
+ ./configure --with-included-gettext
+
+to force usage of internationalizing routines provided within this
+package, despite the existence of internationalizing capabilities in the
+operating system where this package is being installed. So far, only
+the `gettext' implementation in the GNU C library version 2 provides as
+many features (such as locale alias or message inheritance) as the
+implementation here. It is also not possible to offer this additional
+functionality on top of a `catgets' implementation. Future versions of
+GNU `gettext' will very likely convey even more functionality. So it
+might be a good idea to change to GNU `gettext' as soon as possible.
+
+ So you need not provide this option if you are using GNU libc 2 or
+you have installed a recent copy of the GNU gettext package with the
+included `libintl'.
+
+INSTALL Matters
+===============
+
+ Some packages are "localizable" when properly installed; the
+programs they contain can be made to speak your own native language.
+Most such packages use GNU `gettext'. Other packages have their own
+ways to internationalization, predating GNU `gettext'.
+
+ By default, this package will be installed to allow translation of
+messages. It will automatically detect whether the system provides
+usable `catgets' (if using this is selected by the installer) or
+`gettext' functions. If neither is available, the GNU `gettext' own
+library will be used. This library is wholly contained within this
+package, usually in the `intl/' subdirectory, so prior installation of
+the GNU `gettext' package is *not* required. Installers may use
+special options at configuration time for changing the default
+behaviour. The commands:
+
+ ./configure --with-included-gettext
+ ./configure --with-catgets
+ ./configure --disable-nls
+
+will respectively bypass any pre-existing `catgets' or `gettext' to use
+the internationalizing routines provided within this package, enable
+the use of the `catgets' functions (if found on the locale system), or
+else, *totally* disable translation of messages.
+
+ When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl.a' file and
+will decide to use this. This might be not what is desirable. You
+should use the more recent version of the GNU `gettext' library. I.e.
+if the file `intl/VERSION' shows that the library which comes with this
+package is more recent, you should use
+
+ ./configure --with-included-gettext
+
+to prevent auto-detection.
+
+ By default the configuration process will not test for the `catgets'
+function and therefore they will not be used. The reasons are already
+given above: the emulation on top of `catgets' cannot provide all the
+extensions provided by the GNU `gettext' library. If you nevertheless
+want to use the `catgets' functions use
+
+ ./configure --with-catgets
+
+to enable the test for `catgets' (this causes no harm if `catgets' is
+not available on your system). If you really select this option we
+would like to hear about the reasons because we cannot think of any
+good one ourself.
+
+ Internationalized packages have usually many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language. Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package. However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+Using This Package
+==================
+
+ As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+ISO 639 `LL' two-letter code prior to using the programs in the
+package. For example, let's suppose that you speak German. At the
+shell prompt, merely execute `setenv LANG de' (in `csh'),
+`export LANG; LANG=de' (in `sh') or `export LANG=de' (in `bash'). This
+can be done from your `.login' or `.profile' file, once and for all.
+
+ An operating system might already offer message localization for
+many of its programs, while other programs have been installed locally
+with the full capabilities of GNU `gettext'. Just using `gettext'
+extended syntax for `LANG' would break proper localization of already
+available operating system programs. In this case, users should set
+both `LANGUAGE' and `LANG' variables in their environment, as programs
+using GNU `gettext' give preference to `LANGUAGE'. For example, some
+Swedish users would rather read translations in German than English for
+when Swedish is not available. This is easily accomplished by setting
+`LANGUAGE' to `sv:de' while leaving `LANG' to `sv'.
+
+Translating Teams
+=================
+
+ For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list, courtesy of Linux
+International. You may reach your translation team at the address
+`LL@li.org', replacing LL by the two-letter ISO 639 code for your
+language. Language codes are *not* the same as the country codes given
+in ISO 3166. The following translation teams exist, as of December
+1997:
+
+ Chinese `zh', Czech `cs', Danish `da', Dutch `nl', English `en',
+ Esperanto `eo', Finnish `fi', French `fr', German `de', Hungarian
+ `hu', Irish `ga', Italian `it', Indonesian `id', Japanese `ja',
+ Korean `ko', Latin `la', Norwegian `no', Persian `fa', Polish
+ `pl', Portuguese `pt', Russian `ru', Slovenian `sl', Spanish `es',
+ Swedish `sv', and Turkish `tr'.
+
+For example, you may reach the Chinese translation team by writing to
+`zh@li.org'.
+
+ If you'd like to volunteer to *work* at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is *not* the same as the list itself, it has
+`-request' appended. For example, speakers of Swedish can send a
+message to `sv-request@li.org', having this message body:
+
+ subscribe
+
+ Keep in mind that team members are expected to participate
+*actively* in translations, or at solving translational difficulties,
+rather than merely lurking around. If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `translation@iro.umontreal.ca' to reach the
+coordinator for all translator teams.
+
+ The English team is special. It works at improving and uniformizing
+the terminology in use. Proven linguistic skill are praised more than
+programming skill, here.
+
+Available Packages
+==================
+
+ Languages are not equally supported in all packages. The following
+matrix shows the current state of internationalization, as of December
+1997. The matrix shows, in regard of each package, for which languages
+PO files have been submitted to translation coordination.
+
+ Ready PO files cs da de en es fi fr it ja ko nl no pl pt ru sl sv
+ .----------------------------------------------------.
+ bash | [] [] [] | 3
+ bison | [] [] [] | 3
+ clisp | [] [] [] [] | 4
+ cpio | [] [] [] [] [] [] | 6
+ diffutils | [] [] [] [] [] | 5
+ enscript | [] [] [] [] [] [] | 6
+ fileutils | [] [] [] [] [] [] [] [] [] [] | 10
+ findutils | [] [] [] [] [] [] [] [] [] | 9
+ flex | [] [] [] [] | 4
+ gcal | [] [] [] [] [] | 5
+ gettext | [] [] [] [] [] [] [] [] [] [] [] | 12
+ grep | [] [] [] [] [] [] [] [] [] [] | 10
+ hello | [] [] [] [] [] [] [] [] [] [] [] | 11
+ id-utils | [] [] [] | 3
+ indent | [] [] [] [] [] | 5
+ libc | [] [] [] [] [] [] [] | 7
+ m4 | [] [] [] [] [] [] | 6
+ make | [] [] [] [] [] [] | 6
+ music | [] [] | 2
+ ptx | [] [] [] [] [] [] [] [] | 8
+ recode | [] [] [] [] [] [] [] [] [] | 9
+ sh-utils | [] [] [] [] [] [] [] [] | 8
+ sharutils | [] [] [] [] [] [] | 6
+ tar | [] [] [] [] [] [] [] [] [] [] [] | 11
+ texinfo | [] [] [] | 3
+ textutils | [] [] [] [] [] [] [] [] [] | 9
+ wdiff | [] [] [] [] [] [] [] [] | 8
+ `----------------------------------------------------'
+ 17 languages cs da de en es fi fr it ja ko nl no pl pt ru sl sv
+ 27 packages 6 4 25 1 18 1 26 2 1 12 20 9 19 7 4 7 17 179
+
+ Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect. This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+ For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer. There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+ If December 1997 seems to be old, you may fetch a more recent copy
+of this `ABOUT-NLS' file on most GNU archive sites.
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/AUTHORS b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/AUTHORS
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/AUTHORS
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/COPYING b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/COPYING
new file mode 100644
index 0000000000..d60c31a97a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ChangeLog b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ChangeLog
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ChangeLog
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/INSTALL b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/INSTALL
new file mode 100644
index 0000000000..62ea076c1f
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/INSTALL
@@ -0,0 +1,231 @@
+Copyright 1994, 1995, 1996, 1999, 2000, 2001 Free Software Foundation,
+Inc.
+
+ This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for variables by setting
+them in the environment. You can do that on the command line like this:
+
+ ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory. After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it cannot guess the host type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the host
+platform (i.e., that on which the generated programs will eventually be
+run) with `--host=TYPE'. In this case, you should also specify the
+build platform with `--build=TYPE', because, in this case, it may not
+be possible to guess the build platform (it sometimes involves
+compiling and running simple test programs, and this can't be done if
+the compiler is a cross compiler).
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+will cause the specified gcc to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+`configure' Invocation
+======================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+ Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/Makefile.am b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/Makefile.am
new file mode 100644
index 0000000000..7d8239ce1d
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/Makefile.am
@@ -0,0 +1,29 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = intl po gtk-gui
+
+EXTRA_DIST = \
+ autogen.sh \
+ goom2.glade
+
+install-data-local:
+ @$(NORMAL_INSTALL)
+ if test -d $(srcdir)/pixmaps; then \
+ $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/pixmaps; \
+ for pixmap in $(srcdir)/pixmaps/*; do \
+ if test -f $$pixmap; then \
+ $(INSTALL_DATA) $$pixmap $(DESTDIR)$(pkgdatadir)/pixmaps; \
+ fi \
+ done \
+ fi
+
+dist-hook:
+ if test -d pixmaps; then \
+ mkdir $(distdir)/pixmaps; \
+ for pixmap in pixmaps/*; do \
+ if test -f $$pixmap; then \
+ cp -p $$pixmap $(distdir)/pixmaps; \
+ fi \
+ done \
+ fi
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/NEWS b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/NEWS
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/NEWS
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/README b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/README
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/README
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/acconfig.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/acconfig.h
new file mode 100644
index 0000000000..4a321c874e
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/acconfig.h
@@ -0,0 +1,9 @@
+#undef ENABLE_NLS
+#undef HAVE_CATGETS
+#undef HAVE_GETTEXT
+#undef HAVE_LC_MESSAGES
+#undef HAVE_STPCPY
+#undef HAVE_LIBSM
+#undef PACKAGE_LOCALE_DIR
+#undef PACKAGE_DATA_DIR
+#undef PACKAGE_SOURCE_DIR
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/aclocal.m4 b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/aclocal.m4
new file mode 100644
index 0000000000..4008210d10
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/aclocal.m4
@@ -0,0 +1,796 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4a
+
+dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# Do all the work for Automake. This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN(AM_INIT_AUTOMAKE,
+[AC_REQUIRE([AC_PROG_INSTALL])
+dnl We require 2.13 because we rely on SHELL being computed by configure.
+AC_PREREQ([2.13])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN(AM_SANITY_CHECK,
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "[$]*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ if test "[$]*" != "X $srcdir/configure conftestfile" \
+ && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "[$]2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN(AM_MISSING_PROG,
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+ $1=$2
+ AC_MSG_RESULT(found)
+else
+ $1="$3/missing $2"
+ AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file.
+
+AC_DEFUN(AM_CONFIG_HEADER,
+[AC_PREREQ([2.12])
+AC_CONFIG_HEADER([$1])
+dnl When config.status generates a header, we must update the stamp-h file.
+dnl This file resides in the same directory as the config header
+dnl that is generated. We must strip everything past the first ":",
+dnl and everything past the last "/".
+AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
+ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
+<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
+<<am_indx=1
+for am_file in <<$1>>; do
+ case " <<$>>CONFIG_HEADERS " in
+ *" <<$>>am_file "*<<)>>
+ echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
+ ;;
+ esac
+ am_indx=`expr "<<$>>am_indx" + 1`
+done<<>>dnl>>)
+changequote([,]))])
+
+
+# serial 1
+
+# @defmac AC_PROG_CC_STDC
+# @maindex PROG_CC_STDC
+# @ovindex CC
+# If the C compiler in not in ANSI C mode by default, try to add an option
+# to output variable @code{CC} to make it so. This macro tries various
+# options that select ANSI C on some system or another. It considers the
+# compiler to be in ANSI C mode if it handles function prototypes correctly.
+#
+# If you use this macro, you should check after calling it whether the C
+# compiler has been set to accept ANSI C; if not, the shell variable
+# @code{am_cv_prog_cc_stdc} is set to @samp{no}. If you wrote your source
+# code in ANSI C, you can make an un-ANSIfied copy of it by using the
+# program @code{ansi2knr}, which comes with Ghostscript.
+# @end defmac
+
+AC_DEFUN(AM_PROG_CC_STDC,
+[AC_REQUIRE([AC_PROG_CC])
+AC_BEFORE([$0], [AC_C_INLINE])
+AC_BEFORE([$0], [AC_C_CONST])
+dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require
+dnl a magic option to avoid problems with ANSI preprocessor commands
+dnl like #elif.
+dnl FIXME: can't do this because then AC_AIX won't work due to a
+dnl circular dependency.
+dnl AC_BEFORE([$0], [AC_PROG_CPP])
+AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C)
+AC_CACHE_VAL(am_cv_prog_cc_stdc,
+[am_cv_prog_cc_stdc=no
+ac_save_CC="$CC"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ AC_TRY_COMPILE(
+[#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+], [
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+],
+[am_cv_prog_cc_stdc="$ac_arg"; break])
+done
+CC="$ac_save_CC"
+])
+if test -z "$am_cv_prog_cc_stdc"; then
+ AC_MSG_RESULT([none needed])
+else
+ AC_MSG_RESULT($am_cv_prog_cc_stdc)
+fi
+case "x$am_cv_prog_cc_stdc" in
+ x|xno) ;;
+ *) CC="$CC $am_cv_prog_cc_stdc" ;;
+esac
+])
+
+# Configure paths for GTK+
+# Owen Taylor 97-11-3
+
+dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS
+dnl
+AC_DEFUN(AM_PATH_GTK,
+[dnl
+dnl Get the cflags and libraries from the gtk-config script
+dnl
+AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)],
+ gtk_config_prefix="$withval", gtk_config_prefix="")
+AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)],
+ gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="")
+AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program],
+ , enable_gtktest=yes)
+
+ for module in . $4
+ do
+ case "$module" in
+ gthread)
+ gtk_config_args="$gtk_config_args gthread"
+ ;;
+ esac
+ done
+
+ if test x$gtk_config_exec_prefix != x ; then
+ gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
+ if test x${GTK_CONFIG+set} != xset ; then
+ GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
+ fi
+ fi
+ if test x$gtk_config_prefix != x ; then
+ gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
+ if test x${GTK_CONFIG+set} != xset ; then
+ GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
+ fi
+ fi
+
+ AC_PATH_PROG(GTK_CONFIG, gtk-config, no)
+ min_gtk_version=ifelse([$1], ,0.99.7,$1)
+ AC_MSG_CHECKING(for GTK - version >= $min_gtk_version)
+ no_gtk=""
+ if test "$GTK_CONFIG" = "no" ; then
+ no_gtk=yes
+ else
+ GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
+ GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
+ gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+ gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+ if test "x$enable_gtktest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$GTK_LIBS $LIBS"
+dnl
+dnl Now check if the installed GTK is sufficiently new. (Also sanity
+dnl checks the results of gtk-config to some extent
+dnl
+ rm -f conf.gtktest
+ AC_TRY_RUN([
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ int major, minor, micro;
+ char *tmp_version;
+
+ system ("touch conf.gtktest");
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = g_strdup("$min_gtk_version");
+ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+ printf("%s, bad version string\n", "$min_gtk_version");
+ exit(1);
+ }
+
+ if ((gtk_major_version != $gtk_config_major_version) ||
+ (gtk_minor_version != $gtk_config_minor_version) ||
+ (gtk_micro_version != $gtk_config_micro_version))
+ {
+ printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
+ $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf ("*** was found! If gtk-config was correct, then it is best\n");
+ printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+ printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+ printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+ printf("*** required on your system.\n");
+ printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n");
+ printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n");
+ printf("*** before re-running configure\n");
+ }
+#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION)
+ else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+ (gtk_minor_version != GTK_MINOR_VERSION) ||
+ (gtk_micro_version != GTK_MICRO_VERSION))
+ {
+ printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+ GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+ printf("*** library (version %d.%d.%d)\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ }
+#endif /* defined (GTK_MAJOR_VERSION) ... */
+ else
+ {
+ if ((gtk_major_version > major) ||
+ ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+ ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
+ major, minor, micro);
+ printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+ printf("***\n");
+ printf("*** If you have already installed a sufficiently new version, this error\n");
+ printf("*** probably means that the wrong copy of the gtk-config shell script is\n");
+ printf("*** being found. The easiest way to fix this is to remove the old version\n");
+ printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n");
+ printf("*** correct copy of gtk-config. (In this case, you will have to\n");
+ printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+ printf("*** so that the correct libraries are found at run-time))\n");
+ }
+ }
+ return 1;
+}
+],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_gtk" = x ; then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ else
+ AC_MSG_RESULT(no)
+ if test "$GTK_CONFIG" = "no" ; then
+ echo "*** The gtk-config script installed by GTK could not be found"
+ echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the GTK_CONFIG environment variable to the"
+ echo "*** full path to gtk-config."
+ else
+ if test -f conf.gtktest ; then
+ :
+ else
+ echo "*** Could not run GTK test program, checking why..."
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$LIBS $GTK_LIBS"
+ AC_TRY_LINK([
+#include <gtk/gtk.h>
+#include <stdio.h>
+], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding GTK or finding the wrong"
+ echo "*** version of GTK. If it is not finding GTK, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+ echo "***"
+ echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
+ echo "*** came with the system with the command"
+ echo "***"
+ echo "*** rpm --erase --nodeps gtk gtk-devel" ],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means GTK was incorrectly installed"
+ echo "*** or that you have moved GTK since it was installed. In the latter case, you"
+ echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ GTK_CFLAGS=""
+ GTK_LIBS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(GTK_CFLAGS)
+ AC_SUBST(GTK_LIBS)
+ rm -f conf.gtktest
+])
+
+# Macro to add for using GNU gettext.
+# Ulrich Drepper <drepper@cygnus.com>, 1995.
+#
+# This file can be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+
+# serial 5
+
+AC_DEFUN(AM_WITH_NLS,
+ [AC_MSG_CHECKING([whether NLS is requested])
+ dnl Default is enabled NLS
+ AC_ARG_ENABLE(nls,
+ [ --disable-nls do not use Native Language Support],
+ USE_NLS=$enableval, USE_NLS=yes)
+ AC_MSG_RESULT($USE_NLS)
+ AC_SUBST(USE_NLS)
+
+ USE_INCLUDED_LIBINTL=no
+
+ dnl If we use NLS figure out what method
+ if test "$USE_NLS" = "yes"; then
+ AC_DEFINE(ENABLE_NLS)
+ AC_MSG_CHECKING([whether included gettext is requested])
+ AC_ARG_WITH(included-gettext,
+ [ --with-included-gettext use the GNU gettext library included here],
+ nls_cv_force_use_gnu_gettext=$withval,
+ nls_cv_force_use_gnu_gettext=no)
+ AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ dnl User does not insist on using GNU NLS library. Figure out what
+ dnl to use. If gettext or catgets are available (in this order) we
+ dnl use this. Else we have to fall back to GNU NLS library.
+ dnl catgets is only used if permitted by option --with-catgets.
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+ CATOBJEXT=NONE
+
+ AC_CHECK_HEADER(libintl.h,
+ [AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc,
+ [AC_TRY_LINK([#include <libintl.h>], [return (int) gettext ("")],
+ gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)])
+
+ if test "$gt_cv_func_gettext_libc" != "yes"; then
+ AC_CHECK_LIB(intl, bindtextdomain,
+ [AC_CACHE_CHECK([for gettext in libintl],
+ gt_cv_func_gettext_libintl,
+ [AC_CHECK_LIB(intl, gettext,
+ gt_cv_func_gettext_libintl=yes,
+ gt_cv_func_gettext_libintl=no)],
+ gt_cv_func_gettext_libintl=no)])
+ fi
+
+ if test "$gt_cv_func_gettext_libc" = "yes" \
+ || test "$gt_cv_func_gettext_libintl" = "yes"; then
+ AC_DEFINE(HAVE_GETTEXT)
+ AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
+ if test "$MSGFMT" != "no"; then
+ AC_CHECK_FUNCS(dcgettext)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
+ AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
+ return _nl_msg_cat_cntr],
+ [CATOBJEXT=.gmo
+ DATADIRNAME=share],
+ [CATOBJEXT=.mo
+ DATADIRNAME=lib])
+ INSTOBJEXT=.mo
+ fi
+ fi
+ ])
+
+ if test "$CATOBJEXT" = "NONE"; then
+ AC_MSG_CHECKING([whether catgets can be used])
+ AC_ARG_WITH(catgets,
+ [ --with-catgets use catgets functions if available],
+ nls_cv_use_catgets=$withval, nls_cv_use_catgets=no)
+ AC_MSG_RESULT($nls_cv_use_catgets)
+
+ if test "$nls_cv_use_catgets" = "yes"; then
+ dnl No gettext in C library. Try catgets next.
+ AC_CHECK_LIB(i, main)
+ AC_CHECK_FUNC(catgets,
+ [AC_DEFINE(HAVE_CATGETS)
+ INTLOBJS="\$(CATOBJS)"
+ AC_PATH_PROG(GENCAT, gencat, no)dnl
+ if test "$GENCAT" != "no"; then
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, no)
+ if test "$GMSGFMT" = "no"; then
+ AM_PATH_PROG_WITH_TEST(GMSGFMT, msgfmt,
+ [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)
+ fi
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
+ USE_INCLUDED_LIBINTL=yes
+ CATOBJEXT=.cat
+ INSTOBJEXT=.cat
+ DATADIRNAME=lib
+ INTLDEPS='$(top_builddir)/intl/libintl.a'
+ INTLLIBS=$INTLDEPS
+ LIBS=`echo $LIBS | sed -e 's/-lintl//'`
+ nls_cv_header_intl=intl/libintl.h
+ nls_cv_header_libgt=intl/libgettext.h
+ fi])
+ fi
+ fi
+
+ if test "$CATOBJEXT" = "NONE"; then
+ dnl Neither gettext nor catgets in included in the C library.
+ dnl Fall back on GNU gettext library.
+ nls_cv_use_gnu_gettext=yes
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions used to generate GNU NLS library.
+ INTLOBJS="\$(GETTOBJS)"
+ AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
+ AC_SUBST(MSGFMT)
+ USE_INCLUDED_LIBINTL=yes
+ CATOBJEXT=.gmo
+ INSTOBJEXT=.mo
+ DATADIRNAME=share
+ INTLDEPS='$(top_builddir)/intl/libintl.a'
+ INTLLIBS=$INTLDEPS
+ LIBS=`echo $LIBS | sed -e 's/-lintl//'`
+ nls_cv_header_intl=intl/libintl.h
+ nls_cv_header_libgt=intl/libgettext.h
+ fi
+
+ dnl Test whether we really found GNU xgettext.
+ if test "$XGETTEXT" != ":"; then
+ dnl If it is no GNU xgettext we define it as : so that the
+ dnl Makefiles still can work.
+ if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+ : ;
+ else
+ AC_MSG_RESULT(
+ [found xgettext program is not GNU xgettext; ignore it])
+ XGETTEXT=":"
+ fi
+ fi
+
+ # We need to process the po/ directory.
+ POSUB=po
+ else
+ DATADIRNAME=share
+ nls_cv_header_intl=intl/libintl.h
+ nls_cv_header_libgt=intl/libgettext.h
+ fi
+ AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl)
+ AC_OUTPUT_COMMANDS(
+ [case "$CONFIG_FILES" in *po/Makefile.in*)
+ sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
+ esac])
+
+
+ # If this is used in GNU gettext we have to set USE_NLS to `yes'
+ # because some of the sources are only built for this goal.
+ if test "$PACKAGE" = gettext; then
+ USE_NLS=yes
+ USE_INCLUDED_LIBINTL=yes
+ fi
+
+ dnl These rules are solely for the distribution goal. While doing this
+ dnl we only have to keep exactly one list of the available catalogs
+ dnl in configure.in.
+ for lang in $ALL_LINGUAS; do
+ GMOFILES="$GMOFILES $lang.gmo"
+ POFILES="$POFILES $lang.po"
+ done
+
+ dnl Make all variables we use known to autoconf.
+ AC_SUBST(USE_INCLUDED_LIBINTL)
+ AC_SUBST(CATALOGS)
+ AC_SUBST(CATOBJEXT)
+ AC_SUBST(DATADIRNAME)
+ AC_SUBST(GMOFILES)
+ AC_SUBST(INSTOBJEXT)
+ AC_SUBST(INTLDEPS)
+ AC_SUBST(INTLLIBS)
+ AC_SUBST(INTLOBJS)
+ AC_SUBST(POFILES)
+ AC_SUBST(POSUB)
+ ])
+
+AC_DEFUN(AM_GNU_GETTEXT,
+ [AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_PROG_RANLIB])dnl
+ AC_REQUIRE([AC_ISC_POSIX])dnl
+ AC_REQUIRE([AC_HEADER_STDC])dnl
+ AC_REQUIRE([AC_C_CONST])dnl
+ AC_REQUIRE([AC_C_INLINE])dnl
+ AC_REQUIRE([AC_TYPE_OFF_T])dnl
+ AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+ AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+ AC_REQUIRE([AC_FUNC_MMAP])dnl
+
+ AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \
+unistd.h sys/param.h])
+ AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \
+strdup __argz_count __argz_stringify __argz_next])
+
+ if test "${ac_cv_func_stpcpy+set}" != "set"; then
+ AC_CHECK_FUNCS(stpcpy)
+ fi
+ if test "${ac_cv_func_stpcpy}" = "yes"; then
+ AC_DEFINE(HAVE_STPCPY)
+ fi
+
+ AM_LC_MESSAGES
+ AM_WITH_NLS
+
+ if test "x$CATOBJEXT" != "x"; then
+ if test "x$ALL_LINGUAS" = "x"; then
+ LINGUAS=
+ else
+ AC_MSG_CHECKING(for catalogs to be installed)
+ NEW_LINGUAS=
+ for lang in ${LINGUAS=$ALL_LINGUAS}; do
+ case "$ALL_LINGUAS" in
+ *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
+ esac
+ done
+ LINGUAS=$NEW_LINGUAS
+ AC_MSG_RESULT($LINGUAS)
+ fi
+
+ dnl Construct list of names of catalog files to be constructed.
+ if test -n "$LINGUAS"; then
+ for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+ fi
+ fi
+
+ dnl The reference to <locale.h> in the installed <libintl.h> file
+ dnl must be resolved because we cannot expect the users of this
+ dnl to define HAVE_LOCALE_H.
+ if test $ac_cv_header_locale_h = yes; then
+ INCLUDE_LOCALE_H="#include <locale.h>"
+ else
+ INCLUDE_LOCALE_H="\
+/* The system does not provide the header <locale.h>. Take care yourself. */"
+ fi
+ AC_SUBST(INCLUDE_LOCALE_H)
+
+ dnl Determine which catalog format we have (if any is needed)
+ dnl For now we know about two different formats:
+ dnl Linux libc-5 and the normal X/Open format
+ test -d intl || mkdir intl
+ if test "$CATOBJEXT" = ".cat"; then
+ AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen)
+
+ dnl Transform the SED scripts while copying because some dumb SEDs
+ dnl cannot handle comments.
+ sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed
+ fi
+ dnl po2tbl.sed is always needed.
+ sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \
+ $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed
+
+ dnl In the intl/Makefile.in we have a special dependency which makes
+ dnl only sense for gettext. We comment this out for non-gettext
+ dnl packages.
+ if test "$PACKAGE" = "gettext"; then
+ GT_NO="#NO#"
+ GT_YES=
+ else
+ GT_NO=
+ GT_YES="#YES#"
+ fi
+ AC_SUBST(GT_NO)
+ AC_SUBST(GT_YES)
+
+ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+ dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
+ dnl Try to locate is.
+ MKINSTALLDIRS=
+ if test -n "$ac_aux_dir"; then
+ MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+ fi
+ if test -z "$MKINSTALLDIRS"; then
+ MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+ fi
+ AC_SUBST(MKINSTALLDIRS)
+
+ dnl *** For now the libtool support in intl/Makefile is not for real.
+ l=
+ AC_SUBST(l)
+
+ dnl Generate list of files to be processed by xgettext which will
+ dnl be included in po/Makefile.
+ test -d po || mkdir po
+ if test "x$srcdir" != "x."; then
+ if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
+ posrcprefix="$srcdir/"
+ else
+ posrcprefix="../$srcdir/"
+ fi
+ else
+ posrcprefix="../"
+ fi
+ rm -f po/POTFILES
+ sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
+ < $srcdir/po/POTFILES.in > po/POTFILES
+ ])
+
+# Search path for a program which passes the given test.
+# Ulrich Drepper <drepper@cygnus.com>, 1996.
+#
+# This file can be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+
+# serial 1
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN(AM_PATH_PROG_WITH_TEST,
+[# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+ /*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test -n "[$]$1"; then
+ AC_MSG_RESULT([$]$1)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+# Ulrich Drepper <drepper@cygnus.com>, 1995.
+#
+# This file can be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+
+# serial 1
+
+AC_DEFUN(AM_LC_MESSAGES,
+ [if test $ac_cv_header_locale_h = yes; then
+ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ AC_DEFINE(HAVE_LC_MESSAGES)
+ fi
+ fi])
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/autogen.sh b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/autogen.sh
new file mode 100755
index 0000000000..293b7972e8
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/autogen.sh
@@ -0,0 +1,148 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+srcdir=`dirname $0`
+PKG_NAME="the package."
+
+DIE=0
+
+(autoconf --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "**Error**: You must have \`autoconf' installed to."
+ echo "Download the appropriate package for your distribution,"
+ echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+ DIE=1
+}
+
+(grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && {
+ (libtool --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "**Error**: You must have \`libtool' installed."
+ echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz"
+ echo "(or a newer version if it is available)"
+ DIE=1
+ }
+}
+
+grep "^AM_GNU_GETTEXT" $srcdir/configure.in >/dev/null && {
+ grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \
+ (gettext --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "**Error**: You must have \`gettext' installed."
+ echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
+ echo "(or a newer version if it is available)"
+ DIE=1
+ }
+}
+
+grep "^AM_GNOME_GETTEXT" $srcdir/configure.in >/dev/null && {
+ grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \
+ (gettext --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "**Error**: You must have \`gettext' installed."
+ echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
+ echo "(or a newer version if it is available)"
+ DIE=1
+ }
+}
+
+(automake --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "**Error**: You must have \`automake' installed."
+ echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
+ echo "(or a newer version if it is available)"
+ DIE=1
+ NO_AUTOMAKE=yes
+}
+
+
+# if no automake, don't bother testing for aclocal
+test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || {
+ echo
+ echo "**Error**: Missing \`aclocal'. The version of \`automake'"
+ echo "installed doesn't appear recent enough."
+ echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
+ echo "(or a newer version if it is available)"
+ DIE=1
+}
+
+if test "$DIE" -eq 1; then
+ exit 1
+fi
+
+if test -z "$*"; then
+ echo "**Warning**: I am going to run \`configure' with no arguments."
+ echo "If you wish to pass any to it, please specify them on the"
+ echo \`$0\'" command line."
+ echo
+fi
+
+case $CC in
+xlc )
+ am_opt=--include-deps;;
+esac
+
+for coin in `find $srcdir -name configure.in -print`
+do
+ dr=`dirname $coin`
+ if test -f $dr/NO-AUTO-GEN; then
+ echo skipping $dr -- flagged as no auto-gen
+ else
+ echo processing $dr
+ macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin`
+ ( cd $dr
+ aclocalinclude="$ACLOCAL_FLAGS"
+ for k in $macrodirs; do
+ if test -d $k; then
+ aclocalinclude="$aclocalinclude -I $k"
+ ##else
+ ## echo "**Warning**: No such directory \`$k'. Ignored."
+ fi
+ done
+ if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then
+ if grep "sed.*POTFILES" configure.in >/dev/null; then
+ : do nothing -- we still have an old unmodified configure.in
+ else
+ echo "Creating $dr/aclocal.m4 ..."
+ test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+ echo "Running gettextize... Ignore non-fatal messages."
+ echo "no" | gettextize --force --copy
+ echo "Making $dr/aclocal.m4 writable ..."
+ test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+ fi
+ fi
+ if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then
+ echo "Creating $dr/aclocal.m4 ..."
+ test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+ echo "Running gettextize... Ignore non-fatal messages."
+ echo "no" | gettextize --force --copy
+ echo "Making $dr/aclocal.m4 writable ..."
+ test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+ fi
+ if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
+ echo "Running libtoolize..."
+ libtoolize --force --copy
+ fi
+ echo "Running aclocal $aclocalinclude ..."
+ aclocal $aclocalinclude
+ if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then
+ echo "Running autoheader..."
+ autoheader
+ fi
+ echo "Running automake --gnu $am_opt ..."
+ automake --add-missing --gnu $am_opt
+ echo "Running autoconf ..."
+ autoconf
+ )
+ fi
+done
+
+#conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c
+
+if test x$NOCONFIGURE = x; then
+ echo Running $srcdir/configure $conf_flags "$@" ...
+ $srcdir/configure $conf_flags "$@" \
+ && echo Now type \`make\' to compile $PKG_NAME
+else
+ echo Skipping configure process.
+fi
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/config.h.in b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/config.h.in
new file mode 100644
index 0000000000..accf1c8def
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/config.h.in
@@ -0,0 +1,134 @@
+/* config.h.in. Generated automatically from configure.in by autoheader. */
+
+/* Define if using alloca.c. */
+#undef C_ALLOCA
+
+/* Define to empty if the keyword does not work. */
+#undef const
+
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+ This function is required for alloca.c support on those systems. */
+#undef CRAY_STACKSEG_END
+
+/* Define if you have alloca, as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
+#undef HAVE_ALLOCA_H
+
+/* Define if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define as __inline if that's what the C compiler calls it. */
+#undef inline
+
+/* Define to `long' if <sys/types.h> doesn't define. */
+#undef off_t
+
+/* Define if you need to in order for stat and other things to work. */
+#undef _POSIX_SOURCE
+
+/* Define to `unsigned' if <sys/types.h> doesn't define. */
+#undef size_t
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at run-time.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown
+ */
+#undef STACK_DIRECTION
+
+/* Define if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define if your processor stores words with the most significant
+ byte first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+#undef ENABLE_NLS
+#undef HAVE_CATGETS
+#undef HAVE_GETTEXT
+#undef HAVE_LC_MESSAGES
+#undef HAVE_STPCPY
+#undef HAVE_LIBSM
+#undef PACKAGE_LOCALE_DIR
+#undef PACKAGE_DATA_DIR
+#undef PACKAGE_SOURCE_DIR
+
+/* Define if you have the __argz_count function. */
+#undef HAVE___ARGZ_COUNT
+
+/* Define if you have the __argz_next function. */
+#undef HAVE___ARGZ_NEXT
+
+/* Define if you have the __argz_stringify function. */
+#undef HAVE___ARGZ_STRINGIFY
+
+/* Define if you have the dcgettext function. */
+#undef HAVE_DCGETTEXT
+
+/* Define if you have the getcwd function. */
+#undef HAVE_GETCWD
+
+/* Define if you have the getpagesize function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have the munmap function. */
+#undef HAVE_MUNMAP
+
+/* Define if you have the putenv function. */
+#undef HAVE_PUTENV
+
+/* Define if you have the setenv function. */
+#undef HAVE_SETENV
+
+/* Define if you have the setlocale function. */
+#undef HAVE_SETLOCALE
+
+/* Define if you have the stpcpy function. */
+#undef HAVE_STPCPY
+
+/* Define if you have the strcasecmp function. */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strchr function. */
+#undef HAVE_STRCHR
+
+/* Define if you have the strdup function. */
+#undef HAVE_STRDUP
+
+/* Define if you have the <argz.h> header file. */
+#undef HAVE_ARGZ_H
+
+/* Define if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define if you have the <malloc.h> header file. */
+#undef HAVE_MALLOC_H
+
+/* Define if you have the <nl_types.h> header file. */
+#undef HAVE_NL_TYPES_H
+
+/* Define if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the i library (-li). */
+#undef HAVE_LIBI
+
+/* Name of package */
+#undef PACKAGE
+
+/* Version number of package */
+#undef VERSION
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure
new file mode 100755
index 0000000000..3b328cda9a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure
@@ -0,0 +1,4206 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)"
+ac_help="$ac_help
+ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)"
+ac_help="$ac_help
+ --disable-gtktest Do not try to compile and run a test GTK program"
+ac_help="$ac_help
+ --disable-nls do not use Native Language Support"
+ac_help="$ac_help
+ --with-included-gettext use the GNU gettext library included here"
+ac_help="$ac_help
+ --with-catgets use catgets functions if available"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=configure.in
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:568: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+echo "configure:621: checking whether build environment is sane" >&5
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ if test "$*" != "X $srcdir/configure conftestfile" \
+ && test "$*" != "X conftestfile $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { echo "configure: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" 1>&2; exit 1; }
+ fi
+
+ test "$2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ { echo "configure: error: newly created file is older than distributed files!
+Check your system clock" 1>&2; exit 1; }
+fi
+rm -f conftest*
+echo "$ac_t""yes" 1>&6
+if test "$program_transform_name" = s,x,x,; then
+ program_transform_name=
+else
+ # Double any \ or $. echo might interpret backslashes.
+ cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+ program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+ rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:678: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+
+PACKAGE=goom2
+
+VERSION=0.1
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+fi
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+echo "configure:725: checking for working aclocal" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+ ACLOCAL=aclocal
+ echo "$ac_t""found" 1>&6
+else
+ ACLOCAL="$missing_dir/missing aclocal"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+echo "configure:738: checking for working autoconf" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+ AUTOCONF=autoconf
+ echo "$ac_t""found" 1>&6
+else
+ AUTOCONF="$missing_dir/missing autoconf"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working automake""... $ac_c" 1>&6
+echo "configure:751: checking for working automake" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+ AUTOMAKE=automake
+ echo "$ac_t""found" 1>&6
+else
+ AUTOMAKE="$missing_dir/missing automake"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+echo "configure:764: checking for working autoheader" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+ AUTOHEADER=autoheader
+ echo "$ac_t""found" 1>&6
+else
+ AUTOHEADER="$missing_dir/missing autoheader"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+echo "configure:777: checking for working makeinfo" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+ MAKEINFO=makeinfo
+ echo "$ac_t""found" 1>&6
+else
+ MAKEINFO="$missing_dir/missing makeinfo"
+ echo "$ac_t""missing" 1>&6
+fi
+
+
+
+
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:797: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:827: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:878: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:910: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 921 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:926: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:952: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:957: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:966: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:985: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+
+echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
+echo "configure:1017: checking for POSIXized ISC" >&5
+if test -d /etc/conf/kconfig.d &&
+ grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
+then
+ echo "$ac_t""yes" 1>&6
+ ISC=yes # If later tests want to check for ISC.
+ cat >> confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+ if test "$GCC" = yes; then
+ CC="$CC -posix"
+ else
+ CC="$CC -Xp"
+ fi
+else
+ echo "$ac_t""no" 1>&6
+ ISC=
+fi
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1040: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1070: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1121: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:1153: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 1164 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:1169: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:1195: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1200: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1209: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1228: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+
+
+
+
+echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6
+echo "configure:1263: checking for ${CC-cc} option to accept ANSI C" >&5
+if eval "test \"`echo '$''{'am_cv_prog_cc_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ am_cv_prog_cc_stdc=no
+ac_save_CC="$CC"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ cat > conftest.$ac_ext <<EOF
+#line 1279 "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+
+int main() {
+
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+
+; return 0; }
+EOF
+if { (eval echo configure:1316: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ am_cv_prog_cc_stdc="$ac_arg"; break
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+CC="$ac_save_CC"
+
+fi
+
+if test -z "$am_cv_prog_cc_stdc"; then
+ echo "$ac_t""none needed" 1>&6
+else
+ echo "$ac_t""$am_cv_prog_cc_stdc" 1>&6
+fi
+case "x$am_cv_prog_cc_stdc" in
+ x|xno) ;;
+ *) CC="$CC $am_cv_prog_cc_stdc" ;;
+esac
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1340: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 1355 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1361: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 1372 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1378: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 1389 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1395: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1420: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1425 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1433: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ ac_cv_header_stdc=yes
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1450 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1468 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+ :
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1489 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:1500: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ :
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+ cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
+echo "configure:1524: checking whether byte ordering is bigendian" >&5
+if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_cv_c_bigendian=unknown
+# See if sys/param.h defines the BYTE_ORDER macro.
+cat > conftest.$ac_ext <<EOF
+#line 1531 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/param.h>
+int main() {
+
+#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+ bogus endian macros
+#endif
+; return 0; }
+EOF
+if { (eval echo configure:1542: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+cat > conftest.$ac_ext <<EOF
+#line 1546 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/param.h>
+int main() {
+
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+#endif
+; return 0; }
+EOF
+if { (eval echo configure:1557: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_bigendian=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_c_bigendian=no
+fi
+rm -f conftest*
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+if test $ac_cv_c_bigendian = unknown; then
+if test "$cross_compiling" = yes; then
+ { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1577 "configure"
+#include "confdefs.h"
+main () {
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long l;
+ char c[sizeof (long)];
+ } u;
+ u.l = 1;
+ exit (u.c[sizeof (long) - 1] == 1);
+}
+EOF
+if { (eval echo configure:1590: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_c_bigendian=no
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_c_bigendian=yes
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_c_bigendian" 1>&6
+if test $ac_cv_c_bigendian = yes; then
+ cat >> confdefs.h <<\EOF
+#define WORDS_BIGENDIAN 1
+EOF
+
+fi
+
+
+
+# Check whether --with-gtk-prefix or --without-gtk-prefix was given.
+if test "${with_gtk_prefix+set}" = set; then
+ withval="$with_gtk_prefix"
+ gtk_config_prefix="$withval"
+else
+ gtk_config_prefix=""
+fi
+
+# Check whether --with-gtk-exec-prefix or --without-gtk-exec-prefix was given.
+if test "${with_gtk_exec_prefix+set}" = set; then
+ withval="$with_gtk_exec_prefix"
+ gtk_config_exec_prefix="$withval"
+else
+ gtk_config_exec_prefix=""
+fi
+
+# Check whether --enable-gtktest or --disable-gtktest was given.
+if test "${enable_gtktest+set}" = set; then
+ enableval="$enable_gtktest"
+ :
+else
+ enable_gtktest=yes
+fi
+
+
+ for module in .
+ do
+ case "$module" in
+ gthread)
+ gtk_config_args="$gtk_config_args gthread"
+ ;;
+ esac
+ done
+
+ if test x$gtk_config_exec_prefix != x ; then
+ gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
+ if test x${GTK_CONFIG+set} != xset ; then
+ GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
+ fi
+ fi
+ if test x$gtk_config_prefix != x ; then
+ gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
+ if test x${GTK_CONFIG+set} != xset ; then
+ GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
+ fi
+ fi
+
+ # Extract the first word of "gtk-config", so it can be a program name with args.
+set dummy gtk-config; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1665: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GTK_CONFIG" in
+ /*)
+ ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GTK_CONFIG="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no"
+ ;;
+esac
+fi
+GTK_CONFIG="$ac_cv_path_GTK_CONFIG"
+if test -n "$GTK_CONFIG"; then
+ echo "$ac_t""$GTK_CONFIG" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ min_gtk_version=1.2.0
+ echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6
+echo "configure:1700: checking for GTK - version >= $min_gtk_version" >&5
+ no_gtk=""
+ if test "$GTK_CONFIG" = "no" ; then
+ no_gtk=yes
+ else
+ GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
+ GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
+ gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+ gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+ gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+ if test "x$enable_gtktest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$GTK_LIBS $LIBS"
+ rm -f conf.gtktest
+ if test "$cross_compiling" = yes; then
+ echo $ac_n "cross compiling; assumed OK... $ac_c"
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1723 "configure"
+#include "confdefs.h"
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ int major, minor, micro;
+ char *tmp_version;
+
+ system ("touch conf.gtktest");
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = g_strdup("$min_gtk_version");
+ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+ printf("%s, bad version string\n", "$min_gtk_version");
+ exit(1);
+ }
+
+ if ((gtk_major_version != $gtk_config_major_version) ||
+ (gtk_minor_version != $gtk_config_minor_version) ||
+ (gtk_micro_version != $gtk_config_micro_version))
+ {
+ printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
+ $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf ("*** was found! If gtk-config was correct, then it is best\n");
+ printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+ printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+ printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+ printf("*** required on your system.\n");
+ printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n");
+ printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n");
+ printf("*** before re-running configure\n");
+ }
+#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION)
+ else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+ (gtk_minor_version != GTK_MINOR_VERSION) ||
+ (gtk_micro_version != GTK_MICRO_VERSION))
+ {
+ printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+ GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+ printf("*** library (version %d.%d.%d)\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ }
+#endif /* defined (GTK_MAJOR_VERSION) ... */
+ else
+ {
+ if ((gtk_major_version > major) ||
+ ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+ ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
+ major, minor, micro);
+ printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+ printf("***\n");
+ printf("*** If you have already installed a sufficiently new version, this error\n");
+ printf("*** probably means that the wrong copy of the gtk-config shell script is\n");
+ printf("*** being found. The easiest way to fix this is to remove the old version\n");
+ printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n");
+ printf("*** correct copy of gtk-config. (In this case, you will have to\n");
+ printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+ printf("*** so that the correct libraries are found at run-time))\n");
+ }
+ }
+ return 1;
+}
+
+EOF
+if { (eval echo configure:1801: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ :
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ no_gtk=yes
+fi
+rm -fr conftest*
+fi
+
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_gtk" = x ; then
+ echo "$ac_t""yes" 1>&6
+ :
+ else
+ echo "$ac_t""no" 1>&6
+ if test "$GTK_CONFIG" = "no" ; then
+ echo "*** The gtk-config script installed by GTK could not be found"
+ echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the GTK_CONFIG environment variable to the"
+ echo "*** full path to gtk-config."
+ else
+ if test -f conf.gtktest ; then
+ :
+ else
+ echo "*** Could not run GTK test program, checking why..."
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$LIBS $GTK_LIBS"
+ cat > conftest.$ac_ext <<EOF
+#line 1835 "configure"
+#include "confdefs.h"
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+
+int main() {
+ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version));
+; return 0; }
+EOF
+if { (eval echo configure:1845: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding GTK or finding the wrong"
+ echo "*** version of GTK. If it is not finding GTK, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+ echo "***"
+ echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
+ echo "*** came with the system with the command"
+ echo "***"
+ echo "*** rpm --erase --nodeps gtk gtk-devel"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means GTK was incorrectly installed"
+ echo "*** or that you have moved GTK since it was installed. In the latter case, you"
+ echo "*** may want to edit the gtk-config script: $GTK_CONFIG"
+fi
+rm -f conftest*
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ GTK_CFLAGS=""
+ GTK_LIBS=""
+ { echo "configure: error: Cannot find GTK: Is gtk-config in path?" 1>&2; exit 1; }
+ fi
+
+
+ rm -f conf.gtktest
+
+
+ALL_LINGUAS=""
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1888: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1916: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1921 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this. */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this. */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this. */
+struct point {int x, y;};
+static struct point const zero = {0,0};
+/* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in an arm
+ of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:1970: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_const=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+ cat >> confdefs.h <<\EOF
+#define const
+EOF
+
+fi
+
+echo $ac_n "checking for inline""... $ac_c" 1>&6
+echo "configure:1991: checking for inline" >&5
+if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat > conftest.$ac_ext <<EOF
+#line 1998 "configure"
+#include "confdefs.h"
+
+int main() {
+} $ac_kw foo() {
+; return 0; }
+EOF
+if { (eval echo configure:2005: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_inline=$ac_kw; break
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+
+fi
+
+echo "$ac_t""$ac_cv_c_inline" 1>&6
+case "$ac_cv_c_inline" in
+ inline | yes) ;;
+ no) cat >> confdefs.h <<\EOF
+#define inline
+EOF
+ ;;
+ *) cat >> confdefs.h <<EOF
+#define inline $ac_cv_c_inline
+EOF
+ ;;
+esac
+
+echo $ac_n "checking for off_t""... $ac_c" 1>&6
+echo "configure:2031: checking for off_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2036 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_type_off_t=yes
+else
+ rm -rf conftest*
+ ac_cv_type_off_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_off_t" 1>&6
+if test $ac_cv_type_off_t = no; then
+ cat >> confdefs.h <<\EOF
+#define off_t long
+EOF
+
+fi
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:2064: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2069 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_type_size_t=yes
+else
+ rm -rf conftest*
+ ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+ cat >> confdefs.h <<\EOF
+#define size_t unsigned
+EOF
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
+echo "configure:2099: checking for working alloca.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2104 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int main() {
+char *p = alloca(2 * sizeof(int));
+; return 0; }
+EOF
+if { (eval echo configure:2111: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_header_alloca_h=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_alloca_h=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_alloca_h" 1>&6
+if test $ac_cv_header_alloca_h = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA_H 1
+EOF
+
+fi
+
+echo $ac_n "checking for alloca""... $ac_c" 1>&6
+echo "configure:2132: checking for alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2137 "configure"
+#include "confdefs.h"
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+int main() {
+char *p = (char *) alloca(1);
+; return 0; }
+EOF
+if { (eval echo configure:2165: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_func_alloca_works=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_func_alloca_works=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_func_alloca_works" 1>&6
+if test $ac_cv_func_alloca_works = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA 1
+EOF
+
+fi
+
+if test $ac_cv_func_alloca_works = no; then
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+ # that cause trouble. Some versions do not even contain alloca or
+ # contain a buggy version. If you still want to use their alloca,
+ # use ar to extract alloca.o from them instead of compiling alloca.c.
+ ALLOCA=alloca.${ac_objext}
+ cat >> confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+
+echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+echo "configure:2197: checking whether alloca needs Cray hooks" >&5
+if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2202 "configure"
+#include "confdefs.h"
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "webecray" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_os_cray=yes
+else
+ rm -rf conftest*
+ ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_os_cray" 1>&6
+if test $ac_cv_os_cray = yes; then
+for ac_func in _getb67 GETB67 getb67; do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2227: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2232 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2255: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<EOF
+#define CRAY_STACKSEG_END $ac_func
+EOF
+
+ break
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+done
+fi
+
+echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
+echo "configure:2282: checking stack direction for C alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_c_stack_direction=0
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2290 "configure"
+#include "confdefs.h"
+find_stack_direction ()
+{
+ static char *addr = 0;
+ auto char dummy;
+ if (addr == 0)
+ {
+ addr = &dummy;
+ return find_stack_direction ();
+ }
+ else
+ return (&dummy > addr) ? 1 : -1;
+}
+main ()
+{
+ exit (find_stack_direction() < 0);
+}
+EOF
+if { (eval echo configure:2309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_c_stack_direction=1
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_c_stack_direction=-1
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_c_stack_direction" 1>&6
+cat >> confdefs.h <<EOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+EOF
+
+fi
+
+for ac_hdr in unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2334: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2339 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2344: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in getpagesize
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2373: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2378 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2401: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking for working mmap""... $ac_c" 1>&6
+echo "configure:2426: checking for working mmap" >&5
+if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_mmap_fixed_mapped=no
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2434 "configure"
+#include "confdefs.h"
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+ Here is a matrix of mmap possibilities:
+ mmap private not fixed
+ mmap private fixed at somewhere currently unmapped
+ mmap private fixed at somewhere already mapped
+ mmap shared not fixed
+ mmap shared fixed at somewhere currently unmapped
+ mmap shared fixed at somewhere already mapped
+ For private mappings, we should verify that changes cannot be read()
+ back from the file, nor mmap's back from the file at a different
+ address. (There have been systems where private was not correctly
+ implemented like the infamous i386 svr4.0, and systems where the
+ VM page cache was not coherent with the filesystem buffer cache
+ like early versions of FreeBSD and possibly contemporary NetBSD.)
+ For shared mappings, we should conversely verify that changes get
+ propogated back to all the places they're supposed to be.
+
+ Grep wants private fixed already mapped.
+ The main things grep needs to know about mmap are:
+ * does it exist and is it safe to write into the mmap'd area
+ * how to use it (BSD variants) */
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+/* This mess was copied from the GNU getpagesize.h. */
+#ifndef HAVE_GETPAGESIZE
+# ifdef HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+
+/* Assume that all systems that can run configure have sys/param.h. */
+# ifndef HAVE_SYS_PARAM_H
+# define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+# define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+# ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else /* no EXEC_PAGESIZE */
+# ifdef NBPG
+# define getpagesize() NBPG * CLSIZE
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif /* no CLSIZE */
+# else /* no NBPG */
+# ifdef NBPC
+# define getpagesize() NBPC
+# else /* no NBPC */
+# ifdef PAGESIZE
+# define getpagesize() PAGESIZE
+# endif /* PAGESIZE */
+# endif /* no NBPC */
+# endif /* no NBPG */
+# endif /* no EXEC_PAGESIZE */
+# else /* no HAVE_SYS_PARAM_H */
+# define getpagesize() 8192 /* punt totally */
+# endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+#ifdef __cplusplus
+extern "C" { void *malloc(unsigned); }
+#else
+char *malloc();
+#endif
+
+int
+main()
+{
+ char *data, *data2, *data3;
+ int i, pagesize;
+ int fd;
+
+ pagesize = getpagesize();
+
+ /*
+ * First, make a file with some known garbage in it.
+ */
+ data = malloc(pagesize);
+ if (!data)
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ *(data + i) = rand();
+ umask(0);
+ fd = creat("conftestmmap", 0600);
+ if (fd < 0)
+ exit(1);
+ if (write(fd, data, pagesize) != pagesize)
+ exit(1);
+ close(fd);
+
+ /*
+ * Next, try to mmap the file at a fixed address which
+ * already has something else allocated at it. If we can,
+ * also make sure that we see the same garbage.
+ */
+ fd = open("conftestmmap", O_RDWR);
+ if (fd < 0)
+ exit(1);
+ data2 = malloc(2 * pagesize);
+ if (!data2)
+ exit(1);
+ data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
+ if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED, fd, 0L))
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data2 + i))
+ exit(1);
+
+ /*
+ * Finally, make sure that changes to the mapped area
+ * do not percolate back to the file as seen by read().
+ * (This is a bug on some variants of i386 svr4.0.)
+ */
+ for (i = 0; i < pagesize; ++i)
+ *(data2 + i) = *(data2 + i) + 1;
+ data3 = malloc(pagesize);
+ if (!data3)
+ exit(1);
+ if (read(fd, data3, pagesize) != pagesize)
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data3 + i))
+ exit(1);
+ close(fd);
+ unlink("conftestmmap");
+ exit(0);
+}
+
+EOF
+if { (eval echo configure:2574: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_func_mmap_fixed_mapped=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_MMAP 1
+EOF
+
+fi
+
+
+ for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h string.h \
+unistd.h sys/param.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2602: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2607 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2612: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+ for ac_func in getcwd munmap putenv setenv setlocale strchr strcasecmp \
+strdup __argz_count __argz_stringify __argz_next
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2642: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2647 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2670: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+ if test "${ac_cv_func_stpcpy+set}" != "set"; then
+ for ac_func in stpcpy
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2699: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2704 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+ fi
+ if test "${ac_cv_func_stpcpy}" = "yes"; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_STPCPY 1
+EOF
+
+ fi
+
+ if test $ac_cv_header_locale_h = yes; then
+ echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
+echo "configure:2761: checking for LC_MESSAGES" >&5
+if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2766 "configure"
+#include "confdefs.h"
+#include <locale.h>
+int main() {
+return LC_MESSAGES
+; return 0; }
+EOF
+if { (eval echo configure:2773: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ am_cv_val_LC_MESSAGES=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ am_cv_val_LC_MESSAGES=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_LC_MESSAGES 1
+EOF
+
+ fi
+ fi
+ echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
+echo "configure:2794: checking whether NLS is requested" >&5
+ # Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+ enableval="$enable_nls"
+ USE_NLS=$enableval
+else
+ USE_NLS=yes
+fi
+
+ echo "$ac_t""$USE_NLS" 1>&6
+
+
+ USE_INCLUDED_LIBINTL=no
+
+ if test "$USE_NLS" = "yes"; then
+ cat >> confdefs.h <<\EOF
+#define ENABLE_NLS 1
+EOF
+
+ echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
+echo "configure:2814: checking whether included gettext is requested" >&5
+ # Check whether --with-included-gettext or --without-included-gettext was given.
+if test "${with_included_gettext+set}" = set; then
+ withval="$with_included_gettext"
+ nls_cv_force_use_gnu_gettext=$withval
+else
+ nls_cv_force_use_gnu_gettext=no
+fi
+
+ echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+ CATOBJEXT=NONE
+
+ ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for libintl.h""... $ac_c" 1>&6
+echo "configure:2833: checking for libintl.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2838 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6
+echo "configure:2860: checking for gettext in libc" >&5
+if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2865 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+int main() {
+return (int) gettext ("")
+; return 0; }
+EOF
+if { (eval echo configure:2872: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ gt_cv_func_gettext_libc=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ gt_cv_func_gettext_libc=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6
+
+ if test "$gt_cv_func_gettext_libc" != "yes"; then
+ echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6
+echo "configure:2888: checking for bindtextdomain in -lintl" >&5
+ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lintl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2896 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char bindtextdomain();
+
+int main() {
+bindtextdomain()
+; return 0; }
+EOF
+if { (eval echo configure:2907: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6
+echo "configure:2923: checking for gettext in libintl" >&5
+if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6
+echo "configure:2928: checking for gettext in -lintl" >&5
+ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lintl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2936 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gettext();
+
+int main() {
+gettext()
+; return 0; }
+EOF
+if { (eval echo configure:2947: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ gt_cv_func_gettext_libintl=yes
+else
+ echo "$ac_t""no" 1>&6
+gt_cv_func_gettext_libintl=no
+fi
+
+fi
+
+echo "$ac_t""$gt_cv_func_gettext_libintl" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ fi
+
+ if test "$gt_cv_func_gettext_libc" = "yes" \
+ || test "$gt_cv_func_gettext_libintl" = "yes"; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_GETTEXT 1
+EOF
+
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2986: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$MSGFMT" in
+ /*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test -n "$MSGFMT"; then
+ echo "$ac_t""$MSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ if test "$MSGFMT" != "no"; then
+ for ac_func in dcgettext
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:3020: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3025 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3048: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3075: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GMSGFMT" in
+ /*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+ echo "$ac_t""$GMSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3111: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$XGETTEXT" in
+ /*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+ echo "$ac_t""$XGETTEXT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ cat > conftest.$ac_ext <<EOF
+#line 3143 "configure"
+#include "confdefs.h"
+
+int main() {
+extern int _nl_msg_cat_cntr;
+ return _nl_msg_cat_cntr
+; return 0; }
+EOF
+if { (eval echo configure:3151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ CATOBJEXT=.gmo
+ DATADIRNAME=share
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CATOBJEXT=.mo
+ DATADIRNAME=lib
+fi
+rm -f conftest*
+ INSTOBJEXT=.mo
+ fi
+ fi
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+ if test "$CATOBJEXT" = "NONE"; then
+ echo $ac_n "checking whether catgets can be used""... $ac_c" 1>&6
+echo "configure:3174: checking whether catgets can be used" >&5
+ # Check whether --with-catgets or --without-catgets was given.
+if test "${with_catgets+set}" = set; then
+ withval="$with_catgets"
+ nls_cv_use_catgets=$withval
+else
+ nls_cv_use_catgets=no
+fi
+
+ echo "$ac_t""$nls_cv_use_catgets" 1>&6
+
+ if test "$nls_cv_use_catgets" = "yes"; then
+ echo $ac_n "checking for main in -li""... $ac_c" 1>&6
+echo "configure:3187: checking for main in -li" >&5
+ac_lib_var=`echo i'_'main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-li $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3195 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:3202: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo i | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-li $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ echo $ac_n "checking for catgets""... $ac_c" 1>&6
+echo "configure:3230: checking for catgets" >&5
+if eval "test \"`echo '$''{'ac_cv_func_catgets'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3235 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char catgets(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char catgets();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_catgets) || defined (__stub___catgets)
+choke me
+#else
+catgets();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3258: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_catgets=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_catgets=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'catgets`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<\EOF
+#define HAVE_CATGETS 1
+EOF
+
+ INTLOBJS="\$(CATOBJS)"
+ # Extract the first word of "gencat", so it can be a program name with args.
+set dummy gencat; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3280: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GENCAT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GENCAT" in
+ /*)
+ ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GENCAT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GENCAT" && ac_cv_path_GENCAT="no"
+ ;;
+esac
+fi
+GENCAT="$ac_cv_path_GENCAT"
+if test -n "$GENCAT"; then
+ echo "$ac_t""$GENCAT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ if test "$GENCAT" != "no"; then
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3316: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GMSGFMT" in
+ /*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no"
+ ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+ echo "$ac_t""$GMSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test "$GMSGFMT" = "no"; then
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3353: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GMSGFMT" in
+ /*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no"
+ ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+ echo "$ac_t""$GMSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ fi
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3388: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$XGETTEXT" in
+ /*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+ echo "$ac_t""$XGETTEXT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ USE_INCLUDED_LIBINTL=yes
+ CATOBJEXT=.cat
+ INSTOBJEXT=.cat
+ DATADIRNAME=lib
+ INTLDEPS='$(top_builddir)/intl/libintl.a'
+ INTLLIBS=$INTLDEPS
+ LIBS=`echo $LIBS | sed -e 's/-lintl//'`
+ nls_cv_header_intl=intl/libintl.h
+ nls_cv_header_libgt=intl/libgettext.h
+ fi
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ fi
+ fi
+
+ if test "$CATOBJEXT" = "NONE"; then
+ nls_cv_use_gnu_gettext=yes
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ INTLOBJS="\$(GETTOBJS)"
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3446: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$MSGFMT" in
+ /*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="msgfmt"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test -n "$MSGFMT"; then
+ echo "$ac_t""$MSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3480: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GMSGFMT" in
+ /*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+ echo "$ac_t""$GMSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3516: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$XGETTEXT" in
+ /*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+ echo "$ac_t""$XGETTEXT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+ USE_INCLUDED_LIBINTL=yes
+ CATOBJEXT=.gmo
+ INSTOBJEXT=.mo
+ DATADIRNAME=share
+ INTLDEPS='$(top_builddir)/intl/libintl.a'
+ INTLLIBS=$INTLDEPS
+ LIBS=`echo $LIBS | sed -e 's/-lintl//'`
+ nls_cv_header_intl=intl/libintl.h
+ nls_cv_header_libgt=intl/libgettext.h
+ fi
+
+ if test "$XGETTEXT" != ":"; then
+ if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+ : ;
+ else
+ echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6
+ XGETTEXT=":"
+ fi
+ fi
+
+ # We need to process the po/ directory.
+ POSUB=po
+ else
+ DATADIRNAME=share
+ nls_cv_header_intl=intl/libintl.h
+ nls_cv_header_libgt=intl/libgettext.h
+ fi
+
+
+
+
+ # If this is used in GNU gettext we have to set USE_NLS to `yes'
+ # because some of the sources are only built for this goal.
+ if test "$PACKAGE" = gettext; then
+ USE_NLS=yes
+ USE_INCLUDED_LIBINTL=yes
+ fi
+
+ for lang in $ALL_LINGUAS; do
+ GMOFILES="$GMOFILES $lang.gmo"
+ POFILES="$POFILES $lang.po"
+ done
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test "x$CATOBJEXT" != "x"; then
+ if test "x$ALL_LINGUAS" = "x"; then
+ LINGUAS=
+ else
+ echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6
+echo "configure:3609: checking for catalogs to be installed" >&5
+ NEW_LINGUAS=
+ for lang in ${LINGUAS=$ALL_LINGUAS}; do
+ case "$ALL_LINGUAS" in
+ *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
+ esac
+ done
+ LINGUAS=$NEW_LINGUAS
+ echo "$ac_t""$LINGUAS" 1>&6
+ fi
+
+ if test -n "$LINGUAS"; then
+ for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+ fi
+ fi
+
+ if test $ac_cv_header_locale_h = yes; then
+ INCLUDE_LOCALE_H="#include <locale.h>"
+ else
+ INCLUDE_LOCALE_H="\
+/* The system does not provide the header <locale.h>. Take care yourself. */"
+ fi
+
+
+ test -d intl || mkdir intl
+ if test "$CATOBJEXT" = ".cat"; then
+ ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6
+echo "configure:3637: checking for linux/version.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3642 "configure"
+#include "confdefs.h"
+#include <linux/version.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:3647: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ msgformat=linux
+else
+ echo "$ac_t""no" 1>&6
+msgformat=xopen
+fi
+
+
+ sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed
+ fi
+ sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \
+ $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed
+
+ if test "$PACKAGE" = "gettext"; then
+ GT_NO="#NO#"
+ GT_YES=
+ else
+ GT_NO=
+ GT_YES="#YES#"
+ fi
+
+
+
+ MKINSTALLDIRS=
+ if test -n "$ac_aux_dir"; then
+ MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+ fi
+ if test -z "$MKINSTALLDIRS"; then
+ MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+ fi
+
+
+ l=
+
+
+ test -d po || mkdir po
+ if test "x$srcdir" != "x."; then
+ if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
+ posrcprefix="$srcdir/"
+ else
+ posrcprefix="../$srcdir/"
+ fi
+ else
+ posrcprefix="../"
+ fi
+ rm -f po/POTFILES
+ sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
+ < $srcdir/po/POTFILES.in > po/POTFILES
+
+
+if test "x${prefix}" = "xNONE"; then
+ cat >> confdefs.h <<EOF
+#define PACKAGE_LOCALE_DIR "${ac_default_prefix}/${DATADIRNAME}/locale"
+EOF
+
+else
+ cat >> confdefs.h <<EOF
+#define PACKAGE_LOCALE_DIR "${prefix}/${DATADIRNAME}/locale"
+EOF
+
+fi
+
+if test "x${datadir}" = 'x${prefix}/share'; then
+ if test "x${prefix}" = "xNONE"; then
+ cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${ac_default_prefix}/share/${PACKAGE}"
+EOF
+
+ else
+ cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${prefix}/share/${PACKAGE}"
+EOF
+
+ fi
+else
+ cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${datadir}/${PACKAGE}"
+EOF
+
+fi
+
+packagesrcdir=`cd $srcdir && pwd`
+cat >> confdefs.h <<EOF
+#define PACKAGE_SOURCE_DIR "${packagesrcdir}"
+EOF
+
+
+if test "x$GCC" = "xyes"; then
+ case " $CFLAGS " in
+ *[\ \ ]-Wall[\ \ ]*) ;;
+ *) CFLAGS="$CFLAGS -Wall" ;;
+ esac
+fi
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "
+Makefile
+gtk-gui/Makefile
+intl/Makefile
+po/Makefile.in
+ config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@ACLOCAL@%$ACLOCAL%g
+s%@AUTOCONF@%$AUTOCONF%g
+s%@AUTOMAKE@%$AUTOMAKE%g
+s%@AUTOHEADER@%$AUTOHEADER%g
+s%@MAKEINFO@%$MAKEINFO%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@GTK_CONFIG@%$GTK_CONFIG%g
+s%@GTK_CFLAGS@%$GTK_CFLAGS%g
+s%@GTK_LIBS@%$GTK_LIBS%g
+s%@RANLIB@%$RANLIB%g
+s%@ALLOCA@%$ALLOCA%g
+s%@USE_NLS@%$USE_NLS%g
+s%@MSGFMT@%$MSGFMT%g
+s%@GMSGFMT@%$GMSGFMT%g
+s%@XGETTEXT@%$XGETTEXT%g
+s%@GENCAT@%$GENCAT%g
+s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g
+s%@CATALOGS@%$CATALOGS%g
+s%@CATOBJEXT@%$CATOBJEXT%g
+s%@DATADIRNAME@%$DATADIRNAME%g
+s%@GMOFILES@%$GMOFILES%g
+s%@INSTOBJEXT@%$INSTOBJEXT%g
+s%@INTLDEPS@%$INTLDEPS%g
+s%@INTLLIBS@%$INTLLIBS%g
+s%@INTLOBJS@%$INTLOBJS%g
+s%@POFILES@%$POFILES%g
+s%@POSUB@%$POSUB%g
+s%@INCLUDE_LOCALE_H@%$INCLUDE_LOCALE_H%g
+s%@GT_NO@%$GT_NO%g
+s%@GT_YES@%$GT_YES%g
+s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g
+s%@l@%$l%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile
+gtk-gui/Makefile
+intl/Makefile
+po/Makefile.in
+"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+ac_sources="$nls_cv_header_libgt"
+ac_dests="$nls_cv_header_intl"
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+srcdir=$ac_given_srcdir
+while test -n "$ac_sources"; do
+ set $ac_dests; ac_dest=$1; shift; ac_dests=$*
+ set $ac_sources; ac_source=$1; shift; ac_sources=$*
+
+ echo "linking $srcdir/$ac_source to $ac_dest"
+
+ if test ! -r $srcdir/$ac_source; then
+ { echo "configure: error: $srcdir/$ac_source: File not found" 1>&2; exit 1; }
+ fi
+ rm -f $ac_dest
+
+ # Make relative symlinks.
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dest_dir=`echo $ac_dest|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dest_dir" != "$ac_dest" && test "$ac_dest_dir" != .; then
+ # The dest file is in a subdirectory.
+ test ! -d "$ac_dest_dir" && mkdir "$ac_dest_dir"
+ ac_dest_dir_suffix="/`echo $ac_dest_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dest_dir_suffix.
+ ac_dots=`echo $ac_dest_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dest_dir_suffix= ac_dots=
+ fi
+
+ case "$srcdir" in
+ [/$]*) ac_rel_source="$srcdir/$ac_source" ;;
+ *) ac_rel_source="$ac_dots$srcdir/$ac_source" ;;
+ esac
+
+ # Make a symlink if possible; otherwise try a hard link.
+ if ln -s $ac_rel_source $ac_dest 2>/dev/null ||
+ ln $srcdir/$ac_source $ac_dest; then :
+ else
+ { echo "configure: error: can not link $ac_dest to $srcdir/$ac_source" 1>&2; exit 1; }
+ fi
+done
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
+case "$CONFIG_FILES" in *po/Makefile.in*)
+ sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
+ esac
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure.in b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure.in
new file mode 100644
index 0000000000..cc0646f630
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure.in
@@ -0,0 +1,58 @@
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(configure.in)
+AM_INIT_AUTOMAKE(goom2, 0.1)
+AC_CONFIG_HEADERS(config.h)
+
+AC_ISC_POSIX
+AC_PROG_CC
+AC_HEADER_STDC
+AC_C_BIGENDIAN
+
+
+AM_PATH_GTK(1.2.0, ,
+ AC_MSG_ERROR(Cannot find GTK: Is gtk-config in path?))
+
+dnl Add the languages which your application supports here.
+ALL_LINGUAS=""
+AM_GNU_GETTEXT
+
+dnl Set PACKAGE_LOCALE_DIR in config.h.
+if test "x${prefix}" = "xNONE"; then
+ AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale")
+else
+ AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale")
+fi
+
+dnl Set PACKAGE_DATA_DIR in config.h.
+if test "x${datadir}" = 'x${prefix}/share'; then
+ if test "x${prefix}" = "xNONE"; then
+ AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${ac_default_prefix}/share/${PACKAGE}")
+ else
+ AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${prefix}/share/${PACKAGE}")
+ fi
+else
+ AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${datadir}/${PACKAGE}")
+fi
+
+dnl Set PACKAGE_SOURCE_DIR in config.h.
+packagesrcdir=`cd $srcdir && pwd`
+AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}")
+
+dnl Use -Wall if we have gcc.
+changequote(,)dnl
+if test "x$GCC" = "xyes"; then
+ case " $CFLAGS " in
+ *[\ \ ]-Wall[\ \ ]*) ;;
+ *) CFLAGS="$CFLAGS -Wall" ;;
+ esac
+fi
+changequote([,])dnl
+
+AC_OUTPUT([
+Makefile
+gtk-gui/Makefile
+intl/Makefile
+po/Makefile.in
+])
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/goom2.glade b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/goom2.glade
new file mode 100644
index 0000000000..d06490d65d
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/goom2.glade
@@ -0,0 +1,158 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+ <name>Goom2</name>
+ <program_name>goom2</program_name>
+ <directory></directory>
+ <source_directory>gtk-gui</source_directory>
+ <pixmaps_directory>pixmaps</pixmaps_directory>
+ <language>C</language>
+ <gnome_support>False</gnome_support>
+ <gettext_support>True</gettext_support>
+ <use_widget_names>True</use_widget_names>
+ <output_main_file>False</output_main_file>
+ <main_source_file>gtk-interface.c</main_source_file>
+ <main_header_file>gtk-interface.h</main_header_file>
+ <handler_source_file>gtk-callbacks.c</handler_source_file>
+ <handler_header_file>gtk-callbacks.h</handler_header_file>
+ <support_source_file>gtk-support.c</support_source_file>
+ <support_header_file>gtk-support.h</support_header_file>
+</project>
+
+<widget>
+ <class>GtkWindow</class>
+ <name>config_window</name>
+ <signal>
+ <name>destroy_event</name>
+ <handler>on_config_window_destroy_event</handler>
+ <last_modification_time>Fri, 23 May 2003 09:08:30 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>delete_event</name>
+ <handler>on_config_window_delete_event</handler>
+ <last_modification_time>Fri, 23 May 2003 09:09:21 GMT</last_modification_time>
+ </signal>
+ <title>Goom Control Center</title>
+ <type>GTK_WINDOW_TOPLEVEL</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <modal>False</modal>
+ <allow_shrink>False</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+
+ <widget>
+ <class>GtkVBox</class>
+ <name>vbox1</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkToolbar</class>
+ <name>toolbar1</name>
+ <border_width>3</border_width>
+ <orientation>GTK_ORIENTATION_HORIZONTAL</orientation>
+ <type>GTK_TOOLBAR_TEXT</type>
+ <space_size>8</space_size>
+ <space_style>GTK_TOOLBAR_SPACE_LINE</space_style>
+ <relief>GTK_RELIEF_NORMAL</relief>
+ <tooltips>True</tooltips>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+
+ <widget>
+ <class>GtkButton</class>
+ <child_name>Toolbar:button</child_name>
+ <name>b_open_config</name>
+ <label>Open...</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <child_name>Toolbar:button</child_name>
+ <name>b_save_config</name>
+ <label>Save...</label>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkNotebook</class>
+ <name>notebook1</name>
+ <can_focus>True</can_focus>
+ <show_tabs>True</show_tabs>
+ <show_border>True</show_border>
+ <tab_pos>GTK_POS_LEFT</tab_pos>
+ <scrollable>False</scrollable>
+ <tab_hborder>2</tab_hborder>
+ <tab_vborder>2</tab_vborder>
+ <popup_enable>False</popup_enable>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>GtkScrolledWindow</class>
+ <name>scrolledwindow1</name>
+ <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
+ <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
+ <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+ <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+
+ <widget>
+ <class>GtkText</class>
+ <name>text1</name>
+ <width>400</width>
+ <height>300</height>
+ <can_focus>True</can_focus>
+ <editable>False</editable>
+ <text>What a GOOM!! v2
+
+copyright 2000-2003, by J.C. Hoelt &lt;jeko@free.fr&gt;
+
+This is my first visual plugins for XMMS, and I
+think that it's the best I have ever done !
+
+---
+
+This dialog will help you to configure goom.
+Many options here will seem strange to you,
+anyway, just try things and look what happen !
+
+Enjoy,
+
+ Jeko</text>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <child_name>Notebook:tab</child_name>
+ <name>goom_control</name>
+ <label>About goom...</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkStatusbar</class>
+ <name>statusbar1</name>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+ </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am
new file mode 100644
index 0000000000..ff6e08d409
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am
@@ -0,0 +1,16 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = \
+ -I$(top_srcdir)/intl \
+ @GTK_CFLAGS@
+
+bin_PROGRAMS = goom2
+
+goom2_SOURCES = \
+ main.c \
+ support.c support.h \
+ interface.c interface.h \
+ callbacks.c callbacks.h
+
+goom2_LDADD = @GTK_LIBS@ $(INTLLIBS)
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c
new file mode 100644
index 0000000000..3cb208ecf3
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c
@@ -0,0 +1,267 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+#include "gtk-callbacks.h"
+#include "gtk-interface.h"
+#include "gtk-support.h"
+
+#define WINSIZE_COMBO "combo_winsize"
+
+#include "sdl_goom.h"
+#include "config_param.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+static SdlGoom *sdlGoom;
+static GtkObject *owin;
+
+void
+on_spinbutton_int_changed (GtkEditable *editable,
+ gpointer user_data)
+{
+ PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param");
+ IVAL(*param) = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(editable));
+ param->changed(param);
+}
+
+void
+on_list_changed (GtkEditable *editable,
+ gpointer user_data)
+{
+ PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param");
+ LVAL(*param) = gtk_editable_get_chars (editable,0,-1);
+ param->changed(param);
+}
+
+void
+on_bool_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(togglebutton),"param");
+ BVAL(*param) = gtk_toggle_button_get_active(togglebutton);
+ param->changed(param);
+}
+
+void my_int_listener (PluginParam *param) {
+ GtkEditable *editable;
+
+ if (sdlGoom->config_win == 0) return;
+ editable = GTK_EDITABLE(param->user_data);
+
+ if (editable) {
+ int pos = 0;
+ char str[256];
+ sprintf (str, "%d", IVAL(*param));
+ if (strcmp(str,gtk_editable_get_chars(editable,0,-1))) {
+ gtk_editable_delete_text (editable,0,-1);
+ gtk_editable_insert_text (editable,str,strlen(str),&pos);
+ }
+ }
+}
+
+void my_list_listener (PluginParam *param) {
+ GtkEntry *editable;
+
+ if (sdlGoom->config_win == 0) return;
+ editable = GTK_ENTRY(param->user_data);
+
+ if (editable) {
+ if (strcmp(gtk_entry_get_text(editable),LVAL(*param))) {
+ gtk_entry_set_text (editable, LVAL(*param));
+ }
+ }
+}
+
+void my_bool_listener (PluginParam *param) {
+ GtkCheckButton *editable;
+
+ if (sdlGoom->config_win == 0) return;
+ editable = GTK_CHECK_BUTTON(param->user_data);
+
+ if (editable) {
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(editable)) != BVAL(*param))
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(editable),BVAL(*param));
+ }
+}
+
+void my_float_listener (PluginParam *param) {
+ GtkProgressBar *progress;
+
+ if (sdlGoom->config_win == 0) return;
+ progress = GTK_PROGRESS_BAR(param->user_data);
+
+ if (progress) {
+ if (FVAL(*param)<FMIN(*param))
+ FVAL(*param) = FMIN(*param);
+ if (FVAL(*param)>FMAX(*param))
+ FVAL(*param) = FMAX(*param);
+ gtk_progress_bar_update (progress, FVAL(*param));
+ }
+}
+
+void addParams (GtkNotebook *notebook, PluginParameters *params) {
+ int n;
+ GtkWidget *table = gtk_table_new (params->nbParams, 2, FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER (table), 11);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+
+ for (n=0;n<params->nbParams;++n) {
+ if (params->params[n] == 0) {
+ GtkWidget *hseparator = gtk_hseparator_new ();
+ gtk_widget_show (hseparator);
+ gtk_table_attach (GTK_TABLE (table), hseparator, 0, 2, n, n+1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 5);
+ } else {
+ PluginParam *p = params->params[n];
+
+ if (p->type != PARAM_BOOLVAL) {
+ GtkWidget *label4 = gtk_label_new (p->name);
+ gtk_widget_show (label4);
+ gtk_table_attach (GTK_TABLE (table), label4, 0, 1, n, n+1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_RIGHT);
+ gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5);
+ }
+
+ switch (p->type) {
+ case PARAM_INTVAL: {
+ GtkWidget *spinbutton_adj,*spinbutton;
+
+ spinbutton_adj = (GtkWidget*)gtk_adjustment_new (
+ p->param.ival.value,
+ p->param.ival.min, p->param.ival.max,
+ p->param.ival.step, p->param.ival.step*10,
+ p->param.ival.step*10);
+ spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0);
+ gtk_widget_show (spinbutton);
+ gtk_table_attach (GTK_TABLE (table), spinbutton, 1, 2, n, n+1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 1);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
+ gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinbutton),
+ GTK_UPDATE_IF_VALID);
+ p->user_data = spinbutton;
+ gtk_object_set_data (GTK_OBJECT(spinbutton),"param",(void*)p);
+ p->change_listener = my_int_listener;
+ gtk_signal_connect (GTK_OBJECT (spinbutton), "changed",
+ GTK_SIGNAL_FUNC (on_spinbutton_int_changed),
+ NULL);
+ break;
+ }
+
+ case PARAM_FLOATVAL: {
+ GtkWidget *progress,*prog_adj;
+
+ prog_adj = (GtkWidget*)gtk_adjustment_new (
+ p->param.fval.value,
+ p->param.fval.min, p->param.fval.max,
+ p->param.fval.step, p->param.fval.step*10,
+ p->param.fval.step*10);
+
+ progress = gtk_progress_bar_new_with_adjustment(GTK_ADJUSTMENT(prog_adj));
+ gtk_widget_show(progress);
+ gtk_table_attach (GTK_TABLE (table), progress, 1, 2, n, n+1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 1);
+
+ p->user_data = progress;
+ p->change_listener = my_float_listener;
+ break;
+ }
+
+ case PARAM_LISTVAL: {
+ int i;
+ GList *combo_winsize_items = NULL;
+ GtkWidget *combo_entry_winsize = NULL;
+ GtkWidget *combo_winsize = gtk_combo_new ();
+ gtk_widget_show (combo_winsize);
+ gtk_table_attach (GTK_TABLE (table), combo_winsize, 1, 2, n, n+1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_combo_set_value_in_list (GTK_COMBO (combo_winsize), TRUE, TRUE);
+ for (i=0;i<p->param.slist.nbChoices;++i)
+ combo_winsize_items = g_list_append (combo_winsize_items,
+ p->param.slist.choices[i]);
+ gtk_combo_set_popdown_strings (GTK_COMBO (combo_winsize), combo_winsize_items);
+ g_list_free (combo_winsize_items);
+
+ combo_entry_winsize = GTK_COMBO (combo_winsize)->entry;
+ gtk_widget_show (combo_entry_winsize);
+ gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE);
+ gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p));
+ p->change_listener = my_list_listener;
+ p->user_data = combo_entry_winsize;
+ gtk_object_set_data (GTK_OBJECT(combo_entry_winsize),"param",(void*)p);
+ gtk_signal_connect (GTK_OBJECT (combo_entry_winsize), "changed",
+ GTK_SIGNAL_FUNC (on_list_changed),
+ NULL);
+ break;
+ }
+
+ case PARAM_BOOLVAL: {
+ GtkWidget *checkbutton_double =
+ gtk_check_button_new_with_label (p->name);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_double),BVAL(*p));
+ gtk_widget_show (checkbutton_double);
+ gtk_table_attach (GTK_TABLE (table), checkbutton_double, 1, 2, n, n+1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_signal_connect (GTK_OBJECT (checkbutton_double), "toggled",
+ GTK_SIGNAL_FUNC (on_bool_toggled),
+ NULL);
+ gtk_object_set_data (GTK_OBJECT(checkbutton_double),"param",(void*)p);
+ p->user_data = checkbutton_double;
+ p->change_listener = my_bool_listener;
+ break;
+ }
+ }
+ }
+ }
+
+ gtk_widget_show_all(GTK_WIDGET(table));
+ gtk_container_add(GTK_CONTAINER(notebook),table);
+ gtk_notebook_set_tab_label_text(notebook,GTK_WIDGET(table),params->name);
+}
+
+void gtk_data_init(SdlGoom *sg) {
+ sdlGoom = sg;
+ if (sdlGoom->config_win) {
+ int i;
+ GtkNotebook *notebook;
+ owin = GTK_OBJECT(sdlGoom->config_win);
+ notebook = GTK_NOTEBOOK(gtk_object_get_data (owin, "notebook1"));
+ addParams (notebook, &sdlGoom->screen);
+ for (i = 0; i < sdlGoom->plugin->nbParams; ++i) {
+ addParams (notebook, &sdlGoom->plugin->params[i]);
+ }
+ }
+}
+
+gboolean
+on_config_window_destroy_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ sdlGoom->config_win = 0;
+ owin = 0;
+ return FALSE;
+}
+
+
+gboolean
+on_config_window_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ sdlGoom->config_win = 0;
+ owin = 0;
+ return FALSE;
+}
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h
new file mode 100644
index 0000000000..15749d22db
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h
@@ -0,0 +1,24 @@
+#include <gtk/gtk.h>
+
+
+void
+on_checkbutton_double_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_spinbutton_fps_changed (GtkEditable *editable,
+ gpointer user_data);
+
+void
+on_combo_entry_winsize_changed (GtkEditable *editable,
+ gpointer user_data);
+
+gboolean
+on_config_window_destroy_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+gboolean
+on_config_window_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c
new file mode 100644
index 0000000000..9d21ba0cdd
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c
@@ -0,0 +1,137 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include "gtk-callbacks.h"
+#include "gtk-interface.h"
+#include "gtk-support.h"
+
+GtkWidget*
+create_config_window (void)
+{
+ GtkWidget *config_window;
+ GtkWidget *vbox1;
+ GtkWidget *toolbar1;
+ GtkWidget *b_open_config;
+ GtkWidget *b_save_config;
+ GtkWidget *notebook1;
+ GtkWidget *scrolledwindow1;
+ GtkWidget *text1;
+ GtkWidget *goom_control;
+ GtkWidget *statusbar1;
+
+ config_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_widget_set_name (config_window, "config_window");
+ gtk_object_set_data (GTK_OBJECT (config_window), "config_window", config_window);
+ gtk_window_set_title (GTK_WINDOW (config_window), _("Goom Control Center"));
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_set_name (vbox1, "vbox1");
+ gtk_widget_ref (vbox1);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "vbox1", vbox1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (config_window), vbox1);
+
+ toolbar1 = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT);
+ gtk_widget_set_name (toolbar1, "toolbar1");
+ gtk_widget_ref (toolbar1);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "toolbar1", toolbar1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (toolbar1);
+ gtk_box_pack_start (GTK_BOX (vbox1), toolbar1, FALSE, FALSE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (toolbar1), 3);
+ gtk_toolbar_set_space_size (GTK_TOOLBAR (toolbar1), 8);
+ gtk_toolbar_set_space_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_SPACE_LINE);
+
+ b_open_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1),
+ GTK_TOOLBAR_CHILD_BUTTON,
+ NULL,
+ _("Open..."),
+ NULL, NULL,
+ NULL, NULL, NULL);
+ gtk_widget_set_name (b_open_config, "b_open_config");
+ gtk_widget_ref (b_open_config);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "b_open_config", b_open_config,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (b_open_config);
+
+ b_save_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1),
+ GTK_TOOLBAR_CHILD_BUTTON,
+ NULL,
+ _("Save..."),
+ NULL, NULL,
+ NULL, NULL, NULL);
+ gtk_widget_set_name (b_save_config, "b_save_config");
+ gtk_widget_ref (b_save_config);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "b_save_config", b_save_config,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (b_save_config);
+
+ notebook1 = gtk_notebook_new ();
+ gtk_widget_set_name (notebook1, "notebook1");
+ gtk_widget_ref (notebook1);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "notebook1", notebook1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (notebook1);
+ gtk_box_pack_start (GTK_BOX (vbox1), notebook1, TRUE, TRUE, 0);
+ gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook1), GTK_POS_LEFT);
+
+ scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_set_name (scrolledwindow1, "scrolledwindow1");
+ gtk_widget_ref (scrolledwindow1);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "scrolledwindow1", scrolledwindow1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (scrolledwindow1);
+ gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow1);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+
+ text1 = gtk_text_new (NULL, NULL);
+ gtk_widget_set_name (text1, "text1");
+ gtk_widget_ref (text1);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "text1", text1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (text1);
+ gtk_container_add (GTK_CONTAINER (scrolledwindow1), text1);
+ gtk_widget_set_usize (text1, 400, 300);
+ gtk_text_insert (GTK_TEXT (text1), NULL, NULL, NULL,
+ _("What a GOOM!! v2\n\ncopyright 2000-2003, by J.C. Hoelt <jeko@free.fr>\n\nThis is my first visual plugins for XMMS, and I\nthink that it's the best I have ever done !\n\n---\n\nThis dialog will help you to configure goom.\nMany options here will seem strange to you,\nanyway, just try things and look what happen !\n\nEnjoy,\n\n\tJeko"), 317);
+
+ goom_control = gtk_label_new (_("About goom..."));
+ gtk_widget_set_name (goom_control, "goom_control");
+ gtk_widget_ref (goom_control);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "goom_control", goom_control,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (goom_control);
+ gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), goom_control);
+
+ statusbar1 = gtk_statusbar_new ();
+ gtk_widget_set_name (statusbar1, "statusbar1");
+ gtk_widget_ref (statusbar1);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "statusbar1", statusbar1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (statusbar1);
+ gtk_box_pack_start (GTK_BOX (vbox1), statusbar1, FALSE, FALSE, 0);
+
+ gtk_signal_connect (GTK_OBJECT (config_window), "destroy_event",
+ GTK_SIGNAL_FUNC (on_config_window_destroy_event),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (config_window), "delete_event",
+ GTK_SIGNAL_FUNC (on_config_window_delete_event),
+ NULL);
+
+ return config_window;
+}
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h
new file mode 100644
index 0000000000..95b003d030
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h
@@ -0,0 +1,5 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+GtkWidget* create_config_window (void);
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c
new file mode 100644
index 0000000000..732554c1cb
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c
@@ -0,0 +1,162 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include "gtk-support.h"
+
+/* This is an internally used function to check if a pixmap file exists. */
+static gchar* check_file_exists (const gchar *directory,
+ const gchar *filename);
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget* create_dummy_pixmap (GtkWidget *widget);
+
+GtkWidget*
+lookup_widget (GtkWidget *widget,
+ const gchar *widget_name)
+{
+ GtkWidget *parent, *found_widget;
+
+ for (;;)
+ {
+ if (GTK_IS_MENU (widget))
+ parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+ else
+ parent = widget->parent;
+ if (parent == NULL)
+ break;
+ widget = parent;
+ }
+
+ found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget),
+ widget_name);
+ if (!found_widget)
+ g_warning ("Widget not found: %s", widget_name);
+ return found_widget;
+}
+
+/* This is a dummy pixmap we use when a pixmap can't be found. */
+static char *dummy_pixmap_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"1 1 1 1",
+" c None",
+/* pixels */
+" "
+};
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget*
+create_dummy_pixmap (GtkWidget *widget)
+{
+ GdkColormap *colormap;
+ GdkPixmap *gdkpixmap;
+ GdkBitmap *mask;
+ GtkWidget *pixmap;
+
+ colormap = gtk_widget_get_colormap (widget);
+ gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask,
+ NULL, dummy_pixmap_xpm);
+ if (gdkpixmap == NULL)
+ g_error ("Couldn't create replacement pixmap.");
+ pixmap = gtk_pixmap_new (gdkpixmap, mask);
+ gdk_pixmap_unref (gdkpixmap);
+ gdk_bitmap_unref (mask);
+ return pixmap;
+}
+
+static GList *pixmaps_directories = NULL;
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory (const gchar *directory)
+{
+ pixmaps_directories = g_list_prepend (pixmaps_directories,
+ g_strdup (directory));
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap (GtkWidget *widget,
+ const gchar *filename)
+{
+ gchar *found_filename = NULL;
+ GdkColormap *colormap;
+ GdkPixmap *gdkpixmap;
+ GdkBitmap *mask;
+ GtkWidget *pixmap;
+ GList *elem;
+
+ if (!filename || !filename[0])
+ return create_dummy_pixmap (widget);
+
+ /* We first try any pixmaps directories set by the application. */
+ elem = pixmaps_directories;
+ while (elem)
+ {
+ found_filename = check_file_exists ((gchar*)elem->data, filename);
+ if (found_filename)
+ break;
+ elem = elem->next;
+ }
+
+ /* If we haven't found the pixmap, try the source directory. */
+ if (!found_filename)
+ {
+ found_filename = check_file_exists ("../pixmaps", filename);
+ }
+
+ if (!found_filename)
+ {
+ g_warning (_("Couldn't find pixmap file: %s"), filename);
+ return create_dummy_pixmap (widget);
+ }
+
+ colormap = gtk_widget_get_colormap (widget);
+ gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask,
+ NULL, found_filename);
+ if (gdkpixmap == NULL)
+ {
+ g_warning (_("Error loading pixmap file: %s"), found_filename);
+ g_free (found_filename);
+ return create_dummy_pixmap (widget);
+ }
+ g_free (found_filename);
+ pixmap = gtk_pixmap_new (gdkpixmap, mask);
+ gdk_pixmap_unref (gdkpixmap);
+ gdk_bitmap_unref (mask);
+ return pixmap;
+}
+
+/* This is an internally used function to check if a pixmap file exists. */
+gchar*
+check_file_exists (const gchar *directory,
+ const gchar *filename)
+{
+ gchar *full_filename;
+ struct stat s;
+ gint status;
+
+ full_filename = (gchar*) g_malloc (strlen (directory) + 1
+ + strlen (filename) + 1);
+ strcpy (full_filename, directory);
+ strcat (full_filename, G_DIR_SEPARATOR_S);
+ strcat (full_filename, filename);
+
+ status = stat (full_filename, &s);
+ if (status == 0 && S_ISREG (s.st_mode))
+ return full_filename;
+ g_free (full_filename);
+ return NULL;
+}
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h
new file mode 100644
index 0000000000..931bc5ad04
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h
@@ -0,0 +1,61 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+/*
+ * Standard gettext macros.
+ */
+#ifdef ENABLE_NLS
+# include <libintl.h>
+# undef _
+# define _(String) dgettext (PACKAGE, String)
+# ifdef gettext_noop
+# define N_(String) gettext_noop (String)
+# else
+# define N_(String) (String)
+# endif
+#else
+# define textdomain(String) (String)
+# define gettext(String) (String)
+# define dgettext(Domain,Message) (Message)
+# define dcgettext(Domain,Message,Type) (Message)
+# define bindtextdomain(Domain,Directory) (Domain)
+# define _(String) (String)
+# define N_(String) (String)
+#endif
+
+
+/*
+ * Public Functions.
+ */
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget* lookup_widget (GtkWidget *widget,
+ const gchar *widget_name);
+
+/* get_widget() is deprecated. Use lookup_widget instead. */
+#define get_widget lookup_widget
+
+/* Use this function to set the directory containing installed pixmaps. */
+void add_pixmap_directory (const gchar *directory);
+
+
+/*
+ * Private Functions.
+ */
+
+/* This is used to create the pixmaps in the interface. */
+GtkWidget* create_pixmap (GtkWidget *widget,
+ const gchar *filename);
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/main.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/main.c
new file mode 100644
index 0000000000..40393e5b66
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/main.c
@@ -0,0 +1,42 @@
+/*
+ * Initial main.c file generated by Glade. Edit as required.
+ * Glade will not overwrite this file.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+#include "interface.h"
+#include "support.h"
+
+int
+main (int argc, char *argv[])
+{
+ GtkWidget *config_window;
+
+#ifdef ENABLE_NLS
+ bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR);
+ textdomain (PACKAGE);
+#endif
+
+ gtk_set_locale ();
+ gtk_init (&argc, &argv);
+
+ add_pixmap_directory (PACKAGE_DATA_DIR "/pixmaps");
+ add_pixmap_directory (PACKAGE_SOURCE_DIR "/pixmaps");
+
+ /*
+ * The following code was added by Glade to create one of each component
+ * (except popup menus), just so that you see something after building
+ * the project. Delete any components that you don't want shown initially.
+ */
+ config_window = create_config_window ();
+ gtk_widget_show (config_window);
+
+ gtk_main ();
+ return 0;
+}
+
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/install-sh b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/install-sh
new file mode 100755
index 0000000000..398a88e142
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/install-sh
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ :
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ chmodcmd=""
+ else
+ instcmd=$mkdirprog
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ :
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ :
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ :
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+ '
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ :
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ :
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/ChangeLog b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/ChangeLog
new file mode 100644
index 0000000000..198950159d
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/ChangeLog
@@ -0,0 +1,1086 @@
+1998-04-29 Ulrich Drepper <drepper@cygnus.com>
+
+ * intl/localealias.c (read_alias_file): Use unsigned char for
+ local variables. Remove unused variable tp.
+ * intl/l10nflist.c (_nl_normalize_codeset): Use unsigned char *
+ for type of codeset. For loosing Solaris systems.
+ * intl/loadinfo.h: Adapt prototype of _nl_normalize_codeset.
+ * intl/bindtextdom.c (BINDTEXTDOMAIN): Don't define local variable
+ len if not needed.
+ Patches by Jim Meyering.
+
+1998-04-28 Ulrich Drepper <drepper@cygnus.com>
+
+ * loadmsgcat.c (_nl_load_domain): Don't assign the element use_mmap if
+ mmap is not supported.
+
+ * hash-string.h: Don't include <values.h>.
+
+1998-04-27 Ulrich Drepper <drepper@cygnus.com>
+
+ * textdomain.c: Use strdup is available.
+
+ * localealias.c: Define HAVE_MEMPCPY so that we can use this
+ function. Define and use semapahores to protect modfication of
+ global objects when compiling for glibc. Add code to allow
+ freeing alias table.
+
+ * l10nflist.c: Don't assume stpcpy not being a macro.
+
+ * gettextP.h: Define internal_function macri if not already done.
+ Use glibc byte-swap macros instead of defining SWAP when compiled
+ for glibc.
+ (struct loaded_domain): Add elements to allow unloading.
+
+ * Makefile.in (distclean): Don't remove libintl.h here.
+
+ * bindtextdomain.c: Carry over changes from glibc. Use strdup if
+ available.
+
+ * dcgettext.c: Don't assume stpcpy not being a macro. Mark internal
+ functions. Add memory freeing code for glibc.
+
+ * dgettext.c: Update copyright.
+
+ * explodename.c: Include stdlib.h and string.h only if they exist.
+ Use strings.h eventually.
+
+ * finddomain.c: Mark internal functions. Use strdup if available.
+ Add memory freeing code for glibc.
+
+1997-10-10 20:00 Ulrich Drepper <drepper@cygnus.com>
+
+ * libgettext.h: Fix dummy textdomain and bindtextdomain macros.
+ They should return reasonable values.
+ Reported by Tom Tromey <tromey@cygnus.com>.
+
+1997-09-16 03:33 Ulrich Drepper <drepper@cygnus.com>
+
+ * libgettext.h: Define PARAMS also to `args' if __cplusplus is defined.
+ * intlh.inst.in: Likewise.
+ Reported by Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>.
+
+ * libintl.glibc: Update from current glibc version.
+
+1997-09-06 02:10 Ulrich Drepper <drepper@cygnus.com>
+
+ * intlh.inst.in: Reformat copyright.
+
+1997-08-19 15:22 Ulrich Drepper <drepper@cygnus.com>
+
+ * dcgettext.c (DCGETTEXT): Remove wrong comment.
+
+1997-08-16 00:13 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (install-data): Don't change directory to install.
+
+1997-08-01 14:30 Ulrich Drepper <drepper@cygnus.com>
+
+ * cat-compat.c: Fix copyright.
+
+ * localealias.c: Don't define strchr unless !HAVE_STRCHR.
+
+ * loadmsgcat.c: Update copyright. Fix typos.
+
+ * l10nflist.c: Don't define strchr unless !HAVE_STRCHR.
+ (_nl_make_l10nflist): Handle sponsor and revision correctly.
+
+ * gettext.c: Update copyright.
+ * gettext.h: Likewise.
+ * hash-string.h: Likewise.
+
+ * finddomain.c: Remoave dead code. Define strchr only if
+ !HAVE_STRCHR.
+
+ * explodename.c: Include <sys/types.h>.
+
+ * explodename.c: Reformat copyright text.
+ (_nl_explode_name): Fix typo.
+
+ * dcgettext.c: Define and use __set_errno.
+ (guess_category_value): Don't use setlocale if HAVE_LC_MESSAGES is
+ not defined.
+
+ * bindtextdom.c: Pretty printing.
+
+1997-05-01 02:25 Ulrich Drepper <drepper@cygnus.com>
+
+ * dcgettext.c (guess_category_value): Don't depend on
+ HAVE_LC_MESSAGES. We don't need the macro here.
+ Patch by Bruno Haible <haible@ilog.fr>.
+
+ * cat-compat.c (textdomain): DoN't refer to HAVE_SETLOCALE_NULL
+ macro. Instead use HAVE_LOCALE_NULL and define it when using
+ glibc, as in dcgettext.c.
+ Patch by Bruno Haible <haible@ilog.fr>.
+
+ * Makefile.in (CPPFLAGS): New variable. Reported by Franc,ois
+ Pinard.
+
+Mon Mar 10 06:51:17 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in: Implement handling of libtool.
+
+ * gettextP.h: Change data structures for use of generic lowlevel
+ i18n file handling.
+
+Wed Dec 4 20:21:18 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * textdomain.c: Put parentheses around arguments of memcpy macro
+ definition.
+ * localealias.c: Likewise.
+ * l10nflist.c: Likewise.
+ * finddomain.c: Likewise.
+ * bindtextdom.c: Likewise.
+ Reported by Thomas Esken.
+
+Mon Nov 25 22:57:51 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * textdomain.c: Move definition of `memcpy` macro to right
+ position.
+
+Fri Nov 22 04:01:58 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * finddomain.c [!HAVE_STRING_H && !_LIBC]: Define memcpy using
+ bcopy if not already defined. Reported by Thomas Esken.
+ * bindtextdom.c: Likewise.
+ * l10nflist.c: Likewise.
+ * localealias.c: Likewise.
+ * textdomain.c: Likewise.
+
+Tue Oct 29 11:10:27 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (libdir): Change to use exec_prefix instead of
+ prefix. Reported by Knut-HåvardAksnes <etokna@eto.ericsson.se>.
+
+Sat Aug 31 03:07:09 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * l10nflist.c (_nl_normalize_codeset): We convert to lower case,
+ so don't prepend uppercase `ISO' for only numeric arg.
+
+Fri Jul 19 00:15:46 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * l10nflist.c: Move inclusion of argz.h, ctype.h, stdlib.h after
+ definition of _GNU_SOURCE. Patch by Roland McGrath.
+
+ * Makefile.in (uninstall): Fix another bug with `for' loop and
+ empty arguments. Patch by Jim Meyering. Correct name os
+ uninstalled files: no intl- prefix anymore.
+
+ * Makefile.in (install-data): Again work around shells which
+ cannot handle mpty for list. Reported by Jim Meyering.
+
+Sat Jul 13 18:11:35 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (install): Split goal. Now depend on install-exec
+ and install-data.
+ (install-exec, install-data): New goals. Created from former
+ install goal.
+ Reported by Karl Berry.
+
+Sat Jun 22 04:58:14 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (MKINSTALLDIRS): New variable. Path to
+ mkinstalldirs script.
+ (install): use MKINSTALLDIRS variable or if the script is not present
+ try to find it in the $top_scrdir).
+
+Wed Jun 19 02:56:56 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * l10nflist.c: Linux libc *partly* includes the argz_* functions.
+ Grr. Work around by renaming the static version and use macros
+ for renaming.
+
+Tue Jun 18 20:11:17 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * l10nflist.c: Correct presence test macros of __argz_* functions.
+
+ * l10nflist.c: Include <argz.h> based on test of it instead when
+ __argz_* functions are available.
+ Reported by Andreas Schwab.
+
+Thu Jun 13 15:17:44 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * explodename.c, l10nflist.c: Define NULL for dumb systems.
+
+Tue Jun 11 17:05:13 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * intlh.inst.in, libgettext.h (dcgettext): Rename local variable
+ result to __result to prevent name clash.
+
+ * l10nflist.c, localealias.c, dcgettext.c: Define _GNU_SOURCE to
+ get prototype for stpcpy and strcasecmp.
+
+ * intlh.inst.in, libgettext.h: Move declaration of
+ `_nl_msg_cat_cntr' outside __extension__ block to prevent warning
+ from gcc's -Wnested-extern option.
+
+Fri Jun 7 01:58:00 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (install): Remove comment.
+
+Thu Jun 6 17:28:17 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (install): Work around for another Buglix stupidity.
+ Always use an `else' close for `if's. Reported by Nelson Beebe.
+
+ * Makefile.in (intlh.inst): Correct typo in phony rule.
+ Reported by Nelson Beebe.
+
+Thu Jun 6 01:49:52 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * dcgettext.c (read_alias_file): Rename variable alloca_list to
+ block_list as the macro calls assume.
+ Patch by Eric Backus.
+
+ * localealias.c [!HAVE_ALLOCA]: Define alloca as macro using
+ malloc.
+ (read_alias_file): Rename varriabe alloca_list to block_list as the
+ macro calls assume.
+ Patch by Eric Backus.
+
+ * l10nflist.c: Correct conditional for <argz.h> inclusion.
+ Reported by Roland McGrath.
+
+ * Makefile.in (all): Depend on all-@USE_INCLUDED_LIBINTL@, not
+ all-@USE_NLS@.
+
+ * Makefile.in (install): intlh.inst comes from local dir, not
+ $(srcdir).
+
+ * Makefile.in (intlh.inst): Special handling of this goal. If
+ used in gettext, this is really a rul to construct this file. If
+ used in any other package it is defined as a .PHONY rule with
+ empty body.
+
+ * finddomain.c: Extract locale file information handling into
+ l10nfile.c. Rename local stpcpy__ function to stpcpy.
+
+ * dcgettext.c (stpcpy): Add local definition.
+
+ * l10nflist.c: Solve some portability problems. Patches partly by
+ Thomas Esken. Add local definition of stpcpy.
+
+Tue Jun 4 02:47:49 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * intlh.inst.in: Don't depend including <locale.h> on
+ HAVE_LOCALE_H. Instead configure must rewrite this fiile
+ depending on the result of the configure run.
+
+ * Makefile.in (install): libintl.inst is now called intlh.inst.
+ Add rules for updating intlh.inst from intlh.inst.in.
+
+ * libintl.inst: Renamed to intlh.inst.in.
+
+ * localealias.c, dcgettext.c [__GNUC__]: Define HAVE_ALLOCA to 1
+ because gcc has __buitlin_alloca.
+ Reported by Roland McGrath.
+
+Mon Jun 3 00:32:16 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.in (installcheck): New goal to fulfill needs of
+ automake's distcheck.
+
+ * Makefile.in (install): Reorder commands so that VERSION is
+ found.
+
+ * Makefile.in (gettextsrcdir): Now use subdirectory intl/ in
+ @datadir@/gettext.
+ (COMSRCS): Add l10nfile.c.
+ (OBJECTS): Add l10nfile.o.
+ (DISTFILES): Rename to DISTFILE.normal. Remove $(DISTFILES.common).
+ (DISTFILE.gettext): Remove $(DISTFILES.common).
+ (all-gettext): Remove goal.
+ (install): If $(PACKAGE) = gettext install, otherwose do nothing. No
+ package but gettext itself should install libintl.h + headers.
+ (dist): Extend goal to work for gettext, too.
+ (dist-gettext): Remove goal.
+
+ * dcgettext.c [!HAVE_ALLOCA]: Define macro alloca by using malloc.
+
+Sun Jun 2 17:33:06 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * loadmsgcat.c (_nl_load_domain): Parameter is now comes from
+ find_l10nfile.
+
+Sat Jun 1 02:23:03 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * l10nflist.c (__argz_next): Add definition.
+
+ * dcgettext.c [!HAVE_ALLOCA]: Add code for handling missing alloca
+ code. Use new l10nfile handling.
+
+ * localealias.c [!HAVE_ALLOCA]: Add code for handling missing
+ alloca code.
+
+ * l10nflist.c: Initial revision.
+
+Tue Apr 2 18:51:18 1996 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (all-gettext): New goal. Same as all-yes.
+
+Thu Mar 28 23:01:22 1996 Karl Eichwalder <ke@ke.central.de>
+
+ * Makefile.in (gettextsrcdir): Define using @datadir@.
+
+Tue Mar 26 12:39:14 1996 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c: Include <ctype.h>. Reported by Roland McGrath.
+
+Sat Mar 23 02:00:35 1996 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (stpcpy): Rename to stpcpy__ to prevent clashing
+ with external declaration.
+
+Sat Mar 2 00:47:09 1996 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (all-no): Rename from all_no.
+
+Sat Feb 17 00:25:59 1996 Ulrich Drepper <drepper@myware>
+
+ * gettextP.h [loaded_domain]: Array `successor' must now contain up
+ to 63 elements (because of codeset name normalization).
+
+ * finddomain.c: Implement codeset name normalization.
+
+Thu Feb 15 04:39:09 1996 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (all): Define to `all-@USE_NLS@'.
+ (all-yes, all_no): New goals. `all-no' is noop, `all-yes'
+ is former all.
+
+Mon Jan 15 21:46:01 1996 Howard Gayle <howard@hal.com>
+
+ * localealias.c (alias_compare): Increment string pointers in loop
+ of strcasecmp replacement.
+
+Fri Dec 29 21:16:34 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (install-src): Who commented this goal out ? :-)
+
+Fri Dec 29 15:08:16 1995 Ulrich Drepper <drepper@myware>
+
+ * dcgettext.c (DCGETTEXT): Save `errno'. Failing system calls
+ should not effect it because a missing catalog is no error.
+ Reported by Harald K<o:>nig <koenig@tat.physik.uni-tuebingen.de>.
+
+Tue Dec 19 22:09:13 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (Makefile): Explicitly use $(SHELL) for running
+ shell scripts.
+
+Fri Dec 15 17:34:59 1995 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * Makefile.in (install-src): Only install library and header when
+ we use the own implementation. Don't do it when using the
+ system's gettext or catgets functions.
+
+ * dcgettext.c (find_msg): Must not swap domain->hash_size here.
+
+Sat Dec 9 16:24:37 1995 Ulrich Drepper <drepper@myware>
+
+ * localealias.c, libintl.inst, libgettext.h, hash-string.h,
+ gettextP.h, finddomain.c, dcgettext.c, cat-compat.c:
+ Use PARAMS instead of __P. Suggested by Roland McGrath.
+
+Tue Dec 5 11:39:14 1995 Larry Schwimmer <rosebud@cyclone.stanford.edu>
+
+ * libgettext.h: Use `#if !defined (_LIBINTL_H)' instead of `#if
+ !_LIBINTL_H' because Solaris defines _LIBINTL_H as empty.
+
+Mon Dec 4 15:42:07 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (install-src):
+ Install libintl.inst instead of libintl.h.install.
+
+Sat Dec 2 22:51:38 1995 Marcus Daniels <marcus@sysc.pdx.edu>
+
+ * cat-compat.c (textdomain):
+ Reverse order in which files are tried you load. First
+ try local file, when this failed absolute path.
+
+Wed Nov 29 02:03:53 1995 Nelson H. F. Beebe <beebe@math.utah.edu>
+
+ * cat-compat.c (bindtextdomain): Add missing { }.
+
+Sun Nov 26 18:21:41 1995 Ulrich Drepper <drepper@myware>
+
+ * libintl.inst: Add missing __P definition. Reported by Nelson Beebe.
+
+ * Makefile.in:
+ Add dummy `all' and `dvi' goals. Reported by Tom Tromey.
+
+Sat Nov 25 16:12:01 1995 Franc,ois Pinard <pinard@iro.umontreal.ca>
+
+ * hash-string.h: Capitalize arguments of macros.
+
+Sat Nov 25 12:01:36 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (DISTFILES): Prevent files names longer than 13
+ characters. libintl.h.glibc->libintl.glibc,
+ libintl.h.install->libintl.inst. Reported by Joshua R. Poulson.
+
+Sat Nov 25 11:31:12 1995 Eric Backus <ericb@lsid.hp.com>
+
+ * dcgettext.c: Fix bug in preprocessor conditionals.
+
+Sat Nov 25 02:35:27 1995 Nelson H. F. Beebe <beebe@math.utah.edu>
+
+ * libgettext.h: Solaris cc does not understand
+ #if !SYMBOL1 && !SYMBOL2. Sad but true.
+
+Thu Nov 23 16:22:14 1995 Ulrich Drepper <drepper@myware>
+
+ * hash-string.h (hash_string):
+ Fix for machine with >32 bit `unsigned long's.
+
+ * dcgettext.c (DCGETTEXT):
+ Fix horrible bug in loop for alternative translation.
+
+Thu Nov 23 01:45:29 1995 Ulrich Drepper <drepper@myware>
+
+ * po2tbl.sed.in, linux-msg.sed, xopen-msg.sed:
+ Some further simplifications in message number generation.
+
+Mon Nov 20 21:08:43 1995 Ulrich Drepper <drepper@myware>
+
+ * libintl.h.glibc: Use __const instead of const in prototypes.
+
+ * Makefile.in (install-src):
+ Install libintl.h.install instead of libintl.h. This
+ is a stripped-down version. Suggested by Peter Miller.
+
+ * libintl.h.install, libintl.h.glibc: Initial revision.
+
+ * localealias.c (_nl_expand_alias, read_alias_file):
+ Protect prototypes in type casts by __P.
+
+Tue Nov 14 16:43:58 1995 Ulrich Drepper <drepper@myware>
+
+ * hash-string.h: Correct prototype for hash_string.
+
+Sun Nov 12 12:42:30 1995 Ulrich Drepper <drepper@myware>
+
+ * hash-string.h (hash_string): Add prototype.
+
+ * gettextP.h: Fix copyright.
+ (SWAP): Add prototype.
+
+Wed Nov 8 22:56:33 1995 Ulrich Drepper <drepper@myware>
+
+ * localealias.c (read_alias_file): Forgot sizeof.
+ Avoid calling *printf function. This introduces a big overhead.
+ Patch by Roland McGrath.
+
+Tue Nov 7 14:21:08 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c, cat-compat.c: Wrong indentation in #if for stpcpy.
+
+ * finddomain.c (stpcpy):
+ Define substitution function local. The macro was to flaky.
+
+ * cat-compat.c: Fix typo.
+
+ * xopen-msg.sed, linux-msg.sed:
+ While bringing message number to right place only accept digits.
+
+ * linux-msg.sed, xopen-msg.sed: Now that the counter does not have
+ leading 0s we don't need to remove them. Reported by Marcus
+ Daniels.
+
+ * Makefile.in (../po/cat-id-tbl.o): Use $(top_srdir) in
+ dependency. Reported by Marcus Daniels.
+
+ * cat-compat.c: (stpcpy) [!_LIBC && !HAVE_STPCPY]: Define replacement.
+ Generally cleanup using #if instead of #ifndef.
+
+ * Makefile.in: Correct typos in comment. By Franc,ois Pinard.
+
+Mon Nov 6 00:27:02 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (install-src): Don't install libintl.h and libintl.a
+ if we use an available gettext implementation.
+
+Sun Nov 5 22:02:08 1995 Ulrich Drepper <drepper@myware>
+
+ * libgettext.h: Fix typo: HAVE_CATGETTS -> HAVE_CATGETS. Reported
+ by Franc,ois Pinard.
+
+ * libgettext.h: Use #if instead of #ifdef/#ifndef.
+
+ * finddomain.c:
+ Comments describing what has to be done should start with FIXME.
+
+Sun Nov 5 19:38:01 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (DISTFILES): Split. Use DISTFILES with normal meaning.
+ DISTFILES.common names the files common to both dist goals.
+ DISTFILES.gettext are the files only distributed in GNU gettext.
+
+Sun Nov 5 17:32:54 1995 Ulrich Drepper <drepper@myware>
+
+ * dcgettext.c (DCGETTEXT): Correct searching in derived locales.
+ This was necessary since a change in _nl_find_msg several weeks
+ ago. I really don't know this is still not fixed.
+
+Sun Nov 5 12:43:12 1995 Ulrich Drepper <drepper@myware>
+
+ * loadmsgcat.c (_nl_load_domain): Test for FILENAME == NULL. This
+ might mark a special condition.
+
+ * finddomain.c (make_entry_rec): Don't make illegal entry as decided.
+
+ * Makefile.in (dist): Suppress error message when ln failed.
+ Get files from $(srcdir) explicitly.
+
+ * libgettext.h (gettext_const): Rename to gettext_noop.
+
+Fri Nov 3 07:36:50 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (make_entry_rec):
+ Protect against wrong locale names by testing mask.
+
+ * libgettext.h (gettext_const): Add macro definition.
+ Capitalize macro arguments.
+
+Thu Nov 2 23:15:51 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (_nl_find_domain):
+ Test for pointer != NULL before accessing value.
+ Reported by Tom Tromey.
+
+ * gettext.c (NULL):
+ Define as (void*)0 instad of 0. Reported by Franc,ois Pinard.
+
+Mon Oct 30 21:28:52 1995 Ulrich Drepper <drepper@myware>
+
+ * po2tbl.sed.in: Serious typo bug fixed by Jim Meyering.
+
+Sat Oct 28 23:20:47 1995 Ulrich Drepper <drepper@myware>
+
+ * libgettext.h: Disable dcgettext optimization for Solaris 2.3.
+
+ * localealias.c (alias_compare):
+ Peter Miller reported that tolower in some systems is
+ even dumber than I thought. Protect call by `isupper'.
+
+Fri Oct 27 22:22:51 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (libdir, includedir): New variables.
+ (install-src): Install libintl.a and libintl.h in correct dirs.
+
+Fri Oct 27 22:07:29 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (SOURCES): Fix typo: intrl.compat.c -> intl-compat.c.
+
+ * po2tbl.sed.in: Patch for buggy SEDs by Christian von Roques.
+
+ * localealias.c:
+ Fix typo and superflous test. Reported by Christian von Roques.
+
+Fri Oct 6 11:52:05 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (_nl_find_domain):
+ Correct some remainder from the pre-CEN syntax. Now
+ we don't have a constant number of successors anymore.
+
+Wed Sep 27 21:41:13 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (DISTFILES): Add libintl.h.glibc.
+
+ * Makefile.in (dist-libc): Add goal for packing sources for glibc.
+ (COMSRCS, COMHDRS): Splitted to separate sources shared with glibc.
+
+ * loadmsgcat.c: Forget to continue #if line.
+
+ * localealias.c:
+ [_LIBC]: Rename strcasecmp to __strcasecmp to keep ANSI C name
+ space clean.
+
+ * dcgettext.c, finddomain.c: Better comment to last change.
+
+ * loadmsgcat.c:
+ [_LIBC]: Rename fstat, open, close, read, mmap, and munmap to
+ __fstat, __open, __close, __read, __mmap, and __munmap resp
+ to keep ANSI C name space clean.
+
+ * finddomain.c:
+ [_LIBC]: Rename stpcpy to __stpcpy to keep ANSI C name space clean.
+
+ * dcgettext.c:
+ [_LIBC]: Rename getced and stpcpy to __getcwd and __stpcpy resp to
+ keep ANSI C name space clean.
+
+ * libgettext.h:
+ Include sys/types.h for those old SysV systems out there.
+ Reported by Francesco Potorti`.
+
+ * loadmsgcat.c (use_mmap): Define if compiled for glibc.
+
+ * bindtextdom.c: Include all those standard headers
+ unconditionally if _LIBC is defined.
+
+ * finddomain.c: Fix 2 times defiend -> defined.
+
+ * textdomain.c: Include libintl.h instead of libgettext.h when
+ compiling for glibc. Include all those standard headers
+ unconditionally if _LIBC is defined.
+
+ * localealias.c, loadmsgcat.c: Prepare to be compiled in glibc.
+
+ * gettext.c:
+ Include libintl.h instead of libgettext.h when compiling for glibc.
+ Get NULL from stddef.h if we compile for glibc.
+
+ * finddomain.c: Include libintl.h instead of libgettext.h when
+ compiling for glibc. Include all those standard headers
+ unconditionally if _LIBC is defined.
+
+ * dcgettext.c: Include all those standard headers unconditionally
+ if _LIBC is defined.
+
+ * dgettext.c: If compiled in glibc include libintl.h instead of
+ libgettext.h.
+ (locale.h): Don't rely on HAVE_LOCALE_H when compiling for glibc.
+
+ * dcgettext.c: If compiled in glibc include libintl.h instead of
+ libgettext.h.
+ (getcwd): Don't rely on HAVE_GETCWD when compiling for glibc.
+
+ * bindtextdom.c:
+ If compiled in glibc include libintl.h instead of libgettext.h.
+
+Mon Sep 25 22:23:06 1995 Ulrich Drepper <drepper@myware>
+
+ * localealias.c (_nl_expand_alias): Don't call bsearch if NMAP <= 0.
+ Reported by Marcus Daniels.
+
+ * cat-compat.c (bindtextdomain):
+ String used in putenv must not be recycled.
+ Reported by Marcus Daniels.
+
+ * libgettext.h (__USE_GNU_GETTEXT):
+ Additional symbol to signal that we use GNU gettext
+ library.
+
+ * cat-compat.c (bindtextdomain):
+ Fix bug with the strange stpcpy replacement.
+ Reported by Nelson Beebe.
+
+Sat Sep 23 08:23:51 1995 Ulrich Drepper <drepper@myware>
+
+ * cat-compat.c: Include <string.h> for stpcpy prototype.
+
+ * localealias.c (read_alias_file):
+ While expand strdup code temporary variable `cp' hided
+ higher level variable with same name. Rename to `tp'.
+
+ * textdomain.c (textdomain):
+ Avoid warning by using temporary variable in strdup code.
+
+ * finddomain.c (_nl_find_domain): Remove unused variable `application'.
+
+Thu Sep 21 15:51:44 1995 Ulrich Drepper <drepper@myware>
+
+ * localealias.c (alias_compare):
+ Use strcasecmp() only if available. Else use
+ implementation in place.
+
+ * intl-compat.c:
+ Wrapper functions now call *__ functions instead of __*.
+
+ * libgettext.h: Declare prototypes for *__ functions instead for __*.
+
+ * cat-compat.c, loadmsgcat.c:
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part
+ of the standard libc and so prevent libintl.a from being used
+ standalone.
+
+ * bindtextdom.c:
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part
+ of the standard libc and so prevent libintl.a from being used
+ standalone.
+ Rename to bindtextdomain__ if not used in GNU C Library.
+
+ * dgettext.c:
+ Rename function to dgettext__ if not used in GNU C Library.
+
+ * gettext.c:
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part
+ of the standard libc and so prevent libintl.a from being used
+ standalone.
+ Functions now called gettext__ if not used in GNU C Library.
+
+ * dcgettext.c, localealias.c, textdomain.c, finddomain.c:
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part
+ of the standard libc and so prevent libintl.a from being used
+ standalone.
+
+Sun Sep 17 23:14:49 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c: Correct some bugs in handling of CEN standard
+ locale definitions.
+
+Thu Sep 7 01:49:28 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c: Implement CEN syntax.
+
+ * gettextP.h (loaded_domain): Extend number of successors to 31.
+
+Sat Aug 19 19:25:29 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (aliaspath): Remove path to X11 locale dir.
+
+ * Makefile.in: Make install-src depend on install. This helps
+ gettext to install the sources and other packages can use the
+ install goal.
+
+Sat Aug 19 15:19:33 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (uninstall): Remove stuff installed by install-src.
+
+Tue Aug 15 13:13:53 1995 Ulrich Drepper <drepper@myware>
+
+ * VERSION.in: Initial revision.
+
+ * Makefile.in (DISTFILES):
+ Add VERSION file. This is not necessary for gettext, but
+ for other packages using this library.
+
+Tue Aug 15 06:16:44 1995 Ulrich Drepper <drepper@myware>
+
+ * gettextP.h (_nl_find_domain):
+ New prototype after changing search strategy.
+
+ * finddomain.c (_nl_find_domain):
+ We now try only to find a specified catalog. Fall back to other
+ catalogs listed in the locale list is now done in __dcgettext.
+
+ * dcgettext.c (__dcgettext):
+ Now we provide message fall back even to different languages.
+ I.e. if a message is not available in one language all the other
+ in the locale list a tried. Formerly fall back was only possible
+ within one language. Implemented by moving one loop from
+ _nl_find_domain to here.
+
+Mon Aug 14 23:45:50 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (gettextsrcdir):
+ Directory where source of GNU gettext library are made
+ available.
+ (INSTALL, INSTALL_DATA): Programs used for installing sources.
+ (gettext-src): New. Rule to install GNU gettext sources for use in
+ gettextize shell script.
+
+Sun Aug 13 14:40:48 1995 Ulrich Drepper <drepper@myware>
+
+ * loadmsgcat.c (_nl_load_domain):
+ Use mmap for loading only when munmap function is
+ also available.
+
+ * Makefile.in (install): Depend on `all' goal.
+
+Wed Aug 9 11:04:33 1995 Ulrich Drepper <drepper@myware>
+
+ * localealias.c (read_alias_file):
+ Do not overwrite '\n' when terminating alias value string.
+
+ * localealias.c (read_alias_file):
+ Handle long lines. Ignore the rest not fitting in
+ the buffer after the initial `fgets' call.
+
+Wed Aug 9 00:54:29 1995 Ulrich Drepper <drepper@myware>
+
+ * gettextP.h (_nl_load_domain):
+ Add prototype, replacing prototype for _nl_load_msg_cat.
+
+ * finddomain.c (_nl_find_domain):
+ Remove unneeded variable filename and filename_len.
+ (expand_alias): Remove prototype because functions does not
+ exist anymore.
+
+ * localealias.c (read_alias_file):
+ Change type of fname_len parameter to int.
+ (xmalloc): Add prototype.
+
+ * loadmsgcat.c: Better prototypes for xmalloc.
+
+Tue Aug 8 22:30:39 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (_nl_find_domain):
+ Allow alias name to be constructed from the four components.
+
+ * Makefile.in (aliaspath): New variable. Set to preliminary value.
+ (SOURCES): Add localealias.c.
+ (OBJECTS): Add localealias.o.
+
+ * gettextP.h: Add prototype for _nl_expand_alias.
+
+ * finddomain.c: Aliasing handled in intl/localealias.c.
+
+ * localealias.c: Aliasing for locale names.
+
+ * bindtextdom.c: Better prototypes for xmalloc and xstrdup.
+
+Mon Aug 7 23:47:42 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (DISTFILES): gettext.perl is now found in misc/.
+
+ * cat-compat.c (bindtextdomain):
+ Correct implementation. dirname parameter was not used.
+ Reported by Marcus Daniels.
+
+ * gettextP.h (loaded_domain):
+ New fields `successor' and `decided' for oo, lazy
+ message handling implementation.
+
+ * dcgettext.c:
+ Adopt for oo, lazy message handliing.
+ Now we can inherit translations from less specific locales.
+ (find_msg): New function.
+
+ * loadmsgcat.c, finddomain.c:
+ Complete rewrite. Implement oo, lazy message handling :-).
+ We now have an additional environment variable `LANGUAGE' with
+ a higher priority than LC_ALL for the LC_MESSAGE locale.
+ Here we can set a colon separated list of specifications each
+ of the form `language[_territory[.codeset]][@modifier]'.
+
+Sat Aug 5 09:55:42 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (unistd.h):
+ Include to get _PC_PATH_MAX defined on system having it.
+
+Fri Aug 4 22:42:00 1995 Ulrich Drepper <drepper@myware>
+
+ * finddomain.c (stpcpy): Include prototype.
+
+ * Makefile.in (dist): Remove `copying instead' message.
+
+Wed Aug 2 18:52:03 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (ID, TAGS): Do not use $^.
+
+Tue Aug 1 20:07:11 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (TAGS, ID): Use $^ as command argument.
+ (TAGS): Give etags -o option t write to current directory,
+ not $(srcdir).
+ (ID): Use $(srcdir) instead os $(top_srcdir)/src.
+ (distclean): Remove ID.
+
+Sun Jul 30 11:51:46 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (gnulocaledir):
+ New variable, always using share/ for data directory.
+ (DEFS): Add GNULOCALEDIR, used in finddomain.c.
+
+ * finddomain.c (_nl_default_dirname):
+ Set to GNULOCALEDIR, because it always has to point
+ to the directory where GNU gettext Library writes it to.
+
+ * intl-compat.c (textdomain, bindtextdomain):
+ Undefine macros before function definition.
+
+Sat Jul 22 01:10:02 1995 Ulrich Drepper <drepper@myware>
+
+ * libgettext.h (_LIBINTL_H):
+ Protect definition in case where this file is included as
+ libgettext.h on Solaris machines. Add comment about this.
+
+Wed Jul 19 02:36:42 1995 Ulrich Drepper <drepper@myware>
+
+ * intl-compat.c (textdomain): Correct typo.
+
+Wed Jul 19 01:51:35 1995 Ulrich Drepper <drepper@myware>
+
+ * dcgettext.c (dcgettext): Function now called __dcgettext.
+
+ * dgettext.c (dgettext): Now called __dgettext and calls
+ __dcgettext.
+
+ * gettext.c (gettext):
+ Function now called __gettext and calls __dgettext.
+
+ * textdomain.c (textdomain): Function now called __textdomain.
+
+ * bindtextdom.c (bindtextdomain): Function now called
+ __bindtextdomain.
+
+ * intl-compat.c: Initial revision.
+
+ * Makefile.in (SOURCES): Add intl-compat.c.
+ (OBJECTS): We always compile the GNU gettext library functions.
+ OBJECTS contains all objects but cat-compat.o, ../po/cat-if-tbl.o,
+ and intl-compat.o.
+ (GETTOBJS): Contains now only intl-compat.o.
+
+ * libgettext.h:
+ Re-include protection matches dualistic character of libgettext.h.
+ For all functions in GNU gettext library define __ counter part.
+
+ * finddomain.c (strchr): Define as index if not found in C library.
+ (_nl_find_domain): For relative paths paste / in between.
+
+Tue Jul 18 16:37:45 1995 Ulrich Drepper <drepper@myware>
+
+ * loadmsgcat.c, finddomain.c: Add inclusion of sys/types.h.
+
+ * xopen-msg.sed: Fix bug with `msgstr ""' lines.
+ A little bit better comments.
+
+Tue Jul 18 01:18:27 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in:
+ po-mode.el, makelinks, combine-sh are now found in ../misc.
+
+ * po-mode.el, makelinks, combine-sh, elisp-comp:
+ Moved to ../misc/.
+
+ * libgettext.h, gettextP.h, gettext.h: Uniform test for __STDC__.
+
+Sun Jul 16 22:33:02 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (INSTALL, INSTALL_DATA): New variables.
+ (install-data, uninstall): Install/uninstall .elc file.
+
+ * po-mode.el (Installation comment):
+ Add .pox as possible extension of .po files.
+
+Sun Jul 16 13:23:27 1995 Ulrich Drepper <drepper@myware>
+
+ * elisp-comp: Complete new version by Franc,ois: This does not
+ fail when not compiling in the source directory.
+
+Sun Jul 16 00:12:17 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (../po/cat-id-tbl.o):
+ Use $(MAKE) instead of make for recursive make.
+
+ * Makefile.in (.el.elc): Use $(SHELL) instead of /bin/sh.
+ (install-exec): Add missing dummy goal.
+ (install-data, uninstall): @ in multi-line shell command at
+ beginning, not in front of echo. Reported by Eric Backus.
+
+Sat Jul 15 00:21:28 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (DISTFILES):
+ Rename libgettext.perl to gettext.perl to fit in 14 chars
+ file systems.
+
+ * gettext.perl:
+ Rename to gettext.perl to fit in 14 chars file systems.
+
+Thu Jul 13 23:17:20 1995 Ulrich Drepper <drepper@myware>
+
+ * cat-compat.c: If !STDC_HEADERS try to include malloc.h.
+
+Thu Jul 13 20:55:02 1995 Ulrich Drepper <drepper@myware>
+
+ * po2tbl.sed.in: Pretty printing.
+
+ * linux-msg.sed, xopen-msg.sed:
+ Correct bugs with handling substitute flags in branches.
+
+ * hash-string.h (hash_string):
+ Old K&R compilers don't under stand `unsigned char'.
+
+ * gettext.h (nls_uint32):
+ Some old K&R compilers (eg HP) don't understand `unsigned int'.
+
+ * cat-compat.c (msg_to_cat_id): De-ANSI-fy prototypes.
+
+Thu Jul 13 01:34:33 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (ELCFILES): New variable.
+ (DISTFILES): Add elisp-comp.
+ Add implicit rule for .el -> .elc compilation.
+ (install-data): install $ELCFILES
+ (clean): renamed po-to-tbl and po-to-msg to po2tbl and po2msg resp.
+
+ * elisp-comp: Initial revision
+
+Wed Jul 12 16:14:52 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in:
+ cat-id-tbl.c is now found in po/. This enables us to use an identical
+ intl/ directory in all packages.
+
+ * dcgettext.c (dcgettext): hashing does not work for table size <= 2.
+
+ * textdomain.c: fix typo (#if def -> #if defined)
+
+Tue Jul 11 18:44:43 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in (stamp-cat-id): use top_srcdir to address source files
+ (DISTFILES,distclean): move tupdate.perl to src/
+
+ * po-to-tbl.sed.in:
+ add additional jump to clear change flag to recognize multiline strings
+
+Tue Jul 11 01:32:50 1995 Ulrich Drepper <drepper@myware>
+
+ * textdomain.c: Protect inclusion of stdlib.h and string.h.
+
+ * loadmsgcat.c: Protect inclusion of stdlib.h.
+
+ * libgettext.h: Protect inclusion of locale.h.
+ Allow use in C++ programs.
+ Define NULL is not happened already.
+
+ * Makefile.in (DISTFILES): ship po-to-tbl.sed.in instead of
+ po-to-tbl.sed.
+ (distclean): remove po-to-tbl.sed and tupdate.perl.
+
+ * tupdate.perl.in: Substitute Perl path even in exec line.
+ Don't include entries without translation from old .po file.
+
+Tue Jul 4 00:41:51 1995 Ulrich Drepper <drepper@myware>
+
+ * tupdate.perl.in: use "Updated: " in msgid "".
+
+ * cat-compat.c: Fix typo (LOCALDIR -> LOCALEDIR).
+ Define getenv if !__STDC__.
+
+ * bindtextdom.c: Protect stdlib.h and string.h inclusion.
+ Define free if !__STDC__.
+
+ * finddomain.c: Change DEF_MSG_DOM_DIR to LOCALEDIR.
+ Define free if !__STDC__.
+
+ * cat-compat.c: Change DEF_MSG_DOM_DIR to LOCALEDIR.
+
+Mon Jul 3 23:56:30 1995 Ulrich Drepper <drepper@myware>
+
+ * Makefile.in: Use LOCALEDIR instead of DEF_MSG_DOM_DIR.
+ Remove unneeded $(srcdir) from Makefile.in dependency.
+
+ * makelinks: Add copyright and short description.
+
+ * po-mode.el: Last version for 0.7.
+
+ * tupdate.perl.in: Fix die message.
+
+ * dcgettext.c: Protect include of string.h.
+
+ * gettext.c: Protect include of stdlib.h and further tries to get NULL.
+
+ * finddomain.c: Some corrections in includes.
+
+ * Makefile.in (INCLUDES): Prune list correct path to Makefile.in.
+
+ * po-to-tbl.sed: Adopt for new .po file format.
+
+ * linux-msg.sed, xopen-msg.sed: Adopt for new .po file format.
+
+Sun Jul 2 23:55:03 1995 Ulrich Drepper <drepper@myware>
+
+ * tupdate.perl.in: Complete rewrite for new .po file format.
+
+Sun Jul 2 02:06:50 1995 Ulrich Drepper <drepper@myware>
+
+ * First official release. This directory contains all the code
+ needed to internationalize own packages. It provides functions
+ which allow to use the X/Open catgets function with an interface
+ like the Uniforum gettext function. For system which does not
+ have neither of those a complete implementation is provided.
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/VERSION b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/VERSION
new file mode 100644
index 0000000000..ee66b0612b
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/VERSION
@@ -0,0 +1 @@
+GNU gettext library from gettext-0.10.35
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c
new file mode 100644
index 0000000000..d9c3f349e0
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c
@@ -0,0 +1,203 @@
+/* Implementation of the bindtextdomain(3) function
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#else
+# ifdef HAVE_MALLOC_H
+# include <malloc.h>
+# else
+void free ();
+# endif
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+#include "gettext.h"
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+/* Contains the default location of the message catalogs. */
+extern const char _nl_default_dirname[];
+
+/* List with bindings of specific domains. */
+extern struct binding *_nl_domain_bindings;
+
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define BINDTEXTDOMAIN __bindtextdomain
+# ifndef strdup
+# define strdup(str) __strdup (str)
+# endif
+#else
+# define BINDTEXTDOMAIN bindtextdomain__
+#endif
+
+/* Specify that the DOMAINNAME message catalog will be found
+ in DIRNAME rather than in the system locale data base. */
+char *
+BINDTEXTDOMAIN (domainname, dirname)
+ const char *domainname;
+ const char *dirname;
+{
+ struct binding *binding;
+
+ /* Some sanity checks. */
+ if (domainname == NULL || domainname[0] == '\0')
+ return NULL;
+
+ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+ {
+ int compare = strcmp (domainname, binding->domainname);
+ if (compare == 0)
+ /* We found it! */
+ break;
+ if (compare < 0)
+ {
+ /* It is not in the list. */
+ binding = NULL;
+ break;
+ }
+ }
+
+ if (dirname == NULL)
+ /* The current binding has be to returned. */
+ return binding == NULL ? (char *) _nl_default_dirname : binding->dirname;
+
+ if (binding != NULL)
+ {
+ /* The domain is already bound. If the new value and the old
+ one are equal we simply do nothing. Otherwise replace the
+ old binding. */
+ if (strcmp (dirname, binding->dirname) != 0)
+ {
+ char *new_dirname;
+
+ if (strcmp (dirname, _nl_default_dirname) == 0)
+ new_dirname = (char *) _nl_default_dirname;
+ else
+ {
+#if defined _LIBC || defined HAVE_STRDUP
+ new_dirname = strdup (dirname);
+ if (new_dirname == NULL)
+ return NULL;
+#else
+ size_t len = strlen (dirname) + 1;
+ new_dirname = (char *) malloc (len);
+ if (new_dirname == NULL)
+ return NULL;
+
+ memcpy (new_dirname, dirname, len);
+#endif
+ }
+
+ if (binding->dirname != _nl_default_dirname)
+ free (binding->dirname);
+
+ binding->dirname = new_dirname;
+ }
+ }
+ else
+ {
+ /* We have to create a new binding. */
+#if !defined _LIBC && !defined HAVE_STRDUP
+ size_t len;
+#endif
+ struct binding *new_binding =
+ (struct binding *) malloc (sizeof (*new_binding));
+
+ if (new_binding == NULL)
+ return NULL;
+
+#if defined _LIBC || defined HAVE_STRDUP
+ new_binding->domainname = strdup (domainname);
+ if (new_binding->domainname == NULL)
+ return NULL;
+#else
+ len = strlen (domainname) + 1;
+ new_binding->domainname = (char *) malloc (len);
+ if (new_binding->domainname == NULL)
+ return NULL;
+ memcpy (new_binding->domainname, domainname, len);
+#endif
+
+ if (strcmp (dirname, _nl_default_dirname) == 0)
+ new_binding->dirname = (char *) _nl_default_dirname;
+ else
+ {
+#if defined _LIBC || defined HAVE_STRDUP
+ new_binding->dirname = strdup (dirname);
+ if (new_binding->dirname == NULL)
+ return NULL;
+#else
+ len = strlen (dirname) + 1;
+ new_binding->dirname = (char *) malloc (len);
+ if (new_binding->dirname == NULL)
+ return NULL;
+ memcpy (new_binding->dirname, dirname, len);
+#endif
+ }
+
+ /* Now enqueue it. */
+ if (_nl_domain_bindings == NULL
+ || strcmp (domainname, _nl_domain_bindings->domainname) < 0)
+ {
+ new_binding->next = _nl_domain_bindings;
+ _nl_domain_bindings = new_binding;
+ }
+ else
+ {
+ binding = _nl_domain_bindings;
+ while (binding->next != NULL
+ && strcmp (domainname, binding->next->domainname) > 0)
+ binding = binding->next;
+
+ new_binding->next = binding->next;
+ binding->next = new_binding;
+ }
+
+ binding = new_binding;
+ }
+
+ return binding->dirname;
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__bindtextdomain, bindtextdomain);
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/cat-compat.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/cat-compat.c
new file mode 100644
index 0000000000..867d901b8f
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/cat-compat.c
@@ -0,0 +1,262 @@
+/* Compatibility code for gettext-using-catgets interface.
+ Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <string.h>
+#else
+char *getenv ();
+# ifdef HAVE_MALLOC_H
+# include <malloc.h>
+# endif
+#endif
+
+#ifdef HAVE_NL_TYPES_H
+# include <nl_types.h>
+#endif
+
+#include "libgettext.h"
+
+/* @@ end of prolog @@ */
+
+/* XPG3 defines the result of `setlocale (category, NULL)' as:
+ ``Directs `setlocale()' to query `category' and return the current
+ setting of `local'.''
+ However it does not specify the exact format. And even worse: POSIX
+ defines this not at all. So we can use this feature only on selected
+ system (e.g. those using GNU C Library). */
+#ifdef _LIBC
+# define HAVE_LOCALE_NULL
+#endif
+
+/* The catalog descriptor. */
+static nl_catd catalog = (nl_catd) -1;
+
+/* Name of the default catalog. */
+static const char default_catalog_name[] = "messages";
+
+/* Name of currently used catalog. */
+static const char *catalog_name = default_catalog_name;
+
+/* Get ID for given string. If not found return -1. */
+static int msg_to_cat_id PARAMS ((const char *msg));
+
+/* Substitution for systems lacking this function in their C library. */
+#if !_LIBC && !HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+#endif
+
+
+/* Set currently used domain/catalog. */
+char *
+textdomain (domainname)
+ const char *domainname;
+{
+ nl_catd new_catalog;
+ char *new_name;
+ size_t new_name_len;
+ char *lang;
+
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES \
+ && defined HAVE_LOCALE_NULL
+ lang = setlocale (LC_MESSAGES, NULL);
+#else
+ lang = getenv ("LC_ALL");
+ if (lang == NULL || lang[0] == '\0')
+ {
+ lang = getenv ("LC_MESSAGES");
+ if (lang == NULL || lang[0] == '\0')
+ lang = getenv ("LANG");
+ }
+#endif
+ if (lang == NULL || lang[0] == '\0')
+ lang = "C";
+
+ /* See whether name of currently used domain is asked. */
+ if (domainname == NULL)
+ return (char *) catalog_name;
+
+ if (domainname[0] == '\0')
+ domainname = default_catalog_name;
+
+ /* Compute length of added path element. */
+ new_name_len = sizeof (LOCALEDIR) - 1 + 1 + strlen (lang)
+ + sizeof ("/LC_MESSAGES/") - 1 + sizeof (PACKAGE) - 1
+ + sizeof (".cat");
+
+ new_name = (char *) malloc (new_name_len);
+ if (new_name == NULL)
+ return NULL;
+
+ strcpy (new_name, PACKAGE);
+ new_catalog = catopen (new_name, 0);
+
+ if (new_catalog == (nl_catd) -1)
+ {
+ /* NLSPATH search didn't work, try absolute path */
+ sprintf (new_name, "%s/%s/LC_MESSAGES/%s.cat", LOCALEDIR, lang,
+ PACKAGE);
+ new_catalog = catopen (new_name, 0);
+
+ if (new_catalog == (nl_catd) -1)
+ {
+ free (new_name);
+ return (char *) catalog_name;
+ }
+ }
+
+ /* Close old catalog. */
+ if (catalog != (nl_catd) -1)
+ catclose (catalog);
+ if (catalog_name != default_catalog_name)
+ free ((char *) catalog_name);
+
+ catalog = new_catalog;
+ catalog_name = new_name;
+
+ return (char *) catalog_name;
+}
+
+char *
+bindtextdomain (domainname, dirname)
+ const char *domainname;
+ const char *dirname;
+{
+#if HAVE_SETENV || HAVE_PUTENV
+ char *old_val, *new_val, *cp;
+ size_t new_val_len;
+
+ /* This does not make much sense here but to be compatible do it. */
+ if (domainname == NULL)
+ return NULL;
+
+ /* Compute length of added path element. If we use setenv we don't need
+ the first byts for NLSPATH=, but why complicate the code for this
+ peanuts. */
+ new_val_len = sizeof ("NLSPATH=") - 1 + strlen (dirname)
+ + sizeof ("/%L/LC_MESSAGES/%N.cat");
+
+ old_val = getenv ("NLSPATH");
+ if (old_val == NULL || old_val[0] == '\0')
+ {
+ old_val = NULL;
+ new_val_len += 1 + sizeof (LOCALEDIR) - 1
+ + sizeof ("/%L/LC_MESSAGES/%N.cat");
+ }
+ else
+ new_val_len += strlen (old_val);
+
+ new_val = (char *) malloc (new_val_len);
+ if (new_val == NULL)
+ return NULL;
+
+# if HAVE_SETENV
+ cp = new_val;
+# else
+ cp = stpcpy (new_val, "NLSPATH=");
+# endif
+
+ cp = stpcpy (cp, dirname);
+ cp = stpcpy (cp, "/%L/LC_MESSAGES/%N.cat:");
+
+ if (old_val == NULL)
+ {
+# if __STDC__
+ stpcpy (cp, LOCALEDIR "/%L/LC_MESSAGES/%N.cat");
+# else
+
+ cp = stpcpy (cp, LOCALEDIR);
+ stpcpy (cp, "/%L/LC_MESSAGES/%N.cat");
+# endif
+ }
+ else
+ stpcpy (cp, old_val);
+
+# if HAVE_SETENV
+ setenv ("NLSPATH", new_val, 1);
+ free (new_val);
+# else
+ putenv (new_val);
+ /* Do *not* free the environment entry we just entered. It is used
+ from now on. */
+# endif
+
+#endif
+
+ return (char *) domainname;
+}
+
+#undef gettext
+char *
+gettext (msg)
+ const char *msg;
+{
+ int msgid;
+
+ if (msg == NULL || catalog == (nl_catd) -1)
+ return (char *) msg;
+
+ /* Get the message from the catalog. We always use set number 1.
+ The message ID is computed by the function `msg_to_cat_id'
+ which works on the table generated by `po-to-tbl'. */
+ msgid = msg_to_cat_id (msg);
+ if (msgid == -1)
+ return (char *) msg;
+
+ return catgets (catalog, 1, msgid, (char *) msg);
+}
+
+/* Look through the table `_msg_tbl' which has `_msg_tbl_length' entries
+ for the one equal to msg. If it is found return the ID. In case when
+ the string is not found return -1. */
+static int
+msg_to_cat_id (msg)
+ const char *msg;
+{
+ int cnt;
+
+ for (cnt = 0; cnt < _msg_tbl_length; ++cnt)
+ if (strcmp (msg, _msg_tbl[cnt]._msg) == 0)
+ return _msg_tbl[cnt]._msg_number;
+
+ return -1;
+}
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library. So we
+ avoid the non-standard function stpcpy. In GNU C Library this
+ function is available, though. Also allow the symbol HAVE_STPCPY
+ to be defined. */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+ char *dest;
+ const char *src;
+{
+ while ((*dest++ = *src++) != '\0')
+ /* Do nothing. */ ;
+ return dest - 1;
+}
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dcgettext.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dcgettext.c
new file mode 100644
index 0000000000..c4c7a2c7d1
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dcgettext.c
@@ -0,0 +1,624 @@
+/* Implementation of the dcgettext(3) function.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# if defined HAVE_ALLOCA_H || defined _LIBC
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca
+char *alloca ();
+# endif
+# endif
+# endif
+#endif
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#else
+char *getenv ();
+# ifdef HAVE_MALLOC_H
+# include <malloc.h>
+# else
+void free ();
+# endif
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+# endif
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+# define strchr index
+# endif
+#endif
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+#include "hash-string.h"
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions. This is required by the standard
+ because some ANSI C functions will require linking with this object
+ file and the name space must not be polluted. */
+# define getcwd __getcwd
+# ifndef stpcpy
+# define stpcpy __stpcpy
+# endif
+#else
+# if !defined HAVE_GETCWD
+char *getwd ();
+# define getcwd(buf, max) getwd (buf)
+# else
+char *getcwd ();
+# endif
+# ifndef HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+# endif
+#endif
+
+/* Amount to increase buffer size by in each try. */
+#define PATH_INCR 32
+
+/* The following is from pathmax.h. */
+/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
+ PATH_MAX but might cause redefinition warnings when sys/param.h is
+ later included (as on MORE/BSD 4.3). */
+#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__))
+# include <limits.h>
+#endif
+
+#ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 255
+#endif
+
+#if !defined(PATH_MAX) && defined(_PC_PATH_MAX)
+# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
+#endif
+
+/* Don't include sys/param.h if it already has been. */
+#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN)
+# include <sys/param.h>
+#endif
+
+#if !defined(PATH_MAX) && defined(MAXPATHLEN)
+# define PATH_MAX MAXPATHLEN
+#endif
+
+#ifndef PATH_MAX
+# define PATH_MAX _POSIX_PATH_MAX
+#endif
+
+/* XPG3 defines the result of `setlocale (category, NULL)' as:
+ ``Directs `setlocale()' to query `category' and return the current
+ setting of `local'.''
+ However it does not specify the exact format. And even worse: POSIX
+ defines this not at all. So we can use this feature only on selected
+ system (e.g. those using GNU C Library). */
+#ifdef _LIBC
+# define HAVE_LOCALE_NULL
+#endif
+
+/* Name of the default domain used for gettext(3) prior any call to
+ textdomain(3). The default value for this is "messages". */
+const char _nl_default_default_domain[] = "messages";
+
+/* Value used as the default domain for gettext(3). */
+const char *_nl_current_default_domain = _nl_default_default_domain;
+
+/* Contains the default location of the message catalogs. */
+const char _nl_default_dirname[] = GNULOCALEDIR;
+
+/* List with bindings of specific domains created by bindtextdomain()
+ calls. */
+struct binding *_nl_domain_bindings;
+
+/* Prototypes for local functions. */
+static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file,
+ const char *msgid)) internal_function;
+static const char *category_to_name PARAMS ((int category)) internal_function;
+static const char *guess_category_value PARAMS ((int category,
+ const char *categoryname))
+ internal_function;
+
+
+/* For those loosing systems which don't have `alloca' we have to add
+ some additional code emulating it. */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done. */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+ void *address;
+ struct block_list *next;
+};
+# define ADD_BLOCK(list, addr) \
+ do { \
+ struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \
+ /* If we cannot get a free block we cannot add the new element to \
+ the list. */ \
+ if (newp != NULL) { \
+ newp->address = (addr); \
+ newp->next = (list); \
+ (list) = newp; \
+ } \
+ } while (0)
+# define FREE_BLOCKS(list) \
+ do { \
+ while (list != NULL) { \
+ struct block_list *old = list; \
+ list = list->next; \
+ free (old); \
+ } \
+ } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+#endif /* have alloca */
+
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DCGETTEXT __dcgettext
+#else
+# define DCGETTEXT dcgettext__
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+ locale. */
+char *
+DCGETTEXT (domainname, msgid, category)
+ const char *domainname;
+ const char *msgid;
+ int category;
+{
+#ifndef HAVE_ALLOCA
+ struct block_list *block_list = NULL;
+#endif
+ struct loaded_l10nfile *domain;
+ struct binding *binding;
+ const char *categoryname;
+ const char *categoryvalue;
+ char *dirname, *xdomainname;
+ char *single_locale;
+ char *retval;
+ int saved_errno = errno;
+
+ /* If no real MSGID is given return NULL. */
+ if (msgid == NULL)
+ return NULL;
+
+ /* If DOMAINNAME is NULL, we are interested in the default domain. If
+ CATEGORY is not LC_MESSAGES this might not make much sense but the
+ defintion left this undefined. */
+ if (domainname == NULL)
+ domainname = _nl_current_default_domain;
+
+ /* First find matching binding. */
+ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+ {
+ int compare = strcmp (domainname, binding->domainname);
+ if (compare == 0)
+ /* We found it! */
+ break;
+ if (compare < 0)
+ {
+ /* It is not in the list. */
+ binding = NULL;
+ break;
+ }
+ }
+
+ if (binding == NULL)
+ dirname = (char *) _nl_default_dirname;
+ else if (binding->dirname[0] == '/')
+ dirname = binding->dirname;
+ else
+ {
+ /* We have a relative path. Make it absolute now. */
+ size_t dirname_len = strlen (binding->dirname) + 1;
+ size_t path_max;
+ char *ret;
+
+ path_max = (unsigned) PATH_MAX;
+ path_max += 2; /* The getcwd docs say to do this. */
+
+ dirname = (char *) alloca (path_max + dirname_len);
+ ADD_BLOCK (block_list, dirname);
+
+ __set_errno (0);
+ while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE)
+ {
+ path_max += PATH_INCR;
+ dirname = (char *) alloca (path_max + dirname_len);
+ ADD_BLOCK (block_list, dirname);
+ __set_errno (0);
+ }
+
+ if (ret == NULL)
+ {
+ /* We cannot get the current working directory. Don't signal an
+ error but simply return the default string. */
+ FREE_BLOCKS (block_list);
+ __set_errno (saved_errno);
+ return (char *) msgid;
+ }
+
+ stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);
+ }
+
+ /* Now determine the symbolic name of CATEGORY and its value. */
+ categoryname = category_to_name (category);
+ categoryvalue = guess_category_value (category, categoryname);
+
+ xdomainname = (char *) alloca (strlen (categoryname)
+ + strlen (domainname) + 5);
+ ADD_BLOCK (block_list, xdomainname);
+
+ stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
+ domainname),
+ ".mo");
+
+ /* Creating working area. */
+ single_locale = (char *) alloca (strlen (categoryvalue) + 1);
+ ADD_BLOCK (block_list, single_locale);
+
+
+ /* Search for the given string. This is a loop because we perhaps
+ got an ordered list of languages to consider for th translation. */
+ while (1)
+ {
+ /* Make CATEGORYVALUE point to the next element of the list. */
+ while (categoryvalue[0] != '\0' && categoryvalue[0] == ':')
+ ++categoryvalue;
+ if (categoryvalue[0] == '\0')
+ {
+ /* The whole contents of CATEGORYVALUE has been searched but
+ no valid entry has been found. We solve this situation
+ by implicitly appending a "C" entry, i.e. no translation
+ will take place. */
+ single_locale[0] = 'C';
+ single_locale[1] = '\0';
+ }
+ else
+ {
+ char *cp = single_locale;
+ while (categoryvalue[0] != '\0' && categoryvalue[0] != ':')
+ *cp++ = *categoryvalue++;
+ *cp = '\0';
+ }
+
+ /* If the current locale value is C (or POSIX) we don't load a
+ domain. Return the MSGID. */
+ if (strcmp (single_locale, "C") == 0
+ || strcmp (single_locale, "POSIX") == 0)
+ {
+ FREE_BLOCKS (block_list);
+ __set_errno (saved_errno);
+ return (char *) msgid;
+ }
+
+
+ /* Find structure describing the message catalog matching the
+ DOMAINNAME and CATEGORY. */
+ domain = _nl_find_domain (dirname, single_locale, xdomainname);
+
+ if (domain != NULL)
+ {
+ retval = find_msg (domain, msgid);
+
+ if (retval == NULL)
+ {
+ int cnt;
+
+ for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)
+ {
+ retval = find_msg (domain->successor[cnt], msgid);
+
+ if (retval != NULL)
+ break;
+ }
+ }
+
+ if (retval != NULL)
+ {
+ FREE_BLOCKS (block_list);
+ __set_errno (saved_errno);
+ return retval;
+ }
+ }
+ }
+ /* NOTREACHED */
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__dcgettext, dcgettext);
+#endif
+
+
+static char *
+internal_function
+find_msg (domain_file, msgid)
+ struct loaded_l10nfile *domain_file;
+ const char *msgid;
+{
+ size_t top, act, bottom;
+ struct loaded_domain *domain;
+
+ if (domain_file->decided == 0)
+ _nl_load_domain (domain_file);
+
+ if (domain_file->data == NULL)
+ return NULL;
+
+ domain = (struct loaded_domain *) domain_file->data;
+
+ /* Locate the MSGID and its translation. */
+ if (domain->hash_size > 2 && domain->hash_tab != NULL)
+ {
+ /* Use the hashing table. */
+ nls_uint32 len = strlen (msgid);
+ nls_uint32 hash_val = hash_string (msgid);
+ nls_uint32 idx = hash_val % domain->hash_size;
+ nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
+ nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]);
+
+ if (nstr == 0)
+ /* Hash table entry is empty. */
+ return NULL;
+
+ if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len
+ && strcmp (msgid,
+ domain->data + W (domain->must_swap,
+ domain->orig_tab[nstr - 1].offset)) == 0)
+ return (char *) domain->data + W (domain->must_swap,
+ domain->trans_tab[nstr - 1].offset);
+
+ while (1)
+ {
+ if (idx >= domain->hash_size - incr)
+ idx -= domain->hash_size - incr;
+ else
+ idx += incr;
+
+ nstr = W (domain->must_swap, domain->hash_tab[idx]);
+ if (nstr == 0)
+ /* Hash table entry is empty. */
+ return NULL;
+
+ if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len
+ && strcmp (msgid,
+ domain->data + W (domain->must_swap,
+ domain->orig_tab[nstr - 1].offset))
+ == 0)
+ return (char *) domain->data
+ + W (domain->must_swap, domain->trans_tab[nstr - 1].offset);
+ }
+ /* NOTREACHED */
+ }
+
+ /* Now we try the default method: binary search in the sorted
+ array of messages. */
+ bottom = 0;
+ top = domain->nstrings;
+ while (bottom < top)
+ {
+ int cmp_val;
+
+ act = (bottom + top) / 2;
+ cmp_val = strcmp (msgid, domain->data
+ + W (domain->must_swap,
+ domain->orig_tab[act].offset));
+ if (cmp_val < 0)
+ top = act;
+ else if (cmp_val > 0)
+ bottom = act + 1;
+ else
+ break;
+ }
+
+ /* If an translation is found return this. */
+ return bottom >= top ? NULL : (char *) domain->data
+ + W (domain->must_swap,
+ domain->trans_tab[act].offset);
+}
+
+
+/* Return string representation of locale CATEGORY. */
+static const char *
+internal_function
+category_to_name (category)
+ int category;
+{
+ const char *retval;
+
+ switch (category)
+ {
+#ifdef LC_COLLATE
+ case LC_COLLATE:
+ retval = "LC_COLLATE";
+ break;
+#endif
+#ifdef LC_CTYPE
+ case LC_CTYPE:
+ retval = "LC_CTYPE";
+ break;
+#endif
+#ifdef LC_MONETARY
+ case LC_MONETARY:
+ retval = "LC_MONETARY";
+ break;
+#endif
+#ifdef LC_NUMERIC
+ case LC_NUMERIC:
+ retval = "LC_NUMERIC";
+ break;
+#endif
+#ifdef LC_TIME
+ case LC_TIME:
+ retval = "LC_TIME";
+ break;
+#endif
+#ifdef LC_MESSAGES
+ case LC_MESSAGES:
+ retval = "LC_MESSAGES";
+ break;
+#endif
+#ifdef LC_RESPONSE
+ case LC_RESPONSE:
+ retval = "LC_RESPONSE";
+ break;
+#endif
+#ifdef LC_ALL
+ case LC_ALL:
+ /* This might not make sense but is perhaps better than any other
+ value. */
+ retval = "LC_ALL";
+ break;
+#endif
+ default:
+ /* If you have a better idea for a default value let me know. */
+ retval = "LC_XXX";
+ }
+
+ return retval;
+}
+
+/* Guess value of current locale from value of the environment variables. */
+static const char *
+internal_function
+guess_category_value (category, categoryname)
+ int category;
+ const char *categoryname;
+{
+ const char *retval;
+
+ /* The highest priority value is the `LANGUAGE' environment
+ variable. This is a GNU extension. */
+ retval = getenv ("LANGUAGE");
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+
+ /* `LANGUAGE' is not set. So we have to proceed with the POSIX
+ methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some
+ systems this can be done by the `setlocale' function itself. */
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+ return setlocale (category, NULL);
+#else
+ /* Setting of LC_ALL overwrites all other. */
+ retval = getenv ("LC_ALL");
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+
+ /* Next comes the name of the desired category. */
+ retval = getenv (categoryname);
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+
+ /* Last possibility is the LANG environment variable. */
+ retval = getenv ("LANG");
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+
+ /* We use C as the default domain. POSIX says this is implementation
+ defined. */
+ return "C";
+#endif
+}
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library. So we
+ avoid the non-standard function stpcpy. In GNU C Library this
+ function is available, though. Also allow the symbol HAVE_STPCPY
+ to be defined. */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+ char *dest;
+ const char *src;
+{
+ while ((*dest++ = *src++) != '\0')
+ /* Do nothing. */ ;
+ return dest - 1;
+}
+#endif
+
+
+#ifdef _LIBC
+/* If we want to free all resources we have to do some work at
+ program's end. */
+static void __attribute__ ((unused))
+free_mem (void)
+{
+ struct binding *runp;
+
+ for (runp = _nl_domain_bindings; runp != NULL; runp = runp->next)
+ {
+ free (runp->domainname);
+ if (runp->dirname != _nl_default_dirname)
+ /* Yes, this is a pointer comparison. */
+ free (runp->dirname);
+ }
+
+ if (_nl_current_default_domain != _nl_default_default_domain)
+ /* Yes, again a pointer comparison. */
+ free ((char *) _nl_current_default_domain);
+}
+
+text_set_element (__libc_subfreeres, free_mem);
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dgettext.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dgettext.c
new file mode 100644
index 0000000000..0510c2b071
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dgettext.c
@@ -0,0 +1,59 @@
+/* Implementation of the dgettext(3) function
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined HAVE_LOCALE_H || defined _LIBC
+# include <locale.h>
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DGETTEXT __dgettext
+# define DCGETTEXT __dcgettext
+#else
+# define DGETTEXT dgettext__
+# define DCGETTEXT dcgettext__
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+ LC_MESSAGES locale. */
+char *
+DGETTEXT (domainname, msgid)
+ const char *domainname;
+ const char *msgid;
+{
+ return DCGETTEXT (domainname, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__dgettext, dgettext);
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/explodename.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/explodename.c
new file mode 100644
index 0000000000..8066dc2996
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/explodename.c
@@ -0,0 +1,188 @@
+/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+#include <sys/types.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found. Sigh! */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+# define NULL ((void *) 0)
+# else
+# define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+int
+_nl_explode_name (name, language, modifier, territory, codeset,
+ normalized_codeset, special, sponsor, revision)
+ char *name;
+ const char **language;
+ const char **modifier;
+ const char **territory;
+ const char **codeset;
+ const char **normalized_codeset;
+ const char **special;
+ const char **sponsor;
+ const char **revision;
+{
+ enum { undecided, xpg, cen } syntax;
+ char *cp;
+ int mask;
+
+ *modifier = NULL;
+ *territory = NULL;
+ *codeset = NULL;
+ *normalized_codeset = NULL;
+ *special = NULL;
+ *sponsor = NULL;
+ *revision = NULL;
+
+ /* Now we determine the single parts of the locale name. First
+ look for the language. Termination symbols are `_' and `@' if
+ we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
+ mask = 0;
+ syntax = undecided;
+ *language = cp = name;
+ while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@'
+ && cp[0] != '+' && cp[0] != ',')
+ ++cp;
+
+ if (*language == cp)
+ /* This does not make sense: language has to be specified. Use
+ this entry as it is without exploding. Perhaps it is an alias. */
+ cp = strchr (*language, '\0');
+ else if (cp[0] == '_')
+ {
+ /* Next is the territory. */
+ cp[0] = '\0';
+ *territory = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
+ && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
+ ++cp;
+
+ mask |= TERRITORY;
+
+ if (cp[0] == '.')
+ {
+ /* Next is the codeset. */
+ syntax = xpg;
+ cp[0] = '\0';
+ *codeset = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != '@')
+ ++cp;
+
+ mask |= XPG_CODESET;
+
+ if (*codeset != cp && (*codeset)[0] != '\0')
+ {
+ *normalized_codeset = _nl_normalize_codeset (*codeset,
+ cp - *codeset);
+ if (strcmp (*codeset, *normalized_codeset) == 0)
+ free ((char *) *normalized_codeset);
+ else
+ mask |= XPG_NORM_CODESET;
+ }
+ }
+ }
+
+ if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
+ {
+ /* Next is the modifier. */
+ syntax = cp[0] == '@' ? xpg : cen;
+ cp[0] = '\0';
+ *modifier = ++cp;
+
+ while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
+ && cp[0] != ',' && cp[0] != '_')
+ ++cp;
+
+ mask |= XPG_MODIFIER | CEN_AUDIENCE;
+ }
+
+ if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
+ {
+ syntax = cen;
+
+ if (cp[0] == '+')
+ {
+ /* Next is special application (CEN syntax). */
+ cp[0] = '\0';
+ *special = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
+ ++cp;
+
+ mask |= CEN_SPECIAL;
+ }
+
+ if (cp[0] == ',')
+ {
+ /* Next is sponsor (CEN syntax). */
+ cp[0] = '\0';
+ *sponsor = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != '_')
+ ++cp;
+
+ mask |= CEN_SPONSOR;
+ }
+
+ if (cp[0] == '_')
+ {
+ /* Next is revision (CEN syntax). */
+ cp[0] = '\0';
+ *revision = ++cp;
+
+ mask |= CEN_REVISION;
+ }
+ }
+
+ /* For CEN syntax values it might be important to have the
+ separator character in the file name, not for XPG syntax. */
+ if (syntax == xpg)
+ {
+ if (*territory != NULL && (*territory)[0] == '\0')
+ mask &= ~TERRITORY;
+
+ if (*codeset != NULL && (*codeset)[0] == '\0')
+ mask &= ~XPG_CODESET;
+
+ if (*modifier != NULL && (*modifier)[0] == '\0')
+ mask &= ~XPG_MODIFIER;
+ }
+
+ return mask;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/finddomain.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/finddomain.c
new file mode 100644
index 0000000000..81ea29bf4e
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/finddomain.c
@@ -0,0 +1,216 @@
+/* Handle list of needed message catalogs
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#else
+# ifdef HAVE_MALLOC_H
+# include <malloc.h>
+# else
+void free ();
+# endif
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+# define strchr index
+# endif
+#endif
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+
+/* @@ end of prolog @@ */
+/* List of already loaded domains. */
+static struct loaded_l10nfile *_nl_loaded_domains;
+
+
+/* Return a data structure describing the message catalog described by
+ the DOMAINNAME and CATEGORY parameters with respect to the currently
+ established bindings. */
+struct loaded_l10nfile *
+internal_function
+_nl_find_domain (dirname, locale, domainname)
+ const char *dirname;
+ char *locale;
+ const char *domainname;
+{
+ struct loaded_l10nfile *retval;
+ const char *language;
+ const char *modifier;
+ const char *territory;
+ const char *codeset;
+ const char *normalized_codeset;
+ const char *special;
+ const char *sponsor;
+ const char *revision;
+ const char *alias_value;
+ int mask;
+
+ /* LOCALE can consist of up to four recognized parts for the XPG syntax:
+
+ language[_territory[.codeset]][@modifier]
+
+ and six parts for the CEN syntax:
+
+ language[_territory][+audience][+special][,[sponsor][_revision]]
+
+ Beside the first part all of them are allowed to be missing. If
+ the full specified locale is not found, the less specific one are
+ looked for. The various parts will be stripped off according to
+ the following order:
+ (1) revision
+ (2) sponsor
+ (3) special
+ (4) codeset
+ (5) normalized codeset
+ (6) territory
+ (7) audience/modifier
+ */
+
+ /* If we have already tested for this locale entry there has to
+ be one data set in the list of loaded domains. */
+ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+ strlen (dirname) + 1, 0, locale, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, domainname, 0);
+ if (retval != NULL)
+ {
+ /* We know something about this locale. */
+ int cnt;
+
+ if (retval->decided == 0)
+ _nl_load_domain (retval);
+
+ if (retval->data != NULL)
+ return retval;
+
+ for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+ {
+ if (retval->successor[cnt]->decided == 0)
+ _nl_load_domain (retval->successor[cnt]);
+
+ if (retval->successor[cnt]->data != NULL)
+ break;
+ }
+ return cnt >= 0 ? retval : NULL;
+ /* NOTREACHED */
+ }
+
+ /* See whether the locale value is an alias. If yes its value
+ *overwrites* the alias name. No test for the original value is
+ done. */
+ alias_value = _nl_expand_alias (locale);
+ if (alias_value != NULL)
+ {
+#if defined _LIBC || defined HAVE_STRDUP
+ locale = strdup (alias_value);
+ if (locale == NULL)
+ return NULL;
+#else
+ size_t len = strlen (alias_value) + 1;
+ locale = (char *) malloc (len);
+ if (locale == NULL)
+ return NULL;
+
+ memcpy (locale, alias_value, len);
+#endif
+ }
+
+ /* Now we determine the single parts of the locale name. First
+ look for the language. Termination symbols are `_' and `@' if
+ we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
+ mask = _nl_explode_name (locale, &language, &modifier, &territory,
+ &codeset, &normalized_codeset, &special,
+ &sponsor, &revision);
+
+ /* Create all possible locale entries which might be interested in
+ generalization. */
+ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+ strlen (dirname) + 1, mask, language, territory,
+ codeset, normalized_codeset, modifier, special,
+ sponsor, revision, domainname, 1);
+ if (retval == NULL)
+ /* This means we are out of core. */
+ return NULL;
+
+ if (retval->decided == 0)
+ _nl_load_domain (retval);
+ if (retval->data == NULL)
+ {
+ int cnt;
+ for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+ {
+ if (retval->successor[cnt]->decided == 0)
+ _nl_load_domain (retval->successor[cnt]);
+ if (retval->successor[cnt]->data != NULL)
+ break;
+ }
+ }
+
+ /* The room for an alias was dynamically allocated. Free it now. */
+ if (alias_value != NULL)
+ free (locale);
+
+ return retval;
+}
+
+
+#ifdef _LIBC
+static void __attribute__ ((unused))
+free_mem (void)
+{
+ struct loaded_l10nfile *runp = _nl_loaded_domains;
+
+ while (runp != NULL)
+ {
+ struct loaded_l10nfile *here = runp;
+ if (runp->data != NULL)
+ _nl_unload_domain ((struct loaded_domain *) runp->data);
+ runp = runp->next;
+ free (here);
+ }
+}
+
+text_set_element (__libc_subfreeres, free_mem);
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.c
new file mode 100644
index 0000000000..d929f98d68
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.c
@@ -0,0 +1,70 @@
+/* Implementation of gettext(3) function.
+ Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# ifdef STDC_HEADERS
+# include <stdlib.h> /* Just for NULL. */
+# else
+# ifdef HAVE_STRING_H
+# include <string.h>
+# else
+# define NULL ((void *) 0)
+# endif
+# endif
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define GETTEXT __gettext
+# define DGETTEXT __dgettext
+#else
+# define GETTEXT gettext__
+# define DGETTEXT dgettext__
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+ LC_MESSAGES locale. If not found, returns MSGID itself (the default
+ text). */
+char *
+GETTEXT (msgid)
+ const char *msgid;
+{
+ return DGETTEXT (NULL, msgid);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__gettext, gettext);
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.h
new file mode 100644
index 0000000000..3cd23d7d6a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.h
@@ -0,0 +1,105 @@
+/* Internal header for GNU gettext internationalization functions.
+ Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifndef _GETTEXT_H
+#define _GETTEXT_H 1
+
+#include <stdio.h>
+
+#if HAVE_LIMITS_H || _LIBC
+# include <limits.h>
+#endif
+
+/* @@ end of prolog @@ */
+
+/* The magic number of the GNU message catalog format. */
+#define _MAGIC 0x950412de
+#define _MAGIC_SWAPPED 0xde120495
+
+/* Revision number of the currently used .mo (binary) file format. */
+#define MO_REVISION_NUMBER 0
+
+/* The following contortions are an attempt to use the C preprocessor
+ to determine an unsigned integral type that is 32 bits wide. An
+ alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+ doing that would require that the configure script compile and *run*
+ the resulting executable. Locally running cross-compiled executables
+ is usually not possible. */
+
+#if __STDC__
+# define UINT_MAX_32_BITS 4294967295U
+#else
+# define UINT_MAX_32_BITS 0xFFFFFFFF
+#endif
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+ This should be valid for all systems GNU cares about because
+ that doesn't include 16-bit systems, and only modern systems
+ (that certainly have <limits.h>) have 64+-bit integral types. */
+
+#ifndef UINT_MAX
+# define UINT_MAX UINT_MAX_32_BITS
+#endif
+
+#if UINT_MAX == UINT_MAX_32_BITS
+typedef unsigned nls_uint32;
+#else
+# if USHRT_MAX == UINT_MAX_32_BITS
+typedef unsigned short nls_uint32;
+# else
+# if ULONG_MAX == UINT_MAX_32_BITS
+typedef unsigned long nls_uint32;
+# else
+ /* The following line is intended to throw an error. Using #error is
+ not portable enough. */
+ "Cannot determine unsigned 32-bit data type."
+# endif
+# endif
+#endif
+
+
+/* Header for binary .mo file format. */
+struct mo_file_header
+{
+ /* The magic number. */
+ nls_uint32 magic;
+ /* The revision number of the file format. */
+ nls_uint32 revision;
+ /* The number of strings pairs. */
+ nls_uint32 nstrings;
+ /* Offset of table with start offsets of original strings. */
+ nls_uint32 orig_tab_offset;
+ /* Offset of table with start offsets of translation strings. */
+ nls_uint32 trans_tab_offset;
+ /* Size of hashing table. */
+ nls_uint32 hash_tab_size;
+ /* Offset of first hashing entry. */
+ nls_uint32 hash_tab_offset;
+};
+
+struct string_desc
+{
+ /* Length of addressed string. */
+ nls_uint32 length;
+ /* Offset of string in file. */
+ nls_uint32 offset;
+};
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettext.h */
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettextP.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettextP.h
new file mode 100644
index 0000000000..00c5203197
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettextP.h
@@ -0,0 +1,89 @@
+/* Header describing internals of gettext library
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _GETTEXTP_H
+#define _GETTEXTP_H
+
+#include "loadinfo.h"
+
+/* @@ end of prolog @@ */
+
+#ifndef PARAMS
+# if __STDC__
+# define PARAMS(args) args
+# else
+# define PARAMS(args) ()
+# endif
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+#ifndef W
+# define W(flag, data) ((flag) ? SWAP (data) : (data))
+#endif
+
+
+#ifdef _LIBC
+# include <byteswap.h>
+# define SWAP(i) bswap_32 (i)
+#else
+static nls_uint32 SWAP PARAMS ((nls_uint32 i));
+
+static inline nls_uint32
+SWAP (i)
+ nls_uint32 i;
+{
+ return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
+}
+#endif
+
+
+struct loaded_domain
+{
+ const char *data;
+ int use_mmap;
+ size_t mmap_size;
+ int must_swap;
+ nls_uint32 nstrings;
+ struct string_desc *orig_tab;
+ struct string_desc *trans_tab;
+ nls_uint32 hash_size;
+ nls_uint32 *hash_tab;
+};
+
+struct binding
+{
+ struct binding *next;
+ char *domainname;
+ char *dirname;
+};
+
+struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname,
+ char *__locale,
+ const char *__domainname))
+ internal_function;
+void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain))
+ internal_function;
+void _nl_unload_domain PARAMS ((struct loaded_domain *__domain))
+ internal_function;
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettextP.h */
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/hash-string.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/hash-string.h
new file mode 100644
index 0000000000..cacb38e479
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/hash-string.h
@@ -0,0 +1,59 @@
+/* Implements a string hashing function.
+ Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* @@ end of prolog @@ */
+
+#ifndef PARAMS
+# if __STDC__
+# define PARAMS(Args) Args
+# else
+# define PARAMS(Args) ()
+# endif
+#endif
+
+/* We assume to have `unsigned long int' value with at least 32 bits. */
+#define HASHWORDBITS 32
+
+
+/* Defines the so called `hashpjw' function by P.J. Weinberger
+ [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+ 1986, 1987 Bell Telephone Laboratories, Inc.] */
+static unsigned long hash_string PARAMS ((const char *__str_param));
+
+static inline unsigned long
+hash_string (str_param)
+ const char *str_param;
+{
+ unsigned long int hval, g;
+ const char *str = str_param;
+
+ /* Compute the hash value for the given string. */
+ hval = 0;
+ while (*str != '\0')
+ {
+ hval <<= 4;
+ hval += (unsigned long) *str++;
+ g = hval & ((unsigned long) 0xf << (HASHWORDBITS - 4));
+ if (g != 0)
+ {
+ hval ^= g >> (HASHWORDBITS - 8);
+ hval ^= g;
+ }
+ }
+ return hval;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/intl-compat.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/intl-compat.c
new file mode 100644
index 0000000000..503efa0fa9
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/intl-compat.c
@@ -0,0 +1,76 @@
+/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
+ Library.
+ Copyright (C) 1995 Software Foundation, Inc.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libgettext.h"
+
+/* @@ end of prolog @@ */
+
+
+#undef gettext
+#undef dgettext
+#undef dcgettext
+#undef textdomain
+#undef bindtextdomain
+
+
+char *
+bindtextdomain (domainname, dirname)
+ const char *domainname;
+ const char *dirname;
+{
+ return bindtextdomain__ (domainname, dirname);
+}
+
+
+char *
+dcgettext (domainname, msgid, category)
+ const char *domainname;
+ const char *msgid;
+ int category;
+{
+ return dcgettext__ (domainname, msgid, category);
+}
+
+
+char *
+dgettext (domainname, msgid)
+ const char *domainname;
+ const char *msgid;
+{
+ return dgettext__ (domainname, msgid);
+}
+
+
+char *
+gettext (msgid)
+ const char *msgid;
+{
+ return gettext__ (msgid);
+}
+
+
+char *
+textdomain (domainname)
+ const char *domainname;
+{
+ return textdomain__ (domainname);
+}
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/l10nflist.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/l10nflist.c
new file mode 100644
index 0000000000..9c7dc18360
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/l10nflist.c
@@ -0,0 +1,411 @@
+/* Handle list of needed message catalogs
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+
+#if defined HAVE_STRING_H || defined _LIBC
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+# endif
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+# define strchr index
+# endif
+#endif
+
+#if defined _LIBC || defined HAVE_ARGZ_H
+# include <argz.h>
+#endif
+#include <ctype.h>
+#include <sys/types.h>
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found. Sigh! */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+# define NULL ((void *) 0)
+# else
+# define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions. This is required by the standard
+ because some ANSI C functions will require linking with this object
+ file and the name space must not be polluted. */
+# ifndef stpcpy
+# define stpcpy(dest, src) __stpcpy(dest, src)
+# endif
+#else
+# ifndef HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+# endif
+#endif
+
+/* Define function which are usually not available. */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
+/* Returns the number of strings in ARGZ. */
+static size_t argz_count__ PARAMS ((const char *argz, size_t len));
+
+static size_t
+argz_count__ (argz, len)
+ const char *argz;
+ size_t len;
+{
+ size_t count = 0;
+ while (len > 0)
+ {
+ size_t part_len = strlen (argz);
+ argz += part_len + 1;
+ len -= part_len + 1;
+ count++;
+ }
+ return count;
+}
+# undef __argz_count
+# define __argz_count(argz, len) argz_count__ (argz, len)
+#endif /* !_LIBC && !HAVE___ARGZ_COUNT */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+ except the last into the character SEP. */
+static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep));
+
+static void
+argz_stringify__ (argz, len, sep)
+ char *argz;
+ size_t len;
+ int sep;
+{
+ while (len > 0)
+ {
+ size_t part_len = strlen (argz);
+ argz += part_len;
+ len -= part_len + 1;
+ if (len > 0)
+ *argz++ = sep;
+ }
+}
+# undef __argz_stringify
+# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
+#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
+static char *argz_next__ PARAMS ((char *argz, size_t argz_len,
+ const char *entry));
+
+static char *
+argz_next__ (argz, argz_len, entry)
+ char *argz;
+ size_t argz_len;
+ const char *entry;
+{
+ if (entry)
+ {
+ if (entry < argz + argz_len)
+ entry = strchr (entry, '\0') + 1;
+
+ return entry >= argz + argz_len ? NULL : (char *) entry;
+ }
+ else
+ if (argz_len > 0)
+ return argz;
+ else
+ return 0;
+}
+# undef __argz_next
+# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
+#endif /* !_LIBC && !HAVE___ARGZ_NEXT */
+
+
+/* Return number of bits set in X. */
+static int pop PARAMS ((int x));
+
+static inline int
+pop (x)
+ int x;
+{
+ /* We assume that no more than 16 bits are used. */
+ x = ((x & ~0x5555) >> 1) + (x & 0x5555);
+ x = ((x & ~0x3333) >> 2) + (x & 0x3333);
+ x = ((x >> 4) + x) & 0x0f0f;
+ x = ((x >> 8) + x) & 0xff;
+
+ return x;
+}
+
+
+struct loaded_l10nfile *
+_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
+ territory, codeset, normalized_codeset, modifier, special,
+ sponsor, revision, filename, do_allocate)
+ struct loaded_l10nfile **l10nfile_list;
+ const char *dirlist;
+ size_t dirlist_len;
+ int mask;
+ const char *language;
+ const char *territory;
+ const char *codeset;
+ const char *normalized_codeset;
+ const char *modifier;
+ const char *special;
+ const char *sponsor;
+ const char *revision;
+ const char *filename;
+ int do_allocate;
+{
+ char *abs_filename;
+ struct loaded_l10nfile *last = NULL;
+ struct loaded_l10nfile *retval;
+ char *cp;
+ size_t entries;
+ int cnt;
+
+ /* Allocate room for the full file name. */
+ abs_filename = (char *) malloc (dirlist_len
+ + strlen (language)
+ + ((mask & TERRITORY) != 0
+ ? strlen (territory) + 1 : 0)
+ + ((mask & XPG_CODESET) != 0
+ ? strlen (codeset) + 1 : 0)
+ + ((mask & XPG_NORM_CODESET) != 0
+ ? strlen (normalized_codeset) + 1 : 0)
+ + (((mask & XPG_MODIFIER) != 0
+ || (mask & CEN_AUDIENCE) != 0)
+ ? strlen (modifier) + 1 : 0)
+ + ((mask & CEN_SPECIAL) != 0
+ ? strlen (special) + 1 : 0)
+ + (((mask & CEN_SPONSOR) != 0
+ || (mask & CEN_REVISION) != 0)
+ ? (1 + ((mask & CEN_SPONSOR) != 0
+ ? strlen (sponsor) + 1 : 0)
+ + ((mask & CEN_REVISION) != 0
+ ? strlen (revision) + 1 : 0)) : 0)
+ + 1 + strlen (filename) + 1);
+
+ if (abs_filename == NULL)
+ return NULL;
+
+ retval = NULL;
+ last = NULL;
+
+ /* Construct file name. */
+ memcpy (abs_filename, dirlist, dirlist_len);
+ __argz_stringify (abs_filename, dirlist_len, ':');
+ cp = abs_filename + (dirlist_len - 1);
+ *cp++ = '/';
+ cp = stpcpy (cp, language);
+
+ if ((mask & TERRITORY) != 0)
+ {
+ *cp++ = '_';
+ cp = stpcpy (cp, territory);
+ }
+ if ((mask & XPG_CODESET) != 0)
+ {
+ *cp++ = '.';
+ cp = stpcpy (cp, codeset);
+ }
+ if ((mask & XPG_NORM_CODESET) != 0)
+ {
+ *cp++ = '.';
+ cp = stpcpy (cp, normalized_codeset);
+ }
+ if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
+ {
+ /* This component can be part of both syntaces but has different
+ leading characters. For CEN we use `+', else `@'. */
+ *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
+ cp = stpcpy (cp, modifier);
+ }
+ if ((mask & CEN_SPECIAL) != 0)
+ {
+ *cp++ = '+';
+ cp = stpcpy (cp, special);
+ }
+ if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0)
+ {
+ *cp++ = ',';
+ if ((mask & CEN_SPONSOR) != 0)
+ cp = stpcpy (cp, sponsor);
+ if ((mask & CEN_REVISION) != 0)
+ {
+ *cp++ = '_';
+ cp = stpcpy (cp, revision);
+ }
+ }
+
+ *cp++ = '/';
+ stpcpy (cp, filename);
+
+ /* Look in list of already loaded domains whether it is already
+ available. */
+ last = NULL;
+ for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
+ if (retval->filename != NULL)
+ {
+ int compare = strcmp (retval->filename, abs_filename);
+ if (compare == 0)
+ /* We found it! */
+ break;
+ if (compare < 0)
+ {
+ /* It's not in the list. */
+ retval = NULL;
+ break;
+ }
+
+ last = retval;
+ }
+
+ if (retval != NULL || do_allocate == 0)
+ {
+ free (abs_filename);
+ return retval;
+ }
+
+ retval = (struct loaded_l10nfile *)
+ malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len)
+ * (1 << pop (mask))
+ * sizeof (struct loaded_l10nfile *)));
+ if (retval == NULL)
+ return NULL;
+
+ retval->filename = abs_filename;
+ retval->decided = (__argz_count (dirlist, dirlist_len) != 1
+ || ((mask & XPG_CODESET) != 0
+ && (mask & XPG_NORM_CODESET) != 0));
+ retval->data = NULL;
+
+ if (last == NULL)
+ {
+ retval->next = *l10nfile_list;
+ *l10nfile_list = retval;
+ }
+ else
+ {
+ retval->next = last->next;
+ last->next = retval;
+ }
+
+ entries = 0;
+ /* If the DIRLIST is a real list the RETVAL entry corresponds not to
+ a real file. So we have to use the DIRLIST separation mechanism
+ of the inner loop. */
+ cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask;
+ for (; cnt >= 0; --cnt)
+ if ((cnt & ~mask) == 0
+ && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
+ && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
+ {
+ /* Iterate over all elements of the DIRLIST. */
+ char *dir = NULL;
+
+ while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
+ != NULL)
+ retval->successor[entries++]
+ = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt,
+ language, territory, codeset,
+ normalized_codeset, modifier, special,
+ sponsor, revision, filename, 1);
+ }
+ retval->successor[entries] = NULL;
+
+ return retval;
+}
+
+/* Normalize codeset name. There is no standard for the codeset
+ names. Normalization allows the user to use any of the common
+ names. */
+const char *
+_nl_normalize_codeset (codeset, name_len)
+ const unsigned char *codeset;
+ size_t name_len;
+{
+ int len = 0;
+ int only_digit = 1;
+ char *retval;
+ char *wp;
+ size_t cnt;
+
+ for (cnt = 0; cnt < name_len; ++cnt)
+ if (isalnum (codeset[cnt]))
+ {
+ ++len;
+
+ if (isalpha (codeset[cnt]))
+ only_digit = 0;
+ }
+
+ retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
+
+ if (retval != NULL)
+ {
+ if (only_digit)
+ wp = stpcpy (retval, "iso");
+ else
+ wp = retval;
+
+ for (cnt = 0; cnt < name_len; ++cnt)
+ if (isalpha (codeset[cnt]))
+ *wp++ = tolower (codeset[cnt]);
+ else if (isdigit (codeset[cnt]))
+ *wp++ = codeset[cnt];
+
+ *wp = '\0';
+ }
+
+ return (const char *) retval;
+}
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library. So we
+ avoid the non-standard function stpcpy. In GNU C Library this
+ function is available, though. Also allow the symbol HAVE_STPCPY
+ to be defined. */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+ char *dest;
+ const char *src;
+{
+ while ((*dest++ = *src++) != '\0')
+ /* Do nothing. */ ;
+ return dest - 1;
+}
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/libgettext.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/libgettext.h
new file mode 100644
index 0000000000..3a92960ae3
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/libgettext.h
@@ -0,0 +1,182 @@
+/* Message catalogs for internationalization.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* Because on some systems (e.g. Solaris) we sometimes have to include
+ the systems libintl.h as well as this file we have more complex
+ include protection above. But the systems header might perhaps also
+ define _LIBINTL_H and therefore we have to protect the definition here. */
+
+#if !defined _LIBINTL_H || !defined _LIBGETTEXT_H
+#ifndef _LIBINTL_H
+# define _LIBINTL_H 1
+#endif
+#define _LIBGETTEXT_H 1
+
+/* We define an additional symbol to signal that we use the GNU
+ implementation of gettext. */
+#define __USE_GNU_GETTEXT 1
+
+#include <sys/types.h>
+
+#if HAVE_LOCALE_H
+# include <locale.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifndef PARAMS
+# if __STDC__ || defined __cplusplus
+# define PARAMS(args) args
+# else
+# define PARAMS(args) ()
+# endif
+#endif
+
+#ifndef NULL
+# if !defined __cplusplus || defined __GNUC__
+# define NULL ((void *) 0)
+# else
+# define NULL (0)
+# endif
+#endif
+
+#if !HAVE_LC_MESSAGES
+/* This value determines the behaviour of the gettext() and dgettext()
+ function. But some system does not have this defined. Define it
+ to a default value. */
+# define LC_MESSAGES (-1)
+#endif
+
+
+/* Declarations for gettext-using-catgets interface. Derived from
+ Jim Meyering's libintl.h. */
+struct _msg_ent
+{
+ const char *_msg;
+ int _msg_number;
+};
+
+
+#if HAVE_CATGETS
+/* These two variables are defined in the automatically by po-to-tbl.sed
+ generated file `cat-id-tbl.c'. */
+extern const struct _msg_ent _msg_tbl[];
+extern int _msg_tbl_length;
+#endif
+
+
+/* For automatical extraction of messages sometimes no real
+ translation is needed. Instead the string itself is the result. */
+#define gettext_noop(Str) (Str)
+
+/* Look up MSGID in the current default message catalog for the current
+ LC_MESSAGES locale. If not found, returns MSGID itself (the default
+ text). */
+extern char *gettext PARAMS ((const char *__msgid));
+extern char *gettext__ PARAMS ((const char *__msgid));
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+ LC_MESSAGES locale. */
+extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid));
+extern char *dgettext__ PARAMS ((const char *__domainname,
+ const char *__msgid));
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+ locale. */
+extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid,
+ int __category));
+extern char *dcgettext__ PARAMS ((const char *__domainname,
+ const char *__msgid, int __category));
+
+
+/* Set the current default message catalog to DOMAINNAME.
+ If DOMAINNAME is null, return the current default.
+ If DOMAINNAME is "", reset to the default of "messages". */
+extern char *textdomain PARAMS ((const char *__domainname));
+extern char *textdomain__ PARAMS ((const char *__domainname));
+
+/* Specify that the DOMAINNAME message catalog will be found
+ in DIRNAME rather than in the system locale data base. */
+extern char *bindtextdomain PARAMS ((const char *__domainname,
+ const char *__dirname));
+extern char *bindtextdomain__ PARAMS ((const char *__domainname,
+ const char *__dirname));
+
+#if ENABLE_NLS
+
+/* Solaris 2.3 has the gettext function but dcgettext is missing.
+ So we omit this optimization for Solaris 2.3. BTW, Solaris 2.4
+ has dcgettext. */
+# if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT)
+
+# define gettext(Msgid) \
+ dgettext (NULL, Msgid)
+
+# define dgettext(Domainname, Msgid) \
+ dcgettext (Domainname, Msgid, LC_MESSAGES)
+
+# if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7
+/* This global variable is defined in loadmsgcat.c. We need a sign,
+ whether a new catalog was loaded, which can be associated with all
+ translations. */
+extern int _nl_msg_cat_cntr;
+
+# define dcgettext(Domainname, Msgid, Category) \
+ (__extension__ \
+ ({ \
+ char *__result; \
+ if (__builtin_constant_p (Msgid)) \
+ { \
+ static char *__translation__; \
+ static int __catalog_counter__; \
+ if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \
+ { \
+ __translation__ = \
+ dcgettext__ (Domainname, Msgid, Category); \
+ __catalog_counter__ = _nl_msg_cat_cntr; \
+ } \
+ __result = __translation__; \
+ } \
+ else \
+ __result = dcgettext__ (Domainname, Msgid, Category); \
+ __result; \
+ }))
+# endif
+# endif
+
+#else
+
+# define gettext(Msgid) (Msgid)
+# define dgettext(Domainname, Msgid) (Msgid)
+# define dcgettext(Domainname, Msgid, Category) (Msgid)
+# define textdomain(Domainname) ((char *) Domainname)
+# define bindtextdomain(Domainname, Dirname) ((char *) Dirname)
+
+#endif
+
+/* @@ begin of epilog @@ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed
new file mode 100644
index 0000000000..5918e720a9
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed
@@ -0,0 +1,100 @@
+# po2msg.sed - Convert Uniforum style .po file to Linux style .msg file
+# Copyright (C) 1995 Free Software Foundation, Inc.
+# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+#
+# The first directive in the .msg should be the definition of the
+# message set number. We use always set number 1.
+#
+1 {
+ i\
+$set 1 # Automatically created by po2msg.sed
+ h
+ s/.*/0/
+ x
+}
+#
+# Mitch's old catalog format does not allow comments.
+#
+# We copy the original message as a comment into the .msg file.
+#
+/^msgid/ {
+ s/msgid[ ]*"//
+#
+# This does not work now with the new format.
+# /"$/! {
+# s/\\$//
+# s/$/ ... (more lines following)"/
+# }
+ x
+# The following nice solution is by
+# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de>
+ td
+# Increment a decimal number in pattern space.
+# First hide trailing `9' digits.
+ :d
+ s/9\(_*\)$/_\1/
+ td
+# Assure at least one digit is available.
+ s/^\(_*\)$/0\1/
+# Increment the last digit.
+ s/8\(_*\)$/9\1/
+ s/7\(_*\)$/8\1/
+ s/6\(_*\)$/7\1/
+ s/5\(_*\)$/6\1/
+ s/4\(_*\)$/5\1/
+ s/3\(_*\)$/4\1/
+ s/2\(_*\)$/3\1/
+ s/1\(_*\)$/2\1/
+ s/0\(_*\)$/1\1/
+# Convert the hidden `9' digits to `0's.
+ s/_/0/g
+ x
+ G
+ s/\(.*\)"\n\([0-9]*\)/$ #\2 Original Message:(\1)/p
+}
+#
+# The .msg file contains, other then the .po file, only the translations
+# but each given a unique ID. Starting from 1 and incrementing by 1 for
+# each message we assign them to the messages.
+# It is important that the .po file used to generate the cat-id-tbl.c file
+# (with po-to-tbl) is the same as the one used here. (At least the order
+# of declarations must not be changed.)
+#
+/^msgstr/ {
+ s/msgstr[ ]*"\(.*\)"/# \1/
+# Clear substitution flag.
+ tb
+# Append the next line.
+ :b
+ N
+# Look whether second part is continuation line.
+ s/\(.*\n\)"\(.*\)"/\1\2/
+# Yes, then branch.
+ ta
+ P
+ D
+# Note that D includes a jump to the start!!
+# We found a continuation line. But before printing insert '\'.
+ :a
+ s/\(.*\)\(\n.*\)/\1\\\2/
+ P
+# We cannot use D here.
+ s/.*\n\(.*\)/\1/
+ tb
+}
+d
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadinfo.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadinfo.h
new file mode 100644
index 0000000000..f4ebf6d811
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadinfo.h
@@ -0,0 +1,76 @@
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef PARAMS
+# if __STDC__
+# define PARAMS(args) args
+# else
+# define PARAMS(args) ()
+# endif
+#endif
+
+/* Encoding of locale name parts. */
+#define CEN_REVISION 1
+#define CEN_SPONSOR 2
+#define CEN_SPECIAL 4
+#define XPG_NORM_CODESET 8
+#define XPG_CODESET 16
+#define TERRITORY 32
+#define CEN_AUDIENCE 64
+#define XPG_MODIFIER 128
+
+#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE)
+#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER)
+
+
+struct loaded_l10nfile
+{
+ const char *filename;
+ int decided;
+
+ const void *data;
+
+ struct loaded_l10nfile *next;
+ struct loaded_l10nfile *successor[1];
+};
+
+
+extern const char *_nl_normalize_codeset PARAMS ((const unsigned char *codeset,
+ size_t name_len));
+
+extern struct loaded_l10nfile *
+_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list,
+ const char *dirlist, size_t dirlist_len, int mask,
+ const char *language, const char *territory,
+ const char *codeset,
+ const char *normalized_codeset,
+ const char *modifier, const char *special,
+ const char *sponsor, const char *revision,
+ const char *filename, int do_allocate));
+
+
+extern const char *_nl_expand_alias PARAMS ((const char *name));
+
+extern int _nl_explode_name PARAMS ((char *name, const char **language,
+ const char **modifier,
+ const char **territory,
+ const char **codeset,
+ const char **normalized_codeset,
+ const char **special,
+ const char **sponsor,
+ const char **revision));
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c
new file mode 100644
index 0000000000..515892dfb8
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c
@@ -0,0 +1,222 @@
+/* Load needed message catalogs.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP) || defined _LIBC
+# include <sys/mman.h>
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ISO C functions. This is required by the standard
+ because some ISO C functions will require linking with this object
+ file and the name space must not be polluted. */
+# define open __open
+# define close __close
+# define read __read
+# define mmap __mmap
+# define munmap __munmap
+#endif
+
+/* We need a sign, whether a new catalog was loaded, which can be associated
+ with all translations. This is important if the translations are
+ cached by one of GCC's features. */
+int _nl_msg_cat_cntr = 0;
+
+
+/* Load the message catalogs specified by FILENAME. If it is no valid
+ message catalog do nothing. */
+void
+internal_function
+_nl_load_domain (domain_file)
+ struct loaded_l10nfile *domain_file;
+{
+ int fd;
+ size_t size;
+ struct stat st;
+ struct mo_file_header *data = (struct mo_file_header *) -1;
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+ || defined _LIBC
+ int use_mmap = 0;
+#endif
+ struct loaded_domain *domain;
+
+ domain_file->decided = 1;
+ domain_file->data = NULL;
+
+ /* If the record does not represent a valid locale the FILENAME
+ might be NULL. This can happen when according to the given
+ specification the locale file name is different for XPG and CEN
+ syntax. */
+ if (domain_file->filename == NULL)
+ return;
+
+ /* Try to open the addressed file. */
+ fd = open (domain_file->filename, O_RDONLY);
+ if (fd == -1)
+ return;
+
+ /* We must know about the size of the file. */
+ if (fstat (fd, &st) != 0
+ || (size = (size_t) st.st_size) != st.st_size
+ || size < sizeof (struct mo_file_header))
+ {
+ /* Something went wrong. */
+ close (fd);
+ return;
+ }
+
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+ || defined _LIBC
+ /* Now we are ready to load the file. If mmap() is available we try
+ this first. If not available or it failed we try to load it. */
+ data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
+ MAP_PRIVATE, fd, 0);
+
+ if (data != (struct mo_file_header *) -1)
+ {
+ /* mmap() call was successful. */
+ close (fd);
+ use_mmap = 1;
+ }
+#endif
+
+ /* If the data is not yet available (i.e. mmap'ed) we try to load
+ it manually. */
+ if (data == (struct mo_file_header *) -1)
+ {
+ size_t to_read;
+ char *read_ptr;
+
+ data = (struct mo_file_header *) malloc (size);
+ if (data == NULL)
+ return;
+
+ to_read = size;
+ read_ptr = (char *) data;
+ do
+ {
+ long int nb = (long int) read (fd, read_ptr, to_read);
+ if (nb == -1)
+ {
+ close (fd);
+ return;
+ }
+
+ read_ptr += nb;
+ to_read -= nb;
+ }
+ while (to_read > 0);
+
+ close (fd);
+ }
+
+ /* Using the magic number we can test whether it really is a message
+ catalog file. */
+ if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED)
+ {
+ /* The magic number is wrong: not a message catalog file. */
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+ || defined _LIBC
+ if (use_mmap)
+ munmap ((caddr_t) data, size);
+ else
+#endif
+ free (data);
+ return;
+ }
+
+ domain_file->data
+ = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
+ if (domain_file->data == NULL)
+ return;
+
+ domain = (struct loaded_domain *) domain_file->data;
+ domain->data = (char *) data;
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+ || defined _LIBC
+ domain->use_mmap = use_mmap;
+#endif
+ domain->mmap_size = size;
+ domain->must_swap = data->magic != _MAGIC;
+
+ /* Fill in the information about the available tables. */
+ switch (W (domain->must_swap, data->revision))
+ {
+ case 0:
+ domain->nstrings = W (domain->must_swap, data->nstrings);
+ domain->orig_tab = (struct string_desc *)
+ ((char *) data + W (domain->must_swap, data->orig_tab_offset));
+ domain->trans_tab = (struct string_desc *)
+ ((char *) data + W (domain->must_swap, data->trans_tab_offset));
+ domain->hash_size = W (domain->must_swap, data->hash_tab_size);
+ domain->hash_tab = (nls_uint32 *)
+ ((char *) data + W (domain->must_swap, data->hash_tab_offset));
+ break;
+ default:
+ /* This is an illegal revision. */
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+ || defined _LIBC
+ if (use_mmap)
+ munmap ((caddr_t) data, size);
+ else
+#endif
+ free (data);
+ free (domain);
+ domain_file->data = NULL;
+ return;
+ }
+
+ /* Show that one domain is changed. This might make some cached
+ translations invalid. */
+ ++_nl_msg_cat_cntr;
+}
+
+
+#ifdef _LIBC
+void
+internal_function
+_nl_unload_domain (domain)
+ struct loaded_domain *domain;
+{
+ if (domain->use_mmap)
+ munmap ((caddr_t) domain->data, domain->mmap_size);
+ else
+ free ((void *) domain->data);
+
+ free (domain);
+}
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/localealias.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/localealias.c
new file mode 100644
index 0000000000..bca555a610
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/localealias.c
@@ -0,0 +1,424 @@
+/* Handle aliases for locale names.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# if defined HAVE_ALLOCA_H || defined _LIBC
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca
+char *alloca ();
+# endif
+# endif
+# endif
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#else
+char *getenv ();
+# ifdef HAVE_MALLOC_H
+# include <malloc.h>
+# else
+void free ();
+# endif
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+# endif
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+# define strchr index
+# endif
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions. This is required by the standard
+ because some ANSI C functions will require linking with this object
+ file and the name space must not be polluted. */
+# define strcasecmp __strcasecmp
+
+# define mempcpy __mempcpy
+# define HAVE_MEMPCPY 1
+
+/* We need locking here since we can be called from different places. */
+# include <bits/libc-lock.h>
+
+__libc_lock_define_initialized (static, lock);
+#endif
+
+
+/* For those loosing systems which don't have `alloca' we have to add
+ some additional code emulating it. */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done. */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+ void *address;
+ struct block_list *next;
+};
+# define ADD_BLOCK(list, addr) \
+ do { \
+ struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \
+ /* If we cannot get a free block we cannot add the new element to \
+ the list. */ \
+ if (newp != NULL) { \
+ newp->address = (addr); \
+ newp->next = (list); \
+ (list) = newp; \
+ } \
+ } while (0)
+# define FREE_BLOCKS(list) \
+ do { \
+ while (list != NULL) { \
+ struct block_list *old = list; \
+ list = list->next; \
+ free (old); \
+ } \
+ } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+#endif /* have alloca */
+
+
+struct alias_map
+{
+ const char *alias;
+ const char *value;
+};
+
+
+static char *string_space = NULL;
+static size_t string_space_act = 0;
+static size_t string_space_max = 0;
+static struct alias_map *map;
+static size_t nmap = 0;
+static size_t maxmap = 0;
+
+
+/* Prototypes for local functions. */
+static size_t read_alias_file PARAMS ((const char *fname, int fname_len))
+ internal_function;
+static void extend_alias_table PARAMS ((void));
+static int alias_compare PARAMS ((const struct alias_map *map1,
+ const struct alias_map *map2));
+
+
+const char *
+_nl_expand_alias (name)
+ const char *name;
+{
+ static const char *locale_alias_path = LOCALE_ALIAS_PATH;
+ struct alias_map *retval;
+ const char *result = NULL;
+ size_t added;
+
+#ifdef _LIBC
+ __libc_lock_lock (lock);
+#endif
+
+ do
+ {
+ struct alias_map item;
+
+ item.alias = name;
+
+ if (nmap > 0)
+ retval = (struct alias_map *) bsearch (&item, map, nmap,
+ sizeof (struct alias_map),
+ (int (*) PARAMS ((const void *,
+ const void *))
+ ) alias_compare);
+ else
+ retval = NULL;
+
+ /* We really found an alias. Return the value. */
+ if (retval != NULL)
+ {
+ result = retval->value;
+ break;
+ }
+
+ /* Perhaps we can find another alias file. */
+ added = 0;
+ while (added == 0 && locale_alias_path[0] != '\0')
+ {
+ const char *start;
+
+ while (locale_alias_path[0] == ':')
+ ++locale_alias_path;
+ start = locale_alias_path;
+
+ while (locale_alias_path[0] != '\0' && locale_alias_path[0] != ':')
+ ++locale_alias_path;
+
+ if (start < locale_alias_path)
+ added = read_alias_file (start, locale_alias_path - start);
+ }
+ }
+ while (added != 0);
+
+#ifdef _LIBC
+ __libc_lock_unlock (lock);
+#endif
+
+ return result;
+}
+
+
+static size_t
+internal_function
+read_alias_file (fname, fname_len)
+ const char *fname;
+ int fname_len;
+{
+#ifndef HAVE_ALLOCA
+ struct block_list *block_list = NULL;
+#endif
+ FILE *fp;
+ char *full_fname;
+ size_t added;
+ static const char aliasfile[] = "/locale.alias";
+
+ full_fname = (char *) alloca (fname_len + sizeof aliasfile);
+ ADD_BLOCK (block_list, full_fname);
+#ifdef HAVE_MEMPCPY
+ mempcpy (mempcpy (full_fname, fname, fname_len),
+ aliasfile, sizeof aliasfile);
+#else
+ memcpy (full_fname, fname, fname_len);
+ memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
+#endif
+
+ fp = fopen (full_fname, "r");
+ if (fp == NULL)
+ {
+ FREE_BLOCKS (block_list);
+ return 0;
+ }
+
+ added = 0;
+ while (!feof (fp))
+ {
+ /* It is a reasonable approach to use a fix buffer here because
+ a) we are only interested in the first two fields
+ b) these fields must be usable as file names and so must not
+ be that long
+ */
+ unsigned char buf[BUFSIZ];
+ unsigned char *alias;
+ unsigned char *value;
+ unsigned char *cp;
+
+ if (fgets (buf, sizeof buf, fp) == NULL)
+ /* EOF reached. */
+ break;
+
+ /* Possibly not the whole line fits into the buffer. Ignore
+ the rest of the line. */
+ if (strchr (buf, '\n') == NULL)
+ {
+ char altbuf[BUFSIZ];
+ do
+ if (fgets (altbuf, sizeof altbuf, fp) == NULL)
+ /* Make sure the inner loop will be left. The outer loop
+ will exit at the `feof' test. */
+ break;
+ while (strchr (altbuf, '\n') == NULL);
+ }
+
+ cp = buf;
+ /* Ignore leading white space. */
+ while (isspace (cp[0]))
+ ++cp;
+
+ /* A leading '#' signals a comment line. */
+ if (cp[0] != '\0' && cp[0] != '#')
+ {
+ alias = cp++;
+ while (cp[0] != '\0' && !isspace (cp[0]))
+ ++cp;
+ /* Terminate alias name. */
+ if (cp[0] != '\0')
+ *cp++ = '\0';
+
+ /* Now look for the beginning of the value. */
+ while (isspace (cp[0]))
+ ++cp;
+
+ if (cp[0] != '\0')
+ {
+ size_t alias_len;
+ size_t value_len;
+
+ value = cp++;
+ while (cp[0] != '\0' && !isspace (cp[0]))
+ ++cp;
+ /* Terminate value. */
+ if (cp[0] == '\n')
+ {
+ /* This has to be done to make the following test
+ for the end of line possible. We are looking for
+ the terminating '\n' which do not overwrite here. */
+ *cp++ = '\0';
+ *cp = '\n';
+ }
+ else if (cp[0] != '\0')
+ *cp++ = '\0';
+
+ if (nmap >= maxmap)
+ extend_alias_table ();
+
+ alias_len = strlen (alias) + 1;
+ value_len = strlen (value) + 1;
+
+ if (string_space_act + alias_len + value_len > string_space_max)
+ {
+ /* Increase size of memory pool. */
+ size_t new_size = (string_space_max
+ + (alias_len + value_len > 1024
+ ? alias_len + value_len : 1024));
+ char *new_pool = (char *) realloc (string_space, new_size);
+ if (new_pool == NULL)
+ {
+ FREE_BLOCKS (block_list);
+ return added;
+ }
+ string_space = new_pool;
+ string_space_max = new_size;
+ }
+
+ map[nmap].alias = memcpy (&string_space[string_space_act],
+ alias, alias_len);
+ string_space_act += alias_len;
+
+ map[nmap].value = memcpy (&string_space[string_space_act],
+ value, value_len);
+ string_space_act += value_len;
+
+ ++nmap;
+ ++added;
+ }
+ }
+ }
+
+ /* Should we test for ferror()? I think we have to silently ignore
+ errors. --drepper */
+ fclose (fp);
+
+ if (added > 0)
+ qsort (map, nmap, sizeof (struct alias_map),
+ (int (*) PARAMS ((const void *, const void *))) alias_compare);
+
+ FREE_BLOCKS (block_list);
+ return added;
+}
+
+
+static void
+extend_alias_table ()
+{
+ size_t new_size;
+ struct alias_map *new_map;
+
+ new_size = maxmap == 0 ? 100 : 2 * maxmap;
+ new_map = (struct alias_map *) realloc (map, (new_size
+ * sizeof (struct alias_map)));
+ if (new_map == NULL)
+ /* Simply don't extend: we don't have any more core. */
+ return;
+
+ map = new_map;
+ maxmap = new_size;
+}
+
+
+#ifdef _LIBC
+static void __attribute__ ((unused))
+free_mem (void)
+{
+ if (string_space != NULL)
+ free (string_space);
+ if (map != NULL)
+ free (map);
+}
+text_set_element (__libc_subfreeres, free_mem);
+#endif
+
+
+static int
+alias_compare (map1, map2)
+ const struct alias_map *map1;
+ const struct alias_map *map2;
+{
+#if defined _LIBC || defined HAVE_STRCASECMP
+ return strcasecmp (map1->alias, map2->alias);
+#else
+ const unsigned char *p1 = (const unsigned char *) map1->alias;
+ const unsigned char *p2 = (const unsigned char *) map2->alias;
+ unsigned char c1, c2;
+
+ if (p1 == p2)
+ return 0;
+
+ do
+ {
+ /* I know this seems to be odd but the tolower() function in
+ some systems libc cannot handle nonalpha characters. */
+ c1 = isupper (*p1) ? tolower (*p1) : *p1;
+ c2 = isupper (*p2) ? tolower (*p2) : *p2;
+ if (c1 == '\0')
+ break;
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ return c1 - c2;
+#endif
+}
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in
new file mode 100644
index 0000000000..b3bcca4d73
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in
@@ -0,0 +1,102 @@
+# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets
+# Copyright (C) 1995 Free Software Foundation, Inc.
+# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+1 {
+ i\
+/* Automatically generated by po2tbl.sed from @PACKAGE NAME@.pot. */\
+\
+#if HAVE_CONFIG_H\
+# include <config.h>\
+#endif\
+\
+#include "libgettext.h"\
+\
+const struct _msg_ent _msg_tbl[] = {
+ h
+ s/.*/0/
+ x
+}
+#
+# Write msgid entries in C array form.
+#
+/^msgid/ {
+ s/msgid[ ]*\(".*"\)/ {\1/
+ tb
+# Append the next line
+ :b
+ N
+# Look whether second part is continuation line.
+ s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/
+# Yes, then branch.
+ ta
+# Because we assume that the input file correctly formed the line
+# just read cannot be again be a msgid line. So it's safe to ignore
+# it.
+ s/\(.*\)\n.*/\1/
+ bc
+# We found a continuation line. But before printing insert '\'.
+ :a
+ s/\(.*\)\(\n.*\)/\1\\\2/
+ P
+# We cannot use D here.
+ s/.*\n\(.*\)/\1/
+# Some buggy seds do not clear the `successful substitution since last ``t'''
+# flag on `N', so we do a `t' here to clear it.
+ tb
+# Not reached
+ :c
+ x
+# The following nice solution is by
+# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de>
+ td
+# Increment a decimal number in pattern space.
+# First hide trailing `9' digits.
+ :d
+ s/9\(_*\)$/_\1/
+ td
+# Assure at least one digit is available.
+ s/^\(_*\)$/0\1/
+# Increment the last digit.
+ s/8\(_*\)$/9\1/
+ s/7\(_*\)$/8\1/
+ s/6\(_*\)$/7\1/
+ s/5\(_*\)$/6\1/
+ s/4\(_*\)$/5\1/
+ s/3\(_*\)$/4\1/
+ s/2\(_*\)$/3\1/
+ s/1\(_*\)$/2\1/
+ s/0\(_*\)$/1\1/
+# Convert the hidden `9' digits to `0's.
+ s/_/0/g
+ x
+ G
+ s/\(.*\)\n\([0-9]*\)/\1, \2},/
+ s/\(.*\)"$/\1/
+ p
+}
+#
+# Last line.
+#
+$ {
+ i\
+};\
+
+ g
+ s/0*\(.*\)/int _msg_tbl_length = \1;/p
+}
+d
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/textdomain.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/textdomain.c
new file mode 100644
index 0000000000..88557460f3
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/textdomain.c
@@ -0,0 +1,108 @@
+/* Implementation of the textdomain(3) function.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#if defined STDC_HEADERS || defined HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Name of the default text domain. */
+extern const char _nl_default_default_domain[];
+
+/* Default text domain in which entries for gettext(3) are to be found. */
+extern const char *_nl_current_default_domain;
+
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define TEXTDOMAIN __textdomain
+# ifndef strdup
+# define strdup(str) __strdup (str)
+# endif
+#else
+# define TEXTDOMAIN textdomain__
+#endif
+
+/* Set the current default message catalog to DOMAINNAME.
+ If DOMAINNAME is null, return the current default.
+ If DOMAINNAME is "", reset to the default of "messages". */
+char *
+TEXTDOMAIN (domainname)
+ const char *domainname;
+{
+ char *old;
+
+ /* A NULL pointer requests the current setting. */
+ if (domainname == NULL)
+ return (char *) _nl_current_default_domain;
+
+ old = (char *) _nl_current_default_domain;
+
+ /* If domain name is the null string set to default domain "messages". */
+ if (domainname[0] == '\0'
+ || strcmp (domainname, _nl_default_default_domain) == 0)
+ _nl_current_default_domain = _nl_default_default_domain;
+ else
+ {
+ /* If the following malloc fails `_nl_current_default_domain'
+ will be NULL. This value will be returned and so signals we
+ are out of core. */
+#if defined _LIBC || defined HAVE_STRDUP
+ _nl_current_default_domain = strdup (domainname);
+#else
+ size_t len = strlen (domainname) + 1;
+ char *cp = (char *) malloc (len);
+ if (cp != NULL)
+ memcpy (cp, domainname, len);
+ _nl_current_default_domain = cp;
+#endif
+ }
+
+ if (old != _nl_default_default_domain)
+ free (old);
+
+ return (char *) _nl_current_default_domain;
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__textdomain, textdomain);
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed
new file mode 100644
index 0000000000..b19c0bbd0e
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed
@@ -0,0 +1,104 @@
+# po2msg.sed - Convert Uniforum style .po file to X/Open style .msg file
+# Copyright (C) 1995 Free Software Foundation, Inc.
+# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+#
+# The first directive in the .msg should be the definition of the
+# message set number. We use always set number 1.
+#
+1 {
+ i\
+$set 1 # Automatically created by po2msg.sed
+ h
+ s/.*/0/
+ x
+}
+#
+# We copy all comments into the .msg file. Perhaps they can help.
+#
+/^#/ s/^#[ ]*/$ /p
+#
+# We copy the original message as a comment into the .msg file.
+#
+/^msgid/ {
+# Does not work now
+# /"$/! {
+# s/\\$//
+# s/$/ ... (more lines following)"/
+# }
+ s/^msgid[ ]*"\(.*\)"$/$ Original Message: \1/
+ p
+}
+#
+# The .msg file contains, other then the .po file, only the translations
+# but each given a unique ID. Starting from 1 and incrementing by 1 for
+# each message we assign them to the messages.
+# It is important that the .po file used to generate the cat-id-tbl.c file
+# (with po-to-tbl) is the same as the one used here. (At least the order
+# of declarations must not be changed.)
+#
+/^msgstr/ {
+ s/msgstr[ ]*"\(.*\)"/\1/
+ x
+# The following nice solution is by
+# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de>
+ td
+# Increment a decimal number in pattern space.
+# First hide trailing `9' digits.
+ :d
+ s/9\(_*\)$/_\1/
+ td
+# Assure at least one digit is available.
+ s/^\(_*\)$/0\1/
+# Increment the last digit.
+ s/8\(_*\)$/9\1/
+ s/7\(_*\)$/8\1/
+ s/6\(_*\)$/7\1/
+ s/5\(_*\)$/6\1/
+ s/4\(_*\)$/5\1/
+ s/3\(_*\)$/4\1/
+ s/2\(_*\)$/3\1/
+ s/1\(_*\)$/2\1/
+ s/0\(_*\)$/1\1/
+# Convert the hidden `9' digits to `0's.
+ s/_/0/g
+ x
+# Bring the line in the format `<number> <message>'
+ G
+ s/^[^\n]*$/& /
+ s/\(.*\)\n\([0-9]*\)/\2 \1/
+# Clear flag from last substitution.
+ tb
+# Append the next line.
+ :b
+ N
+# Look whether second part is a continuation line.
+ s/\(.*\n\)"\(.*\)"/\1\2/
+# Yes, then branch.
+ ta
+ P
+ D
+# Note that `D' includes a jump to the start!!
+# We found a continuation line. But before printing insert '\'.
+ :a
+ s/\(.*\)\(\n.*\)/\1\\\2/
+ P
+# We cannot use the sed command `D' here
+ s/.*\n\(.*\)/\1/
+ tb
+}
+d
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/missing b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/missing
new file mode 100755
index 0000000000..dd583709f5
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/missing
@@ -0,0 +1,336 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]"
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing 0.4 - GNU automake"
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+ aclocal*)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+ system. You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1Help2man' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
+ # We have makeinfo, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ tar)
+ shift
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ fi
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar ${1+"$@"} && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar ${1+"$@"} && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" ${1+"$@"} && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" ${1+"$@"} && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+ system. You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequirements for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/mkinstalldirs b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/mkinstalldirs
new file mode 100755
index 0000000000..a120c392de
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/mkinstalldirs
@@ -0,0 +1,101 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1.1.1 2004/12/10 13:59:00 jchoelt Exp $
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
+
+# process command line arguments
+while test $# -gt 0 ; do
+ case "${1}" in
+ -h | --help | --h* ) # -h for help
+ echo "${usage}" 1>&2; exit 0 ;;
+ -m ) # -m PERM arg
+ shift
+ test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
+ dirmode="${1}"
+ shift ;;
+ -- ) shift; break ;; # stop option processing
+ -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option
+ * ) break ;; # first non-opt arg
+ esac
+done
+
+for file
+do
+ if test -d "$file"; then
+ shift
+ else
+ break
+ fi
+done
+
+case $# in
+0) exit 0 ;;
+esac
+
+case $dirmode in
+'')
+ if mkdir -p -- . 2>/dev/null; then
+ echo "mkdir -p -- $*"
+ exec mkdir -p -- "$@"
+ fi ;;
+*)
+ if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
+ echo "mkdir -m $dirmode -p -- $*"
+ exec mkdir -m "$dirmode" -p -- "$@"
+ fi ;;
+esac
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ else
+ if test ! -z "$dirmode"; then
+ echo "chmod $dirmode $pathcomp"
+
+ lasterr=""
+ chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+ if test ! -z "$lasterr"; then
+ errstatus=$lasterr
+ fi
+ fi
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 3
+# End:
+# mkinstalldirs ends here
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/ChangeLog b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/ChangeLog
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/ChangeLog
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/Makefile.in.in b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/Makefile.in.in
new file mode 100644
index 0000000000..111b40fcbb
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/Makefile.in.in
@@ -0,0 +1,248 @@
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file file be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = $(prefix)/@DATADIRNAME@
+localedir = $(datadir)/locale
+gnulocaledir = $(prefix)/share/locale
+gettextsrcdir = $(prefix)/share/gettext/po
+subdir = po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@
+
+CC = @CC@
+GENCAT = @GENCAT@
+GMSGFMT = PATH=../src:$$PATH @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = PATH=../src:$$PATH @XGETTEXT@
+MSGMERGE = PATH=../src:$$PATH msgmerge
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I.. -I$(top_srcdir)/intl
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+SOURCES = cat-id-tbl.c
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \
+stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+INSTOBJEXT = @INSTOBJEXT@
+
+.SUFFIXES:
+.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat
+
+.c.o:
+ $(COMPILE) $<
+
+.po.pox:
+ $(MAKE) $(PACKAGE).pot
+ $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox
+
+.po.mo:
+ $(MSGFMT) -o $@ $<
+
+.po.gmo:
+ file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \
+ && rm -f $$file && $(GMSGFMT) -o $$file $<
+
+.po.cat:
+ sed -f ../intl/po2msg.sed < $< > $*.msg \
+ && rm -f $@ && $(GENCAT) $@ $*.msg
+
+
+all: all-@USE_NLS@
+
+all-yes: cat-id-tbl.c $(CATALOGS)
+all-no:
+
+$(srcdir)/$(PACKAGE).pot: $(POTFILES)
+ $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \
+ --add-comments --keyword=_ --keyword=N_ \
+ --files-from=$(srcdir)/POTFILES.in \
+ && test ! -f $(PACKAGE).po \
+ || ( rm -f $(srcdir)/$(PACKAGE).pot \
+ && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot )
+
+$(srcdir)/cat-id-tbl.c: stamp-cat-id; @:
+$(srcdir)/stamp-cat-id: $(PACKAGE).pot
+ rm -f cat-id-tbl.tmp
+ sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \
+ | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp
+ if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \
+ rm cat-id-tbl.tmp; \
+ else \
+ echo cat-id-tbl.c changed; \
+ rm -f $(srcdir)/cat-id-tbl.c; \
+ mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \
+ fi
+ cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+install-data-no: all
+install-data-yes: all
+ if test -r "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $(datadir); \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(datadir); \
+ fi
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ case "$$cat" in \
+ *.gmo) destdir=$(gnulocaledir);; \
+ *) destdir=$(localedir);; \
+ esac; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ dir=$$destdir/$$lang/LC_MESSAGES; \
+ if test -r "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $$dir; \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \
+ fi; \
+ if test -r $$cat; then \
+ $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \
+ echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \
+ fi; \
+ if test -r $$cat.m; then \
+ $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ if test -r $(srcdir)/$$cat.m ; then \
+ $(INSTALL_DATA) $(srcdir)/$$cat.m \
+ $$dir/$(PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ true; \
+ fi; \
+ fi; \
+ done
+ if test "$(PACKAGE)" = "gettext"; then \
+ if test -r "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $(gettextsrcdir); \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \
+ fi; \
+ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \
+ $(gettextsrcdir)/Makefile.in.in; \
+ else \
+ : ; \
+ fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \
+ rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \
+ rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \
+ rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \
+ done
+ rm -f $(gettextsrcdir)/po-Makefile.in.in
+
+check: all
+
+cat-id-tbl.o: ../intl/libgettext.h
+
+dvi info tags TAGS ID:
+
+mostlyclean:
+ rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp
+ rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f $(GMOFILES)
+
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: update-po $(DISTFILES)
+ dists="$(DISTFILES)"; \
+ for file in $$dists; do \
+ ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+ || cp -p $(srcdir)/$$file $(distdir); \
+ done
+
+update-po: Makefile
+ $(MAKE) $(PACKAGE).pot
+ PATH=`pwd`/../src:$$PATH; \
+ cd $(srcdir); \
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ mv $$lang.po $$lang.old.po; \
+ echo "$$lang:"; \
+ if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \
+ rm -f $$lang.old.po; \
+ else \
+ echo "msgmerge for $$cat failed!"; \
+ rm -f $$lang.po; \
+ mv $$lang.old.po $$lang.po; \
+ fi; \
+ done
+
+POTFILES: POTFILES.in
+ ( if test 'x$(srcdir)' != 'x.'; then \
+ posrcprefix='$(top_srcdir)/'; \
+ else \
+ posrcprefix="../"; \
+ fi; \
+ rm -f $@-t $@ \
+ && (sed -e '/^#/d' -e '/^[ ]*$$/d' \
+ -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \
+ | sed -e '$$s/\\$$//') > $@-t \
+ && chmod a-w $@-t \
+ && mv $@-t $@ )
+
+Makefile: Makefile.in.in ../config.status POTFILES
+ cd .. \
+ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
+ $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/POTFILES.in b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/POTFILES.in
new file mode 100644
index 0000000000..a90bb60567
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/POTFILES.in
@@ -0,0 +1,6 @@
+# List of source files containing translatable strings.
+
+gtk-gui/main.c
+gtk-gui/interface.c
+gtk-gui/callbacks.c
+gtk-gui/support.c
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c
new file mode 100644
index 0000000000..3d23a1fe1a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c
@@ -0,0 +1,25 @@
+/* Automatically generated by po2tbl.sed from goom2.pot. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libgettext.h"
+
+const struct _msg_ent _msg_tbl[] = {
+ {"", 1},
+ {"Goom Control Window", 2},
+ {"_File", 3},
+ {"Window Y-Size:", 4},
+ {"Window X-Size:", 5},
+ {"Double Pixel:", 6},
+ {"Frame Rate Limiter:", 7},
+ {"Display", 8},
+ {"TODO", 9},
+ {"Inspect", 10},
+ {"Customize", 11},
+ {"Couldn't find pixmap file: %s", 12},
+ {"Error loading pixmap file: %s", 13},
+};
+
+int _msg_tbl_length = 13;
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/goom2.pot b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/goom2.pot
new file mode 100644
index 0000000000..edcc0f13df
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/goom2.pot
@@ -0,0 +1,65 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2003-04-27 17:01+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: ENCODING\n"
+
+#: gtk-gui/interface.c:56
+msgid "Goom Control Window"
+msgstr ""
+
+#: gtk-gui/interface.c:74
+msgid "_File"
+msgstr ""
+
+#: gtk-gui/interface.c:107
+msgid "Window Y-Size:"
+msgstr ""
+
+#: gtk-gui/interface.c:154
+msgid "Window X-Size:"
+msgstr ""
+
+#: gtk-gui/interface.c:174
+msgid "Double Pixel:"
+msgstr ""
+
+#: gtk-gui/interface.c:185
+msgid "Frame Rate Limiter:"
+msgstr ""
+
+#: gtk-gui/interface.c:206
+msgid "Display"
+msgstr ""
+
+#: gtk-gui/interface.c:213 gtk-gui/interface.c:227
+msgid "TODO"
+msgstr ""
+
+#: gtk-gui/interface.c:220
+msgid "Inspect"
+msgstr ""
+
+#: gtk-gui/interface.c:234
+msgid "Customize"
+msgstr ""
+
+#: gtk-gui/support.c:121
+#, c-format
+msgid "Couldn't find pixmap file: %s"
+msgstr ""
+
+#: gtk-gui/support.c:130
+#, c-format
+msgid "Error loading pixmap file: %s"
+msgstr ""
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/stamp-cat-id b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/stamp-cat-id
new file mode 100644
index 0000000000..9788f70238
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/stamp-cat-id
@@ -0,0 +1 @@
+timestamp
diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/stamp-h.in b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/stamp-h.in
new file mode 100644
index 0000000000..9788f70238
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/stamp-h.in
@@ -0,0 +1 @@
+timestamp
diff --git a/src/visualizations/Goom/goom2k4-0/libgoom2.pc.in b/src/visualizations/Goom/goom2k4-0/libgoom2.pc.in
new file mode 100644
index 0000000000..8a3a6a6898
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/libgoom2.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libgoom2
+Version: @VERSION@
+Description: goom audio visualisation effects.
+Requires:
+Libs: -L${libdir} -lgoom2
+Cflags: -I${includedir}
+
diff --git a/src/visualizations/Goom/goom2k4-0/m4/sdl.m4 b/src/visualizations/Goom/goom2k4-0/m4/sdl.m4
new file mode 100644
index 0000000000..4c851b1e74
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/m4/sdl.m4
@@ -0,0 +1,175 @@
+# Configure paths for SDL
+# Sam Lantinga 9/21/99
+# stolen from Manish Singh
+# stolen back from Frank Belew
+# stolen from Manish Singh
+# Shamelessly stolen from Owen Taylor
+
+dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS
+dnl
+AC_DEFUN([AM_PATH_SDL2],
+[dnl
+dnl Get the cflags and libraries from the sdl-config script
+dnl
+AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)],
+ sdl_prefix="$withval", sdl_prefix="")
+AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)],
+ sdl_exec_prefix="$withval", sdl_exec_prefix="")
+AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program],
+ , enable_sdltest=yes)
+
+ if test x$sdl_exec_prefix != x ; then
+ sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix"
+ if test x${SDL_CONFIG+set} != xset ; then
+ SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config
+ fi
+ fi
+ if test x$sdl_prefix != x ; then
+ sdl_args="$sdl_args --prefix=$sdl_prefix"
+ if test x${SDL_CONFIG+set} != xset ; then
+ SDL_CONFIG=$sdl_prefix/bin/sdl-config
+ fi
+ fi
+
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ PATH="$prefix/bin:$prefix/usr/bin:$PATH"
+ AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH])
+ min_sdl_version=ifelse([$1], ,0.11.0,$1)
+ AC_MSG_CHECKING(for SDL - version >= $min_sdl_version)
+ no_sdl=""
+ if test "$SDL_CONFIG" = "no" ; then
+ no_sdl=yes
+ else
+ SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags`
+ SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs`
+
+ sdl_major_version=`$SDL_CONFIG $sdl_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+ sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+ if test "x$enable_sdltest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $SDL_CFLAGS"
+ LIBS="$LIBS $SDL_LIBS"
+dnl
+dnl Now check if the installed SDL is sufficiently new. (Also sanity
+dnl checks the results of sdl-config to some extent
+dnl
+ rm -f conf.sdltest
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "SDL.h"
+
+char*
+my_strdup (char *str)
+{
+ char *new_str;
+
+ if (str)
+ {
+ new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char));
+ strcpy (new_str, str);
+ }
+ else
+ new_str = NULL;
+
+ return new_str;
+}
+
+int main (int argc, char *argv[])
+{
+ int major, minor, micro;
+ char *tmp_version;
+
+ /* This hangs on some systems (?)
+ system ("touch conf.sdltest");
+ */
+ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); }
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = my_strdup("$min_sdl_version");
+ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+ printf("%s, bad version string\n", "$min_sdl_version");
+ exit(1);
+ }
+
+ if (($sdl_major_version > major) ||
+ (($sdl_major_version == major) && ($sdl_minor_version > minor)) ||
+ (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version);
+ printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro);
+ printf("*** best to upgrade to the required version.\n");
+ printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n");
+ printf("*** to point to the correct copy of sdl-config, and remove the file\n");
+ printf("*** config.cache before re-running configure\n");
+ return 1;
+ }
+}
+
+],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_sdl" = x ; then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ else
+ AC_MSG_RESULT(no)
+ if test "$SDL_CONFIG" = "no" ; then
+ echo "*** The sdl-config script installed by SDL could not be found"
+ echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the SDL_CONFIG environment variable to the"
+ echo "*** full path to sdl-config."
+ else
+ if test -f conf.sdltest ; then
+ :
+ else
+ echo "*** Could not run SDL test program, checking why..."
+ CFLAGS="$CFLAGS $SDL_CFLAGS"
+ LIBS="$LIBS $SDL_LIBS"
+ AC_TRY_LINK([
+#include <stdio.h>
+#include "SDL.h"
+
+int main(int argc, char *argv[])
+{ return 0; }
+#undef main
+#define main K_and_R_C_main
+], [ return 0; ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding SDL or finding the wrong"
+ echo "*** version of SDL. If it is not finding SDL, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means SDL was incorrectly installed"
+ echo "*** or that you have moved SDL since it was installed. In the latter case, you"
+ echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ SDL_CFLAGS=""
+ SDL_LIBS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(SDL_CFLAGS)
+ AC_SUBST(SDL_LIBS)
+ rm -f conf.sdltest
+])
diff --git a/src/visualizations/Goom/goom2k4-0/m4/xmms.m4 b/src/visualizations/Goom/goom2k4-0/m4/xmms.m4
new file mode 100644
index 0000000000..d221ce8d6d
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/m4/xmms.m4
@@ -0,0 +1,148 @@
+# CFLAGS and library paths for XMMS
+# written 15 December 1999 by Ben Gertzfield <che@debian.org>
+
+dnl Usage:
+dnl AM_PATH_XMMS([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl
+dnl Example:
+dnl AM_PATH_XMMS(0.9.5.1, , AC_MSG_ERROR([*** XMMS >= 0.9.5.1 not installed - please install first ***]))
+dnl
+dnl Defines XMMS_CFLAGS, XMMS_LIBS, XMMS_DATA_DIR, XMMS_PLUGIN_DIR,
+dnl XMMS_VISUALIZATION_PLUGIN_DIR, XMMS_INPUT_PLUGIN_DIR,
+dnl XMMS_OUTPUT_PLUGIN_DIR, XMMS_GENERAL_PLUGIN_DIR, XMMS_EFFECT_PLUGIN_DIR,
+dnl and XMMS_VERSION for your plugin pleasure.
+dnl
+
+dnl XMMS_TEST_VERSION(AVAILABLE-VERSION, NEEDED-VERSION [, ACTION-IF-OKAY [, ACTION-IF-NOT-OKAY]])
+AC_DEFUN(XMMS_TEST_VERSION2, [
+
+# Determine which version number is greater. Prints 2 to stdout if
+# the second number is greater, 1 if the first number is greater,
+# 0 if the numbers are equal.
+
+# Written 15 December 1999 by Ben Gertzfield <che@debian.org>
+# Revised 15 December 1999 by Jim Monty <monty@primenet.com>
+
+ AC_PROG_AWK
+ xmms_got_version=[` $AWK ' \
+BEGIN { \
+ print vercmp(ARGV[1], ARGV[2]); \
+} \
+ \
+function vercmp(ver1, ver2, ver1arr, ver2arr, \
+ ver1len, ver2len, \
+ ver1int, ver2int, len, i, p) { \
+ \
+ ver1len = split(ver1, ver1arr, /\./); \
+ ver2len = split(ver2, ver2arr, /\./); \
+ \
+ len = ver1len > ver2len ? ver1len : ver2len; \
+ \
+ for (i = 1; i <= len; i++) { \
+ p = 1000 ^ (len - i); \
+ ver1int += ver1arr[i] * p; \
+ ver2int += ver2arr[i] * p; \
+ } \
+ \
+ if (ver1int < ver2int) \
+ return 2; \
+ else if (ver1int > ver2int) \
+ return 1; \
+ else \
+ return 0; \
+}' $1 $2`]
+
+ if test $xmms_got_version -eq 2; then # failure
+ ifelse([$4], , :, $4)
+ else # success!
+ ifelse([$3], , :, $3)
+ fi
+])
+
+AC_DEFUN(AM_PATH_XMMS2,
+[
+AC_ARG_WITH(xmms-prefix,[ --with-xmms-prefix=PFX Prefix where XMMS is installed (optional)],
+ xmms_config_prefix="$withval", xmms_config_prefix="")
+AC_ARG_WITH(xmms-exec-prefix,[ --with-xmms-exec-prefix=PFX Exec prefix where XMMS is installed (optional)],
+ xmms_config_exec_prefix="$withval", xmms_config_exec_prefix="")
+
+if test x$xmms_config_exec_prefix != x; then
+ xmms_config_args="$xmms_config_args --exec-prefix=$xmms_config_exec_prefix"
+ if test x${XMMS_CONFIG+set} != xset; then
+ XMMS_CONFIG=$xmms_config_exec_prefix/bin/xmms-config
+ fi
+fi
+
+if test x$xmms_config_prefix != x; then
+ xmms_config_args="$xmms_config_args --prefix=$xmms_config_prefix"
+ if test x${XMMS_CONFIG+set} != xset; then
+ XMMS_CONFIG=$xmms_config_prefix/bin/xmms-config
+ fi
+fi
+
+AC_PATH_PROG(XMMS_CONFIG, xmms-config, no)
+min_xmms_version=ifelse([$1], ,0.9.5.1, $1)
+
+if test "$XMMS_CONFIG" = "no"; then
+ no_xmms=yes
+else
+ XMMS_CFLAGS=`$XMMS_CONFIG $xmms_config_args --cflags`
+ XMMS_LIBS=`$XMMS_CONFIG $xmms_config_args --libs`
+ XMMS_VERSION=`$XMMS_CONFIG $xmms_config_args --version`
+ XMMS_DATA_DIR=`$XMMS_CONFIG $xmms_config_args --data-dir`
+ XMMS_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --plugin-dir`
+ XMMS_VISUALIZATION_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args \
+ --visualization-plugin-dir`
+ XMMS_INPUT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --input-plugin-dir`
+ XMMS_OUTPUT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --output-plugin-dir`
+ XMMS_EFFECT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --effect-plugin-dir`
+ XMMS_GENERAL_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --general-plugin-dir`
+
+ XMMS_TEST_VERSION2($XMMS_VERSION, $min_xmms_version, ,no_xmms=version)
+fi
+
+AC_MSG_CHECKING(for XMMS - version >= $min_xmms_version)
+
+if test "x$no_xmms" = x; then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+else
+ AC_MSG_RESULT(no)
+
+ if test "$XMMS_CONFIG" = "no" ; then
+ echo "*** The xmms-config script installed by XMMS could not be found."
+ echo "*** If XMMS was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the XMMS_CONFIG environment variable to the"
+ echo "*** full path to xmms-config."
+ else
+ if test "$no_xmms" = "version"; then
+ echo "*** An old version of XMMS, $XMMS_VERSION, was found."
+ echo "*** You need a version of XMMS newer than $min_xmms_version."
+ echo "*** The latest version of XMMS is always available from"
+ echo "*** http://www.xmms.org/"
+ echo "***"
+
+ echo "*** If you have already installed a sufficiently new version, this error"
+ echo "*** probably means that the wrong copy of the xmms-config shell script is"
+ echo "*** being found. The easiest way to fix this is to remove the old version"
+ echo "*** of XMMS, but you can also set the XMMS_CONFIG environment to point to the"
+ echo "*** correct copy of xmms-config. (In this case, you will have to"
+ echo "*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf"
+ echo "*** so that the correct libraries are found at run-time)"
+ fi
+ fi
+ XMMS_CFLAGS=""
+ XMMS_LIBS=""
+ ifelse([$3], , :, [$3])
+fi
+AC_SUBST(XMMS_CFLAGS)
+AC_SUBST(XMMS_LIBS)
+AC_SUBST(XMMS_VERSION)
+AC_SUBST(XMMS_DATA_DIR)
+AC_SUBST(XMMS_PLUGIN_DIR)
+AC_SUBST(XMMS_VISUALIZATION_PLUGIN_DIR)
+AC_SUBST(XMMS_INPUT_PLUGIN_DIR)
+AC_SUBST(XMMS_OUTPUT_PLUGIN_DIR)
+AC_SUBST(XMMS_GENERAL_PLUGIN_DIR)
+AC_SUBST(XMMS_EFFECT_PLUGIN_DIR)
+])
diff --git a/src/visualizations/Goom/goom2k4-0/mac/Makefile b/src/visualizations/Goom/goom2k4-0/mac/Makefile
new file mode 100755
index 0000000000..ea5cdefb5d
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/Makefile
@@ -0,0 +1,88 @@
+# Makefile
+# author: Gyom / iOS-Software
+# Jan 2005
+
+
+###############
+# Settings
+macimage_name=iGoom
+libobjects=../src/.libs/*.o
+#buildroot=defaults read com.apple.Xcode "PBXApplicationwideBuildSettings" | cut -f2 -d"SYMROOT" | cut -f2 -d"\""
+buildroot=.
+BUNDLE=$(buildroot)/iGoom.bundle
+APP=$(buildroot)/iGoom.app
+installer=iTunes/iTunes-Installer.app
+
+
+all: $(APP) $(BUNDLE)
+
+
+###############
+# Misc library Targets
+
+# We build an embedable version of libgoom
+StandAlone/libgoom2.0.dylib:$(libobjects)
+ gcc -dynamiclib -flat_namespace -o StandAlone/libgoom2.0.dylib $(libobjects) -install_name @executable_path/../Frameworks/libgoom2.0.dylib -compatibility_version 1 -current_version 1.0 -seg1addr 0x40000 -prebind
+
+# We link static only with iTunes because the install_path
+# cannot be set properly to embed the lib in the bundle
+# We must not place it in the mac folder because the bundle will
+# link against the dynamic version if it is present
+iTunes/libgoom2.0.a:$(libobjects)
+ libtool -static -o iTunes/libgoom2.0.a $(libobjects)
+
+
+#########################
+# Standalone Application
+
+standalone:$(APP)
+
+$(APP): StandAlone/libgoom2.0.dylib Makefile
+ xcodebuild -target "iGoom - StandAlone" -buildstyle Deployment SYMROOT=$(buildroot)
+
+cleanstandalone:
+ xcodebuild clean -target "iGoom - StandAlone" -buildstyle Deployment SYMROOT=$(buildroot)
+
+
+
+###############
+# iTunes Plugin
+
+itunes:$(BUNDLE)
+
+$(BUNDLE):iTunes/libgoom2.0.a Makefile
+ xcodebuild -target "iGoom - iTunes" -buildstyle Deployment SYMROOT=$(buildroot)
+
+cleanitunes:
+ xcodebuild clean -target "iGoom - iTunes" -buildstyle Deployment SYMROOT=$(buildroot)
+
+$(installer):iTunes/Installer.applescript
+ osacompile -o $(installer) -x iTunes/Installer.applescript
+
+
+
+######################
+# Distribution Package
+
+all: $(APP) $(BUNDLE)
+
+package:$(macimage_name).dmg
+
+$(macimage_name).dmg:all ReadMe.rtf $(installer)
+ rm -rf $(macimage_name).dmg $(macimage_name)
+ mkdir -p $(macimage_name)
+ cp -r $(BUNDLE) $(macimage_name)
+ cp -r $(APP) $(macimage_name)
+ cp ReadMe.rtf $(macimage_name)
+ cp -rf $(installer) $(macimage_name)/
+ hdiutil create -srcfolder $(macimage_name) $(macimage_name).dmg
+
+
+##########
+# Clean up
+
+clean:
+ rm -rf $(BUNDLE) $(APP) $(installer)
+ rm -rf $(macimage_name).dmg $(macimage_name) $(buildroot)/iGoom.build
+ rm -f StandAlone/libgoom2.* iTunes/libgoom2.* libgoom2.*
+
diff --git a/src/visualizations/Goom/goom2k4-0/mac/ReadMe.rtf b/src/visualizations/Goom/goom2k4-0/mac/ReadMe.rtf
new file mode 100755
index 0000000000..a05598b841
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/ReadMe.rtf
@@ -0,0 +1,256 @@
+{\rtf1\mac\ansicpg10000\cocoartf102
+{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fnil\fcharset77 LucidaGrande;
+}
+{\colortbl;\red255\green255\blue255;\red255\green0\blue0;\red1\green128\blue0;\red0\green12\blue255;
+\red0\green0\blue255;\red0\green22\blue255;\red0\green0\blue0;\red0\green132\blue14;}
+\vieww15220\viewh13580\viewkind0
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\qc
+
+\f0\b\fs36 \cf0 iGoom 2k4\
+\'a9 2001/2005 iOS-Software\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0\fs24 \cf0 \
+\cf2 \
+iGoom\cf0 is a wonderful visual effect plug-in for \cf3 iTunes\cf0 for Mac OS X. A mac standalone version is now also available. This is the Mac version of Goom, originally written by Jean-Christophe Hoelt "jeko" (\cf4 \ul \ulc4 jeko@ios-software.com\cf0 \ulnone ) and ported to iTunes by Guillaume Borios "gyom" (\cf4 \ul gyom@ios-software.com\cf0 \ulnone ).\
+\
+Check for informations or updates at \cf5 \ul \ulc5 http://www.\cf4 \ul \ulc4 ios-software.com\cf5 \ul \ulc5 /?page=projet&quoi=1\cf0 \ulnone .\cf6 \ul \ulc6 \
+\cf0 \ulnone \
+\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b\fs28 \cf0 License and Warranty\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0\fs24 \cf0 \
+The iTunes plug-in and the StandAlone application are\cf7 distributed under the terms of the GNU General Public License.\
+See \cf5 http://www.gnu.org/licenses/gpl.html\cf7 .\
+\cf0 \
+\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b\fs28 \cf0 How to install\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0\fs24 \cf0 \
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b \cf0 iTunes:\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0 \cf0 Use the included install script\
+OR\
+Quit iTunes and drag the iGoom.bundle file into your "~/Library/iTunes/iTunes Plug-ins" folder. (the "~" means your home folder, the one with your user name). If any previous version of iGoom was already there, you MUST overwrite it or put it away, don't just rename.\
+\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b \cf0 Standalone:\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0 \cf0 Drag and drop the application anywhere you want on your hard drive.\
+\
+\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b\fs28 \cf0 How to use the iTunes plugin\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0\fs24 \cf0 Launch iTunes, then select iGoom in the iTunes "Visual" menu, enable the visual effects (
+\f2 \AppleTypeServicesU1 \uc0\u8984
+\f1 \AppleTypeServicesU0 +T) and play your favorite songs.\
+\
+When iGoom is activated you can click the option button in the iTunes window to get the Preference panel.\
+\
+The preferences can also be set 'live' by simply hitting the following keys :\
+\
+* \cf8 Pixel doubling\cf0 (Key : Q): when activated, iGoom calculates a half sized image and artificially doubles its size when rendering.\
+* \cf8 Sensitivity\cf0 (Keys : < to decrease and > to increase) : Use this to make iGoom match the music YOU hear.\
+* \cf8 Presets\cf0 (Keys : 0 to 9) : Presets selection (0 Blocks the current effect).\
+* \cf8 Framerate\cf0 (Key : F) : Display the frame rate.\
+* \cf8 Information display\cf0 (Key : T) : Toggle information display when iTunes is Idle.\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b\fs28 \cf0 \
+\
+Performance tips
+\f1\b0\fs24 \
+To accelerate iGoom, try these tips :\
+\'a5 Quit all other applications you don't need\
+\'a5 Enable the Quick Mode (Lower quality)\
+\'a5 Prefer the full screen mode to large windows in iTunes (full screen mode switches the resolution)\
+\'a5 Reduce the render size in iTunes (select medium size or low size in the visual menu).\
+\'a5 Buy a new Machine ;-)\
+\
+For full screen playback, I recommend at least a G4@800 (better with G4 or G5 and higher clock rates of course). Please note that iGoom can't use a lot of 3D acceleration and is not easily optimizable with Velocity Engine. \cf2 A fast CPU with lots of cache is the key.\cf0 \
+\
+\
+
+\f0\b\fs28 Known bugs / Things to do\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0\fs24 \cf0 Try to make it even faster (But don't expect too much now...),\
+Add new effects,\
+Finish the scripting system,\
+Enhance the functionalities of the standalone application.\
+\
+\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b\fs28 \cf0 Version history
+\f1\b0\fs24 \
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b \cf0 \
+2k4 ~ January 2005\
+\'a5
+\f1\b0 In sync with the final Goom 2k4\
+\'a5 The StandAlone version is available.\
+\'a5 The source tree is back to the sourceforge cvs and mac compatible.
+\f0\b \
+\
+2k4 dev 14 ~ March 2004\
+\'a5
+\f1\b0 Added the scripting system into the core (not yet scriptable without recompilation).
+\f0\b \
+\
+2k4 dev 8 ~ February 2004\
+\'a5
+\f1\b0 Added G5 optimizations.
+\f0\b \
+\'a5
+\f1\b0 Caught a crashing bug in the PowerPC render.\
+
+\f0\b \'a5
+\f1\b0 Added luminosity post-processing.
+\f0\b \
+\'a5
+\f1\b0 Rewrote the transformation computation to make it independent from the resolution.\
+
+\f0\b \'a5
+\f1\b0 A new fireworks effect.
+\f0\b \
+\'a5
+\f1\b0 Lots of internal modifications to prepare future features.
+\f0\b \
+\'a5
+\f1\b0 Many little optimizations.
+\f0\b \
+\
+1.99.5 ~ January 7th 2003\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0 \cf0 \'a5 Information display can now be set on and off using the key T or the preference panel. Since many users seem to find it annoying, this feature is off by default.\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b \cf0 \
+1.99.4 ~ January 6th 2003\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0 \cf0 \'a5 Not faster but does more than before.\
+\'a5 Smoother animations.\
+\'a5 Nice text display with cool font and effect.\
+\'a5 New "tentacle" line effect.\
+\'a5 New zooms.\
+\'a5 Resize crashing bug hopefully corrected.\
+\'a5 Tuned many effects.\
+\'a5 Preferences window modified.\
+\'a5 iGoom now uses its own preference file instead of parasiting the iTune's one. \
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b \cf0 \
+1.9Dev5 ~ July 21st 2002\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0 \cf0 \'a5 Dynamic transitions between transforms.\
+\'a5 Dynamic lines effects transitions with new colors.\
+\'a5 1 new transform.\
+\'a5 Assembly routines rewritten but G4 optimisations disabled.\
+\'a5 Tuned many effects.\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b \cf0 \
+1.7.8 ~ April 12th 2002\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0 \cf0 \'a5 Added a tuned version of the fabulous ifs effect.\
+(Copyright (c) 1997 by Massimino Pascal <Pascal.Massimon@ens.fr>).\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b \cf0 \
+1.7.7 ~ April 5th 2002\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0 \cf0 \'a5 Little speed bump (+8%) on G3\
+(Improved the G3 assembly code, lend me a G4 and I'll do it for Altivec too!)\
+\'a5 Finally caught the crashing lines bug.\
+\'a5 Enabled the original lines effects again.\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b \cf0 \
+1.7.6 ~ March 15th 2002\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0 \cf0 \'a5 In sync with goom 1.7.6,\
+\'a5 Now retains the quality mode.\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b \cf0 \
+1.7.5a3 ~ Not released\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0 \cf0 \'a5 Big speed bump on Smooth Mode (full quality) of about 30%.\
+\'a5 Little speed bump on Quick Mode (doubled pixels) of about 5%.\
+\'a5 Minor speed bump for G3 users.\
+\'a5 Added graphic visualization of setup (not available on fullscreen smooth mode).\
+\'a5 Added sensitivity setup.\
+\'a5 Tuned the moving pixels filter.\
+\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b \cf0 1.7.4 ~ November 8th 2001\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f1\b0 \cf0 \'a5 Pixel doubling mode is now the default.\
+\'a5 Better default parameters.\
+\'a5 Accelerated the full quality mode by about 8%\
+\'a5 Added that nice (?) purple circle in the centre.\
+\'a5 Code clean-up (1.7.0 - 180kb -> 1.7.4 - 72kb)\
+\'a5 Version number corrected again (should be good this time)\
+\'a5 The random resizing crashes seem to be corrected by the code clean up.\
+\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
+
+\f0\b \cf0 1.7.3 ~ July 26th 2001
+\f1\b0 \
+\'a5 The 1.7.2 archive was broken for G3, corrected the archive\
+\
+
+\f0\b 1.7.2 ~ July 26th 2001
+\f1\b0 \
+\'a5 Now detects if Altivec (Velocity Engine) is present or not and enables a new G4 assembly zoom routine whenever possible. This makes it about 30% faster than before on G4 CPUs.\
+\'a5 Corrected a bug that would make the render go weird with odd horizontal resolutions and pixel doubling enabled.\
+\'a5 G3 Assembly acceleration rewritten for easier Altivec integration (No speed loss).\
+\'a5 Core goom code cleaned up to make possible Altivec accelerations (better data alignment and misc details). This make the G3 version a bit faster too and should accelerate future releases for other platforms.\
+\'a5 Corrected the bundle version number\
+\
+
+\f0\b 1.7.1 ~ July 19th 2001
+\f1\b0 \
+\'a5 Added a PowerPC assembly routine instead of pure C to execute the critical part of the zoom (just like on MMX processors). We gain about 50% more Frame Per Second !\
+\
+
+\f0\b 1.7.0 ~ July 17th 2001
+\f1\b0 \
+\'a5 In sync with Goom 1.7 (with some new effects available).\
+\'a5 Code clean up.\
+\'a5 Rendering functions (both normal and pixel doubling) rewritten for speed concerns.\
+\
+
+\f0\b 1.6.1 ~ July 14th 2001
+\f1\b0 \
+\'a5 Pixel doubling bug corrected.\
+\
+
+\f0\b 1.6.0 ~ July 11th 2001
+\f1\b0 \
+\'a5 Initial release, in sync with Goom 1.6 for XMMS.} \ No newline at end of file
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.h
new file mode 100755
index 0000000000..eae2594220
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.h
@@ -0,0 +1,38 @@
+#import <Cocoa/Cocoa.h>
+
+#import "Goom.h"
+
+#import "MainOpenGLView.h"
+
+@interface AppController : NSResponder
+{
+ // Views
+ IBOutlet NSWindow * PrefWin;
+ IBOutlet NSTabView * TabView;
+
+ IBOutlet MainOpenGLView * GLView;
+
+ IBOutlet NSButton * HQButton;
+ IBOutlet NSTextField * QEWarning;
+ IBOutlet NSTextField * FPSCounter;
+
+ // Model
+ BOOL isAnimating;
+ NSTimer *animationTimer;
+ CFAbsoluteTime timeBefore;
+
+ BOOL stayInFullScreenMode;
+ NSOpenGLContext *fullScreenContext;
+
+ IBOutlet Goom * myGoom;
+ float FrameRate;
+ float lastFPS;
+ AbsoluteTime backUpTime;
+}
+
+- (IBAction) goFullScreen:(id)sender;
+- (IBAction) setHighQuality:(id)sender;
+- (IBAction) setFrameRate:(id)sender;
+- (BOOL) isInFullScreenMode;
+
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.m
new file mode 100755
index 0000000000..9f3d8964d6
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.m
@@ -0,0 +1,438 @@
+#import "AppController.h"
+#import "GoomFXView.h"
+#include "src/goom.h"
+
+#import <OpenGL/OpenGL.h>
+
+@interface AppController (AnimationMethods)
+- (BOOL) isAnimating;
+- (void) startAnimation;
+- (void) stopAnimation;
+- (void) toggleAnimation;
+
+- (void) startAnimationTimer;
+- (void) stopAnimationTimer;
+- (void) animationTimerFired:(NSTimer *)timer;
+@end
+
+static float HowLong(AbsoluteTime * backUpTime)
+{
+ AbsoluteTime absTime;
+ Nanoseconds nanosec;
+
+ absTime = SubAbsoluteFromAbsolute(UpTime(), *backUpTime);
+ nanosec = AbsoluteToNanoseconds(absTime);
+ //fprintf(stderr,"Time : %f\n", (float) UnsignedWideToUInt64( nanosec ) / 1000000000.0);
+ //fprintf(stderr,"FPS : %f\n", (float) 1000000000.0f/UnsignedWideToUInt64( nanosec ));
+ *backUpTime = UpTime();
+ return (float) (1000000000.0f/UnsignedWideToUInt64( nanosec ));
+}
+
+static void logGLError(int line)
+{
+ GLenum err = glGetError();
+ char * code;
+
+ if (err == GL_NO_ERROR) return;
+
+ switch (err)
+ {
+ case GL_INVALID_ENUM:
+ code = "GL_INVALID_ENUM";
+ break;
+ case GL_INVALID_VALUE:
+ code = "GL_INVALID_VALUE";
+ break;
+ case GL_INVALID_OPERATION:
+ code = "GL_INVALID_OPERATION";
+ break;
+ case GL_STACK_OVERFLOW:
+ code = "GL_STACK_OVERFLOW";
+ break;
+ case GL_STACK_UNDERFLOW:
+ code = "GL_STACK_UNDERFLOW";
+ break;
+ case GL_OUT_OF_MEMORY:
+ code = "GL_OUT_OF_MEMORY";
+ break;
+ default:
+ code = "Unknown Error";
+ break;
+ }
+ fprintf(stderr,"iGoom OpenGL error : %s", code);
+
+}
+
+@implementation AppController
+
+-(void) awakeFromNib
+{
+ PluginInfo * goomInfos;
+ int i;
+
+ goomInfos = [myGoom infos];
+
+ for (i=0; i < goomInfos->nbParams; i++)
+ {
+ NSTabViewItem * item = [[[NSTabViewItem alloc] initWithIdentifier:nil] autorelease];
+ [item setLabel:[NSString stringWithCString:goomInfos->params[i].name]];
+ [item setView:[[[GoomFXView alloc] initWithFrame:[TabView contentRect] andFX:goomInfos->params[i]] autorelease]];
+ [TabView addTabViewItem:item];
+
+ // Create and load textures for the first time
+ //[GLView loadTextures:GL_TRUE];
+ }
+
+ //[self goFullScreen:self];
+ isAnimating = NO;
+ lastFPS = 0.0f;
+ backUpTime=UpTime();
+ FrameRate = 0.028f; // ~35 FPS
+
+ if ([GLView canBeHQ])
+ {
+ [HQButton setEnabled:YES];
+ [QEWarning removeFromSuperview];
+ }
+
+ [self startAnimation];
+}
+
+
+// Action method wired up to fire when the user clicks the "Go FullScreen" button. We remain in this method until the user exits FullScreen mode.
+- (IBAction) goFullScreen:(id)sender
+{
+ CFAbsoluteTime timeNow;
+ CGLContextObj cglContext;
+ CGDisplayErr err;
+ long oldSwapInterval;
+ long newSwapInterval;
+ BOOL plugrunning = YES;
+ long rendererID;
+
+ // Pixel Format Attributes for the FullScreen NSOpenGLContext
+ NSOpenGLPixelFormatAttribute attrs[] = {
+
+ // Specify that we want a full-screen OpenGL context.
+ NSOpenGLPFAFullScreen,
+
+ // We may be on a multi-display system (and each screen may be driven by a different renderer),
+ // so we need to specify which screen we want to take over.
+ // For this demo, we'll specify the main screen.
+ NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay),
+
+ // Attributes Common to FullScreen and non-FullScreen
+ NSOpenGLPFAColorSize, 24,
+ NSOpenGLPFADepthSize, 16,
+ NSOpenGLPFADoubleBuffer,
+ NSOpenGLPFAAccelerated,
+ 0
+ };
+
+ // Create the FullScreen NSOpenGLContext with the attributes listed above.
+ NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
+ if (pixelFormat == nil) {
+ NSLog(@"Failed to create 1st pixelFormat, trying another format...");
+ NSOpenGLPixelFormatAttribute attrs2[] = {
+ NSOpenGLPFAFullScreen,
+ NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay),
+ 0
+ };
+
+ // Create the FullScreen NSOpenGLContext with the attributes listed above.
+ NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs2];
+ if (pixelFormat == nil) {
+ NSLog(@"Failed to create 2nd pixelFormat, canceling full screen mode.");
+ return;
+ }
+ }
+
+ // Just as a diagnostic, report the renderer ID that this pixel format binds to.
+ // CGLRenderers.h contains a list of known renderers and their corresponding RendererID codes.
+ [pixelFormat getValues:&rendererID forAttribute:NSOpenGLPFARendererID forVirtualScreen:0];
+
+ // Create an NSOpenGLContext with the FullScreen pixel format.
+ // By specifying the non-FullScreen context as our "shareContext",
+ // we automatically inherit all of the textures, display lists, and other OpenGL objects it has defined.
+ fullScreenContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:[GLView openGLContext]];
+ [pixelFormat release];
+ pixelFormat = nil;
+
+ if (fullScreenContext == nil) {
+ NSLog(@"Failed to create fullScreenContext");
+ return;
+ }
+
+ // Pause animation in the OpenGL view.
+ // While we're in full-screen mode, we'll drive the animation actively instead of using a timer callback.
+ if ([self isAnimating]) {
+ [self stopAnimationTimer];
+ }
+
+ // Take control of the display where we're about to go FullScreen.
+ err = CGCaptureAllDisplays();
+ if (err != CGDisplayNoErr) {
+ [fullScreenContext release];
+ fullScreenContext = nil;
+ return;
+ }
+
+ // Enter FullScreen mode and make our FullScreen context the active context for OpenGL commands.
+ [fullScreenContext setFullScreen];
+ [fullScreenContext makeCurrentContext];
+
+ // Save the current swap interval so we can restore it later, and then set the new swap interval to lock us to the display's refresh rate.
+ cglContext = CGLGetCurrentContext();
+ CGLGetParameter(cglContext, kCGLCPSwapInterval, &oldSwapInterval);
+ newSwapInterval = 1;
+ CGLSetParameter(cglContext, kCGLCPSwapInterval, &newSwapInterval);
+
+ // Tell the myGoom the dimensions of the area it's going to render to, so it can set up an appropriate viewport and viewing transformation.
+ [myGoom setSize:NSMakeSize(CGDisplayPixelsWide(kCGDirectMainDisplay), CGDisplayPixelsHigh(kCGDirectMainDisplay))];
+
+ // Now that we've got the screen, we enter a loop in which we alternately process input events and computer and render the next frame of our animation. The shift here is from a model in which we passively receive events handed to us by the AppKit to one in which we are actively driving event processing.
+ timeBefore = CFAbsoluteTimeGetCurrent();
+ stayInFullScreenMode = YES;
+ while (stayInFullScreenMode) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ // Check for and process input events.
+ NSEvent *event;
+ while (event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES]) {
+ switch ([event type]) {
+ case NSLeftMouseDown:
+ [self mouseDown:event];
+ break;
+
+ case NSLeftMouseUp:
+ plugrunning = plugrunning?NO:YES;
+ [self mouseUp:event];
+ break;
+
+ case NSRightMouseUp:
+ plugrunning = plugrunning?NO:YES;
+ break;
+
+ case NSLeftMouseDragged:
+ [self mouseDragged:event];
+ break;
+
+ case NSKeyDown:
+ [self keyDown:event];
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ // Render a frame, and swap the front and back buffers.
+ timeNow = CFAbsoluteTimeGetCurrent();
+ if ((timeNow-timeBefore) >= FrameRate)
+ {
+ timeBefore = timeNow;
+ if (plugrunning==YES) {
+ [myGoom render];
+ [fullScreenContext flushBuffer];
+ }
+ }
+
+
+ // Clean up any autoreleased objects that were created this time through the loop.
+ [pool release];
+ }
+
+ // Clear the front and back framebuffers before switching out of FullScreen mode. (This is not strictly necessary, but avoids an untidy flash of garbage.)
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+ [fullScreenContext flushBuffer];
+ glClear(GL_COLOR_BUFFER_BIT);
+ [fullScreenContext flushBuffer];
+
+ // Restore the previously set swap interval.
+ CGLSetParameter(cglContext, kCGLCPSwapInterval, &oldSwapInterval);
+
+ // Exit fullscreen mode and release our FullScreen NSOpenGLContext.
+ [NSOpenGLContext clearCurrentContext];
+ [fullScreenContext clearDrawable];
+ [fullScreenContext release];
+ fullScreenContext = nil;
+
+ // Release control of the display.
+ CGReleaseAllDisplays();
+
+ // Reset the size to the window size
+ [myGoom setSize:[GLView frame].size];
+
+ // Mark our view as needing drawing. (The animation has advanced while we were in FullScreen mode, so its current contents are stale.)
+ [GLView setNeedsDisplay:YES];
+
+ // Resume animation timer firings.
+ if ([self isAnimating]) {
+ [self startAnimationTimer];
+ }
+}
+
+- (IBAction) setHighQuality:(id)sender
+{
+ [myGoom setHighQuality:([sender state]==NSOnState)];
+}
+
+- (IBAction) setFrameRate:(id)sender
+{
+ FrameRate = 1.0f/[sender floatValue];
+ [self stopAnimation];
+ [self startAnimation];
+}
+
+- (void) keyDown:(NSEvent *)event
+{
+ unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0];
+ switch (c) {
+
+ // [Esc] exits FullScreen mode.
+ case 27:
+ stayInFullScreenMode = NO;
+ break;
+
+ // [space] toggles rotation of the globe.
+ case 32:
+ [self toggleAnimation];
+ break;
+
+ case 'l':
+ case 'L':
+ [myGoom setHighQuality:NO];
+ break;
+
+ case 'h':
+ case 'H':
+ [myGoom setHighQuality:YES];
+ break;
+
+ default:
+ break;
+ }
+}
+/*
+- (void)mouseDown:(NSEvent *)theEvent
+{
+ BOOL wasAnimating = [self isAnimating];
+ BOOL dragging = YES;
+ NSPoint windowPoint;
+ NSPoint lastWindowPoint = [theEvent locationInWindow];
+ float dx, dy;
+
+ if (wasAnimating) {
+ [self stopAnimation];
+ }
+ while (dragging) {
+ theEvent = [[GLView window] nextEventMatchingMask:NSLeftMouseUpMask | NSLeftMouseDraggedMask];
+ windowPoint = [theEvent locationInWindow];
+ switch ([theEvent type]) {
+ case NSLeftMouseUp:
+ dragging = NO;
+ break;
+
+ case NSLeftMouseDragged:
+ dx = windowPoint.x - lastWindowPoint.x;
+ dy = windowPoint.y - lastWindowPoint.y;
+ lastWindowPoint = windowPoint;
+
+ // Render a frame.
+ if (fullScreenContext) {
+ [myGoom render];
+ [fullScreenContext flushBuffer];
+ } else {
+ [GLView display];
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ if (wasAnimating) {
+ [self startAnimation];
+ timeBefore = CFAbsoluteTimeGetCurrent();
+ }
+}
+*/
+- (BOOL) isInFullScreenMode
+{
+ return fullScreenContext != nil;
+}
+
+@end
+
+@implementation AppController (AnimationMethods)
+
+- (BOOL) isAnimating
+{
+ return isAnimating;
+}
+
+- (void) startAnimation
+{
+ if (!isAnimating) {
+ isAnimating = YES;
+ if (![self isInFullScreenMode])
+ {
+ [self startAnimationTimer];
+ }
+ }
+}
+
+- (void) stopAnimation
+{
+ if (isAnimating) {
+ if (animationTimer != nil) {
+ [self stopAnimationTimer];
+ }
+ isAnimating = NO;
+ }
+}
+
+- (void) toggleAnimation
+{
+ if ([self isAnimating]) [self stopAnimation];
+ else [self startAnimation];
+}
+
+- (void) startAnimationTimer
+{
+ if (animationTimer == nil) {
+ animationTimer = [[NSTimer scheduledTimerWithTimeInterval:FrameRate target:self selector:@selector(animationTimerFired:) userInfo:nil repeats:YES] retain];
+ }
+}
+
+- (void) stopAnimationTimer
+{
+ if (animationTimer != nil) {
+ [animationTimer invalidate];
+ [animationTimer release];
+ animationTimer = nil;
+ }
+}
+
+- (void) animationTimerFired:(NSTimer *)timer
+{
+ lastFPS = (HowLong(&backUpTime) + lastFPS) * 0.5f;
+ [FPSCounter setStringValue:[NSString stringWithFormat:@"%d/%d FPS",(int)lastFPS,(int)(1.0f/FrameRate)]];
+ [GLView setNeedsDisplay:YES];
+}
+
+// TAB VIEW DELEGATE
+- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
+{
+ NSRect frame = [PrefWin frame];
+ float height;
+ if(![[tabViewItem identifier] isEqual:@"maintab"]) height = ((GoomFXView*)[tabViewItem view])->height;
+ else height = 356.0f;
+ height += 20.0f;
+ frame.origin.y -= height-frame.size.height;
+ frame.size.height = height;
+ [PrefWin setFrame:frame display:YES animate:YES];
+}
+
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp
new file mode 100644
index 0000000000..d37b6e9dae
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp
@@ -0,0 +1,126 @@
+/*
+ * CoreAudioDevice.cpp
+ * iGoom
+ *
+ * Created by Guillaume Borios on 14/01/05.
+ * Copyright 2005 iOS Software. All rights reserved.
+ *
+ */
+
+#include "CoreAudioDevice.h"
+
+
+CoreAudioDevice::CoreAudioDevice(AudioDeviceID devId):deviceID(devId) {}
+
+CoreAudioDevice::~CoreAudioDevice() {}
+
+
+CFStringRef CoreAudioDevice::name() const
+{
+ CFStringRef nom;
+ try
+ {
+ UInt32 size = sizeof(CFStringRef);
+ propertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyDeviceNameCFString, size, &nom);
+ }
+ catch(...)
+ {
+ nom = CFSTR("");
+ }
+ return nom;
+}
+
+UInt32 CoreAudioDevice::propertyDataSize(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property) const
+{
+ UInt32 size = 0;
+ if (AudioDeviceGetPropertyInfo(deviceID, channel, section, property, &size, NULL) != 0)
+ {
+ fprintf(stderr,"Error while fetching audio device property size. Exiting.");
+ exit(0);
+ }
+ return size;
+}
+
+void CoreAudioDevice::propertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 &size, void* data) const
+{
+ AudioDeviceGetProperty(deviceID, channel, section, property, &size, data) != 0;
+}
+
+void CoreAudioDevice::setPropertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 inDataSize, const void* data)
+{
+ OSStatus theError = AudioDeviceSetProperty(deviceID, NULL, channel, section, property, inDataSize, data);
+ //if (theError) fprintf(stderr,"Error");
+}
+
+UInt32 CoreAudioDevice::numberOfChannels(CoreAudioDeviceSection section) const
+{
+ UInt32 n = 0;
+ UInt32 size = propertyDataSize(0, section, kAudioDevicePropertyStreamConfiguration);
+ AudioBufferList* bufList=(AudioBufferList*)malloc(size);
+
+ propertyData(0, section, kAudioDevicePropertyStreamConfiguration, size, bufList);
+ for(UInt32 i = 0; i < bufList->mNumberBuffers; ++i)
+ {
+ n += bufList->mBuffers[i].mNumberChannels;
+ }
+ free(bufList);
+ return n;
+}
+
+pid_t CoreAudioDevice::hogModeOwner() const
+{
+ pid_t retour = 0;
+ UInt32 size = sizeof(pid_t);
+ propertyData(0, kAudioDeviceSectionInput, kAudioDevicePropertyHogMode, size, &retour);
+ return retour;
+}
+
+
+void CoreAudioDevice::AddPropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc, void* inClientData)
+{
+ if (AudioDeviceAddPropertyListener(deviceID, inChannel, inSection, inPropertyID, inListenerProc, inClientData) != 0)
+ {
+ fprintf(stderr,"Error while Installing device notifications listener. Exiting.");
+ exit(0);
+ }
+}
+
+void CoreAudioDevice::RemovePropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc)
+{
+ if (AudioDeviceRemovePropertyListener(deviceID, inChannel, inSection, inPropertyID, inListenerProc) !=0)
+ {
+ //fprintf(stderr,"Error while Removing device notifications listener. Exiting.");
+ //exit(0);
+ }
+}
+
+// *************************************** VOLUME CONTROL ***************************************
+
+bool CoreAudioDevice::HasVolumeControl(UInt32 channel, CoreAudioDeviceSection section) const
+{
+ OSStatus theError = AudioDeviceGetPropertyInfo(deviceID, channel, section, kAudioDevicePropertyVolumeScalar, NULL, NULL);
+ return (theError == 0);
+}
+
+bool CoreAudioDevice::VolumeControlIsSettable(UInt32 channel, CoreAudioDeviceSection section) const
+{
+ Boolean isWritable = false;
+ OSStatus theError = AudioDeviceGetPropertyInfo(deviceID, channel, section, kAudioDevicePropertyVolumeScalar, NULL, &isWritable);
+ return (isWritable != 0);
+}
+
+Float32 CoreAudioDevice::GetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section) const
+{
+ Float32 value = 0.0;
+ UInt32 size = sizeof(Float32);
+ propertyData(channel, section, kAudioDevicePropertyVolumeScalar, size, &value);
+ return value;
+}
+
+void CoreAudioDevice::SetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section, Float32 value)
+{
+ UInt32 size = sizeof(Float32);
+ setPropertyData(channel, section, kAudioDevicePropertyVolumeScalar, size, &value);
+}
+
+
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.h
new file mode 100644
index 0000000000..1e8576580b
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.h
@@ -0,0 +1,53 @@
+/*
+ * CoreAudioDevice.h
+ * iGoom
+ *
+ * Created by Guillaume Borios on 14/01/05.
+ * Copyright 2005 iOS Software. All rights reserved.
+ *
+ */
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <CoreAudio/CoreAudio.h>
+
+#ifndef COREAUDIODEVICE
+#define COREAUDIODEVICE
+
+typedef UInt8 CoreAudioDeviceSection;
+#define kAudioDeviceSectionInput ((CoreAudioDeviceSection)0x01)
+#define kAudioDeviceSectionOutput ((CoreAudioDeviceSection)0x00)
+#define kAudioDeviceSectionGlobal ((CoreAudioDeviceSection)0x00)
+#define kAudioDeviceSectionWildcard ((CoreAudioDeviceSection)0xFF)
+
+class CoreAudioDevice
+{
+
+public:
+ CoreAudioDevice(AudioDeviceID devId);
+ ~CoreAudioDevice();
+
+ AudioDeviceID getDeviceID() const { return deviceID; }
+ CFStringRef name() const;
+
+ UInt32 propertyDataSize(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property) const;
+ void propertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 &size, void* data) const;
+ void setPropertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 inDataSize, const void* data);
+
+ UInt32 numberOfChannels(CoreAudioDeviceSection section) const;
+
+ pid_t hogModeOwner() const;
+
+ void AddPropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc, void* inClientData);
+ void RemovePropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc);
+
+ bool CoreAudioDevice::HasVolumeControl(UInt32 channel, CoreAudioDeviceSection section) const;
+ bool CoreAudioDevice::VolumeControlIsSettable(UInt32 channel, CoreAudioDeviceSection section) const;
+ Float32 CoreAudioDevice::GetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section) const;
+ void CoreAudioDevice::SetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section, Float32 value);
+
+private:
+ AudioDeviceID deviceID;
+};
+
+
+#endif /* COREAUDIODEVICE */ \ No newline at end of file
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp
new file mode 100644
index 0000000000..cd9c27673d
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp
@@ -0,0 +1,70 @@
+/*
+ * CoreAudioHardware.cpp
+ * iGoom
+ *
+ * Created by Guillaume Borios on 14/01/05.
+ * Copyright 2005 iOS Software. All rights reserved.
+ *
+ */
+
+#include "CoreAudioHardware.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+UInt32 CoreAudioHardware::numberOfDevices()
+{
+ return ( propertyDataSize(kAudioHardwarePropertyDevices) / sizeof(AudioDeviceID) );
+}
+
+AudioDeviceID CoreAudioHardware::deviceAtIndex(unsigned int i)
+{
+ AudioDeviceID devID = 0;
+ int n = numberOfDevices();
+ if((n > 0) && (i < n))
+ {
+ UInt32 size = n * sizeof(AudioDeviceID);
+ AudioDeviceID * list = (AudioDeviceID *)malloc(size);
+ propertyData(kAudioHardwarePropertyDevices, size, list);
+ devID = list[i];
+ free(list);
+ }
+ return devID;
+}
+
+UInt32 CoreAudioHardware::propertyDataSize(AudioHardwarePropertyID property)
+{
+ UInt32 size = 0;
+ if (AudioHardwareGetPropertyInfo(property, &size, NULL) != 0)
+ {
+ fprintf(stderr,"Error while fetching audio property size. Exiting.");
+ exit(0);
+ }
+ return size;
+}
+
+void CoreAudioHardware::propertyData(AudioHardwarePropertyID property, UInt32 &size, void *data)
+{
+ if (AudioHardwareGetProperty(property, &size, data) != 0)
+ {
+ fprintf(stderr,"Error while fetching audio property. Exiting.");
+ exit(0);
+ }
+}
+
+void CoreAudioHardware::AddPropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc proc, void* data)
+{
+ if (AudioHardwareAddPropertyListener(property, proc, data)!= 0)
+ {
+ fprintf(stderr,"Error could not add a property listener. Exiting.");
+ exit(0);
+ }
+}
+
+void CoreAudioHardware::RemovePropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc proc)
+{
+ if (AudioHardwareRemovePropertyListener(property, proc)!= 0)
+ {
+ fprintf(stderr,"Error could not remove a property listener. Exiting.");
+ exit(0);
+ }
+}
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.h
new file mode 100644
index 0000000000..6aa451d1d7
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.h
@@ -0,0 +1,29 @@
+/*
+ * CoreAudioHardware.h
+ * iGoom
+ *
+ * Created by Guillaume Borios on 14/01/05.
+ * Copyright 2005 iOS Software. All rights reserved.
+ *
+ */
+
+#include <CoreAudio/CoreAudio.h>
+
+
+#ifndef COREAUDIOHARDWARE
+#define COREAUDIOHARDWARE
+
+class CoreAudioHardware
+{
+public:
+ static UInt32 numberOfDevices();
+ static AudioDeviceID deviceAtIndex(unsigned int i);
+public:
+ static UInt32 propertyDataSize(AudioHardwarePropertyID property);
+ static void propertyData(AudioHardwarePropertyID property, UInt32 &size, void *data);
+ static void AddPropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc listenerProc, void* inClientData);
+ static void RemovePropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc listenerProc);
+
+};
+
+#endif /*COREAUDIOHARDWARE*/
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings
new file mode 100755
index 0000000000..ec736bd74a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings
@@ -0,0 +1,7 @@
+/* Localized versions of Info.plist keys */
+
+CFBundleName = "iGoom";
+CFBundleShortVersionString = "2.0";
+CFBundleGetInfoString = "iGoom version 2.0, Copyright 2001~2005, iOS-Software.\nhttp://www.ios-software.com/";
+NSHumanReadableCopyright = "Copyright 2001~2005, iOS-Software.\nhttp://www.ios-software.com/";
+CFBundleVersion = "2.0";
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib
new file mode 100755
index 0000000000..2ea29a9a5a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib
@@ -0,0 +1,44 @@
+{
+ IBClasses = (
+ {
+ ACTIONS = {goFullScreen = id; setFrameRate = id; setHighQuality = id; };
+ CLASS = AppController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ FPSCounter = NSTextField;
+ GLView = MainOpenGLView;
+ HQButton = NSButton;
+ PrefWin = NSWindow;
+ QEWarning = NSTextField;
+ TabView = NSTabView;
+ myGoom = Goom;
+ };
+ SUPERCLASS = NSResponder;
+ },
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {CLASS = Goom; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ ACTIONS = {
+ clientStorage = id;
+ frameRate = id;
+ rectTextures = id;
+ setFullscreen = id;
+ textureHint = id;
+ textureRange = id;
+ };
+ CLASS = MainOpenGLView;
+ LANGUAGE = ObjC;
+ OUTLETS = {StartingView = NSView; myGoom = Goom; sizeField = NSTextField; };
+ SUPERCLASS = NSOpenGLView;
+ },
+ {CLASS = MyApplication; LANGUAGE = ObjC; SUPERCLASS = NSApplication; },
+ {
+ ACTIONS = {changeAudioDevice = id; changeAudioVolume = id; };
+ CLASS = SoundSampler;
+ LANGUAGE = ObjC;
+ OUTLETS = {ODeviceList = NSPopUpButton; OSoundVolume = NSSlider; };
+ SUPERCLASS = NSObject;
+ }
+ );
+ IBVersion = 1;
+} \ No newline at end of file
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib
new file mode 100755
index 0000000000..d5104f8674
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IBDocumentLocation</key>
+ <string>46 72 356 295 0 0 1024 746 </string>
+ <key>IBEditorPositions</key>
+ <dict>
+ <key>29</key>
+ <string>43 545 183 44 0 0 1280 1002 </string>
+ </dict>
+ <key>IBFramework Version</key>
+ <string>364.0</string>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>29</integer>
+ <integer>508</integer>
+ <integer>21</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>7S215</string>
+</dict>
+</plist>
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/keyedobjects.nib b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/keyedobjects.nib
new file mode 100755
index 0000000000..9c43c77a93
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/keyedobjects.nib
Binary files differ
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings
new file mode 100755
index 0000000000..4eedd76a9c
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings
@@ -0,0 +1,14 @@
+//---------------------------------------------------------------------------//
+//
+// Localizable.strings
+// iGoom StandAlone Project
+//
+// Copyright (c) 2002-2003 iOS. All rights reserved.
+//
+//---------------------------------------------------------------------------//
+
+/* */
+"" = "";
+
+/* Audio Input Devices */
+"Built-in Audio" = "Audio intégré";
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.h
new file mode 100755
index 0000000000..8073c62d11
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.h
@@ -0,0 +1,46 @@
+//
+// Goom.h
+// iGoom
+//
+// Created by Guillaume Borios on Sat Dec 20 2003.
+// Copyright (c) 2003 iOS. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import <OpenGL/OpenGL.h>
+#import <OpenGL/glu.h>
+#include <OpenGL/glext.h>
+#include "src/goom.h"
+
+@interface Goom : NSObject {
+
+ PluginInfo * goomInfos;
+
+ gint16 sndData[2][512];
+
+ GLuint textureName;
+ AbsoluteTime backUpTime;
+
+ GLenum texture_hint;
+ GLboolean client_storage;
+
+ NSSize curSize;
+ BOOL HQ;
+ BOOL dirty;
+}
+
+- (void)setSize:(NSSize)_size;
+
+- (PluginInfo*)infos;
+
+-(void)render;
+
+-(void)setHighQuality:(BOOL)quality;
+- (void)prepareTextures;
+
+- (guint32 *)getGoomDataWithFPS:(float)fps;
+
+-(void)setTextureHint:(GLenum)hint;
+-(void)clientStorage:(GLboolean)client;
+
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.m
new file mode 100755
index 0000000000..db3a162d11
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.m
@@ -0,0 +1,294 @@
+//
+// Goom.m
+// iGoom
+//
+// Created by Guillaume Borios on Sat Dec 20 2003.
+// Copyright (c) 2003 iOS. All rights reserved.
+//
+
+#import "Goom.h"
+#import <OpenGL/glu.h>
+#include <OpenGL/glext.h>
+#import "SoundSampler.h"
+
+@implementation Goom
+
+unsigned int IMAGE_SIZE(NSSize curSize)
+{
+ int retour = (1<<(int)(log((curSize.width>curSize.height)?curSize.width:curSize.height)/log(2.0f)));
+ if (retour > 512) retour = 512;
+ return retour;
+}
+
+-(Goom*)init
+{
+ self = [super init];
+
+ if (self != nil)
+ {
+ curSize = NSMakeSize(16,16);
+ HQ = NO;
+ dirty = YES;
+ goomInfos = goom_init(16,16);
+ backUpTime = UpTime();
+
+ client_storage = GL_TRUE;
+ texture_hint = GL_STORAGE_SHARED_APPLE;
+ }
+ //NSLog(@"Goom Init");
+ return self;
+}
+
+-(Goom*)initWithSize:(NSSize)_size
+{
+ self = [super init];
+
+ if (self != nil)
+ {
+ curSize = _size;
+ HQ = NO;
+ dirty = YES;
+ backUpTime = UpTime();
+ }
+ //NSLog(@"Goom Init with Size : %f x %f",_size.width,_size.height);
+ return self;
+}
+
+- (PluginInfo*)infos
+{
+ return goomInfos;
+}
+
+-(void)setSize:(NSSize)_size
+{
+ if ((curSize.width != _size.width) || (curSize.height != _size.height))
+ {
+ //NSLog(@"Set size (%f,%f)",_size.width, _size.height);
+ curSize = _size;
+ dirty = YES;
+ }
+}
+
+-(void)render
+{
+ if (dirty==YES) [self prepareTextures];
+
+ //glClear(0);
+
+ // Bind, update and draw new image
+ if(HQ==YES)
+ {
+ //NSLog(@"Render HQ (%f,%f)",curSize.width, curSize.height);
+
+ glEnable(GL_TEXTURE_RECTANGLE_EXT);
+
+ glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureName);
+ glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1);
+ glTexSubImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, curSize.width, curSize.height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]);
+
+ glBegin(GL_QUADS);
+ glTexCoord2f(0.0f, 0.0f);
+ glVertex2f(-1.0f, 1.0f);
+ glTexCoord2f(0.0f, curSize.height);
+ glVertex2f(-1.0f, -1.0f);
+ glTexCoord2f(curSize.width, curSize.height);
+ glVertex2f(1.0f, -1.0f);
+ glTexCoord2f(curSize.width, 0.0f);
+ glVertex2f(1.0f, 1.0f);
+ glEnd();
+
+ glDisable(GL_TEXTURE_RECTANGLE_EXT);
+
+ }
+ else
+ {
+ int loggedSize = IMAGE_SIZE(curSize);
+ float ratio = curSize.width/curSize.height;
+
+ //NSLog(@"Render LQ (%f,%f / %d)",curSize.width, curSize.height,IMAGE_SIZE(curSize));
+
+ glEnable(GL_TEXTURE_2D);
+
+ //glColor4f(0.0, 0.5, 0.1, 0.0);
+ glBindTexture(GL_TEXTURE_2D, textureName);
+ glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, loggedSize, loggedSize, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]);
+
+ //glShadeModel(GL_SMOOTH);
+
+ glBegin(GL_POLYGON);
+
+ if (ratio>1.0f)
+ {
+ float o=0.5f-0.5f/ratio;
+ float y=1.0f/ratio+o;
+ //glColor4f(0.0, 0.5, 0.1, 1.0);
+ glTexCoord2f(0.0f, o);
+ glVertex2f(-1.0f, 1.0f);
+ //glColor4f(0.3, 0.5, 0.1, 0.5);
+ glTexCoord2f(0.0f, y);
+ glVertex2f(-1.0f, -1.0f);
+ //glColor4f(0.6, 0.5, 0.1, 0.2);
+ glTexCoord2f(1.0f, y);
+ glVertex2f(1.0f, -1.0f);
+ //glColor4f(0.9, 0.5, 0.1, 0.0);
+ glTexCoord2f(1.0f, o);
+ glVertex2f(1.0f, 1.0f);
+ }
+ else
+ {
+ float o=0.5f-0.5f*ratio;
+ float x=ratio+o;
+ //glColor4f(0.0, 0.5, 0.1, 1.0);
+ glTexCoord2f(o, 0.0f);
+ glVertex2f(-1.0f, 1.0f);
+ //glColor4f(0.3, 0.5, 0.1, 0.5);
+ glTexCoord2f(o, 1.0f);
+ glVertex2f(-1.0f, -1.0f);
+ //glColor4f(0.6, 0.5, 0.1, 0.2);
+ glTexCoord2f(x, 1.0f);
+ glVertex2f(1.0f, -1.0f);
+ //glColor4f(0.9, 0.5, 0.1, 0.0);
+ glTexCoord2f(x, 0.0f);
+ glVertex2f(1.0f, 1.0f);
+ }
+
+ glEnd();
+
+ glDisable(GL_TEXTURE_2D);
+ //glShadeModel(GL_FLAT);
+
+ /*
+ glBegin(GL_QUADS);
+
+ glColor4f(0.0, 0.1, 0.0, 1.0);
+ glVertex3f(-1.0, -1.0, 0.0);
+ glVertex3f( 1.0, -1.0, 0.0);
+
+ glColor4f(0.0, 0.5, 0.1, 1.0);
+ glVertex3f( 1.0, 1.0, 0.0);
+ glVertex3f(-1.0, 1.0, 0.0);
+
+ glEnd();*/
+
+ }
+
+ //glFlush();
+}
+
+
+-(guint32 *)getGoomDataWithFPS:(float)fps
+{
+
+ if (fps>0) return goom_update(goomInfos, [[SoundSampler sharedSampler] getData], 0, fps, 0, 0);
+ else return goom_update(goomInfos, [[SoundSampler sharedSampler] getData], 0, 0, 0, 0);
+ // return goom_update(goomInfos, sndData, 0, fps, 0, 0);
+
+}
+
+
+
+-(void)setHighQuality:(BOOL)quality
+{
+ HQ = quality;
+ dirty = YES;
+}
+
+- (void)prepareTextures
+{
+ //static BOOL first = YES;
+ //[[self openGLContext] update];
+
+ // Setup some basic OpenGL stuff
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+
+ dirty = NO;
+
+ glViewport(0, 0, (int) curSize.width, (int) curSize.height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ //glEnable(GL_LIGHTING);
+
+
+ if(HQ==YES)
+ {
+ //NSLog(@"Prepare HQ (%f,%f)",curSize.width, curSize.height);
+
+ //glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL);
+
+ glDeleteTextures(1, &textureName);
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_TEXTURE_RECTANGLE_EXT);
+
+ glGenTextures( 1, &textureName );
+ glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureName);
+
+ glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL);
+
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , client_storage);
+ glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, texture_hint);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ goom_set_resolution (goomInfos, curSize.width, curSize.height);
+ glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, curSize.width, curSize.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]);
+ }
+ else
+ {
+ //NSLog(@"Prepare LQ (%f,%f)",curSize.width, curSize.height);
+
+ //glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL);
+
+ glDeleteTextures(1, &textureName);
+ glDisable(GL_TEXTURE_RECTANGLE_EXT);
+ glEnable(GL_TEXTURE_2D);
+
+ glGenTextures( 1, &textureName );
+ glBindTexture(GL_TEXTURE_2D, textureName);
+
+ glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_STORAGE_HINT_APPLE , client_storage);
+ glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, texture_hint);
+ 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);
+
+ goom_set_resolution (goomInfos, IMAGE_SIZE(curSize), IMAGE_SIZE(curSize));
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, IMAGE_SIZE(curSize), IMAGE_SIZE(curSize), 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]);
+
+ }
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+}
+
+-(void)setTextureHint:(GLenum)hint
+{
+ texture_hint = hint;
+}
+
+-(void)clientStorage:(GLboolean)client
+{
+ client_storage = client;
+}
+
+
+- (void)dealloc
+{
+ goom_close(goomInfos);
+ [super dealloc];
+}
+
+
+
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.h
new file mode 100755
index 0000000000..c8ec67cb31
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.h
@@ -0,0 +1,26 @@
+//
+// GoomFXParam.h
+// iGoom copie
+//
+// Created by Guillaume Borios on Sun Jul 20 2003.
+// Copyright (c) 2003 iOS. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+#include "src/goom.h"
+
+@interface GoomFXParam : NSObject {
+ PluginParam * parametres;
+ NSProgressIndicator * progress;
+ NSSlider * slider;
+ NSButton * button;
+
+ NSTextField * value;
+}
+
+- (GoomFXParam*)initWithParam:(PluginParam*)p;
+- (NSView*)makeViewAtHeight:(float)h;
+- (void)setValue:(id)sender;
+
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.m
new file mode 100755
index 0000000000..dab5dad865
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.m
@@ -0,0 +1,213 @@
+//
+// GoomFXParam.m
+// iGoom copie
+//
+// Created by Guillaume Borios on Sun Jul 20 2003.
+// Copyright (c) 2003 iOS. All rights reserved.
+//
+
+#import "GoomFXParam.h"
+
+NSMutableDictionary * paramlist = nil;
+
+void goom_input_stub(PluginParam *_this)
+{
+ [(GoomFXParam*)[paramlist objectForKey:[NSString stringWithFormat:@"%p",_this]] setValue:nil];
+}
+
+@implementation GoomFXParam
+
+- (GoomFXParam*)initWithParam:(PluginParam*)p
+{
+ self = [super init];
+
+ if (self)
+ {
+ parametres = p;
+ if (paramlist == nil) paramlist = [[NSMutableDictionary alloc] init];
+ [paramlist setObject:self forKey:[NSString stringWithFormat:@"%p",p]];
+ }
+ return self;
+}
+
+- (void)setValue:(id)sender
+{
+
+ switch (parametres->type)
+ {
+ case PARAM_INTVAL:
+ if (parametres->rw == TRUE)
+ {
+ if (sender)
+ {
+ parametres->param.ival.value = [sender intValue];
+ parametres->changed(parametres);
+ }
+ else [slider setIntValue:parametres->param.ival.value];
+ [value setIntValue:parametres->param.ival.value];
+ }
+ else
+ {
+ [progress setDoubleValue:(double)parametres->param.ival.value];
+ }
+ break;
+ case PARAM_FLOATVAL:
+ if (parametres->rw == TRUE)
+ {
+ if (sender)
+ {
+ parametres->param.fval.value = (float)[sender doubleValue];
+ parametres->changed(parametres);
+ }
+ else [slider setDoubleValue:(double)parametres->param.fval.value];
+ [value setDoubleValue:(double)parametres->param.fval.value];
+ }
+ else
+ {
+ [progress setDoubleValue:(double)parametres->param.fval.value];
+ }
+ break;
+ case PARAM_BOOLVAL:
+ if ((parametres->rw == TRUE) && (sender != nil))
+ {
+ parametres->param.bval.value = ([sender state]==NSOnState);
+ parametres->changed(parametres);
+ }
+ else
+ {
+ [button setState:(parametres->param.bval.value == YES)?NSOnState:NSOffState];
+ }
+ break;
+ case PARAM_STRVAL:
+ break;
+ case PARAM_LISTVAL:
+ break;
+ default:
+ break;
+ }
+}
+
+- (NSView*)makeViewAtHeight:(float)h
+{
+ NSView * container;
+ NSTextField * text;
+
+ container = [[NSView alloc] initWithFrame:NSMakeRect(20,h,420,25)];
+
+ if (parametres->type != PARAM_BOOLVAL)
+ {
+ text = [[NSTextField alloc] initWithFrame:NSMakeRect(0,5,214,15)];
+ [text setStringValue:[NSString stringWithCString:parametres->name]];
+ [text setDrawsBackground:NO];
+ [text setSelectable:NO];
+ [text setEditable:NO];
+ [text setBordered:NO];
+ [container addSubview:[text autorelease]];
+ }
+
+
+ if (parametres->rw == TRUE)
+ {
+ switch (parametres->type)
+ {
+ case PARAM_INTVAL:
+ case PARAM_FLOATVAL:
+ // Value text field
+ value = [[NSTextField alloc] initWithFrame:NSMakeRect(374,5,214,15)];
+ [value setDrawsBackground:NO];
+ [value setSelectable:NO];
+ [value setEditable:NO];
+ [value setBordered:NO];
+
+ [container addSubview:[value autorelease]];
+ //slider
+ slider = [[NSSlider alloc] initWithFrame:NSMakeRect(222,2,144,20)];
+ [slider setAction:@selector(setValue:)];
+ [slider setTickMarkPosition:NSTickMarkAbove];
+ [slider setTarget:self];
+ [container addSubview:[slider autorelease]];
+ //values
+ if (parametres->type == PARAM_INTVAL)
+ {
+ [value setIntValue:parametres->param.ival.value];
+ [slider setMaxValue:(double)parametres->param.ival.max];
+ [slider setMinValue:(double)parametres->param.ival.min];
+ [slider setIntValue:parametres->param.ival.value];
+ }
+ else
+ {
+ [value setDoubleValue:parametres->param.fval.value];
+ [[value cell] setFloatingPointFormat:YES left:1 right:1];
+ [slider setMaxValue:(double)parametres->param.fval.max];
+ [slider setMinValue:(double)parametres->param.fval.min];
+ [slider setDoubleValue:(double)parametres->param.fval.value];
+ }
+ break;
+ case PARAM_BOOLVAL:
+ button = [[NSButton alloc] initWithFrame:NSMakeRect(0,2,344,18)];
+ [button setEnabled:YES];
+ [button setState:(parametres->param.bval.value == YES)?NSOnState:NSOffState];
+ [button setTitle:[NSString stringWithCString:parametres->name]];
+ [button setButtonType:NSSwitchButton];
+ [button setTransparent:NO];
+ [button setTarget:self];
+ [button setAction:@selector(setValue:)];
+ [container addSubview:[button autorelease]];
+ break;
+ case PARAM_STRVAL:
+ NSLog(@"PARAM_STRVAL rw not implemented");
+ break;
+ case PARAM_LISTVAL:
+ NSLog(@"PARAM_LISTVAL rw not implemented");
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ switch (parametres->type)
+ {
+ case PARAM_INTVAL:
+ //slider
+ progress = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(222,7,144,10)];
+ [progress setMaxValue:(double)parametres->param.ival.max];
+ [progress setMinValue:(double)parametres->param.ival.min];
+ [progress setDoubleValue:(double)parametres->param.ival.value];
+ [progress setIndeterminate:NO];
+ [container addSubview:[progress autorelease]];
+ break;
+ case PARAM_FLOATVAL:
+ //slider
+ progress = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(222,7,144,10)];
+ [progress setMaxValue:(double)parametres->param.fval.max];
+ [progress setMinValue:(double)parametres->param.fval.min];
+ [progress setDoubleValue:(double)parametres->param.fval.value];
+ [progress setIndeterminate:NO];
+ [container addSubview:[progress autorelease]];
+ break;
+ case PARAM_BOOLVAL:
+ button = [[NSButton alloc] initWithFrame:NSMakeRect(0,2,344,18)];
+ [button setEnabled:NO];
+ [button setState:(parametres->param.bval.value == YES)?NSOnState:NSOffState];
+ [button setTitle:[NSString stringWithCString:parametres->name]];
+ [button setButtonType:NSSwitchButton];
+ [button setTransparent:NO];
+ [container addSubview:[button autorelease]];
+ break;
+ case PARAM_STRVAL:
+ NSLog(@"PARAM_STRVAL ro not implemented");
+ break;
+ case PARAM_LISTVAL:
+ NSLog(@"PARAM_LISTVAL ro not implemented");
+ break;
+ default:
+ break;
+ }
+ parametres->change_listener = goom_input_stub;
+ }
+
+ return [container autorelease];
+}
+
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.h
new file mode 100755
index 0000000000..128eb60fab
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.h
@@ -0,0 +1,22 @@
+//
+// GoomFXView.h
+// iGoom copie
+//
+// Created by Guillaume Borios on Sun Jul 20 2003.
+// Copyright (c) 2003 iOS. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+#include "src/goom.h"
+
+@interface GoomFXView : NSTabView {
+
+ NSMutableArray * params;
+ @public
+ float height;
+}
+
+- (id)initWithFrame:(NSRect)frame andFX:(PluginParameters)FX ;
+
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.m
new file mode 100755
index 0000000000..c2189f023d
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.m
@@ -0,0 +1,65 @@
+//
+// GoomFXView.m
+// iGoom copie
+//
+// Created by Guillaume Borios on Sun Jul 20 2003.
+// Copyright (c) 2003 iOS. All rights reserved.
+//
+
+#import "GoomFXView.h"
+#import "GoomFXParam.h"
+
+
+@implementation GoomFXView
+
+- (id)initWithFrame:(NSRect)frame andFX:(PluginParameters)FX {
+ self = [super initWithFrame:frame];
+ if (self) {
+ int i;
+ height = 15.0f;
+ params = [[NSMutableArray alloc] init];
+ for (i=0; i < FX.nbParams; i++)
+ {
+ if (FX.params[i] != NULL)
+ {
+ GoomFXParam * FXP = [[[GoomFXParam alloc]initWithParam:FX.params[i]]autorelease];
+ [params addObject:FXP];
+ [self addSubview:[FXP makeViewAtHeight:height]];
+ height += 29.0f;
+ }
+ else
+ {
+ height += 12.0f;
+ }
+ }
+ }
+
+ height += 73.0f;
+
+ return self;
+}
+
+- (void)resizeWindow
+{
+ NSWindow * parent = [self window];
+ NSRect frame = [parent frame];
+ if (frame.size.height != height)
+ {
+ frame.origin.y -= height-frame.size.height;
+ frame.size.height = height;
+ [parent setFrame:frame display:NO animate:NO];
+ }
+}
+
+- (void)drawRect:(NSRect)rect {
+ // Drawing code here.
+}
+
+-(void)dealloc
+{
+ [params release];
+
+ [super dealloc];
+}
+
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.h
new file mode 100755
index 0000000000..90f1a923cc
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.h
@@ -0,0 +1,88 @@
+/*
+ *
+ Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
+ ("Apple") in consideration of your agreement to the following terms, and your
+ use, installation, modification or redistribution of this Apple software
+ constitutes acceptance of these terms. If you do not agree with these terms,
+ please do not use, install, modify or redistribute this Apple software.
+
+ In consideration of your agreement to abide by the following terms, and subject
+ to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
+ copyrights in this original Apple software (the "Apple Software"), to use,
+ reproduce, modify and redistribute the Apple Software, with or without
+ modifications, in source and/or binary forms; provided that if you redistribute
+ the Apple Software in its entirety and without modifications, you must retain
+ this notice and the following text and disclaimers in all such redistributions of
+ the Apple Software. Neither the name, trademarks, service marks or logos of
+ Apple Computer, Inc. may be used to endorse or promote products derived from the
+ Apple Software without specific prior written permission from Apple. Except as
+ expressly stated in this notice, no other rights or licenses, express or implied,
+ are granted by Apple herein, including but not limited to any patent rights that
+ may be infringed by your derivative works or by other works in which the Apple
+ Software may be incorporated.
+
+ The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+ WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
+ COMBINATION WITH YOUR PRODUCTS.
+
+ IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
+ OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
+ (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#import <Cocoa/Cocoa.h>
+
+#include <OpenGL/gl.h>
+#include <OpenGL/glext.h>
+#include <OpenGL/glu.h>
+
+#include <sys/time.h>
+#include <unistd.h>
+
+#import "Goom.h"
+
+#define STAT_UPDATE 0.6f
+#define IMAGE_DEPTH 32
+
+@interface MainOpenGLView : NSOpenGLView
+{
+ GLubyte *image;
+
+ GLint buffers;
+ GLint frame_rate;
+
+ GLboolean rect_texture;
+ GLboolean client_storage;
+ GLboolean texture_range;
+
+ bool fullscreen;
+ NSWindow * FullScreenWindow;
+ IBOutlet NSView * StartingView;
+
+
+ struct timeval cycle_time;
+
+ IBOutlet NSTextField *sizeField;
+
+ IBOutlet Goom * myGoom;
+
+ NSTimer* timer;
+
+ @public
+ float avg_fps;
+}
+
+- (IBAction) clientStorage: (id) sender;
+- (IBAction) textureHint: (id) sender;
+- (IBAction) rectTextures: (id) sender;
+
+- (BOOL)canBeHQ;
+
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.m
new file mode 100755
index 0000000000..f2bed83169
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.m
@@ -0,0 +1,249 @@
+#define IMAGE_SIZE (1<<(int)(log(([self bounds].size.width<[self bounds].size.height)?[self bounds].size.width:[self bounds].size.height)/log(2.0f)))
+
+#include <sys/time.h>
+#include <unistd.h>
+#include <math.h>
+
+#include "src/goom.h"
+
+#include <QuickTime/ImageCompression.h> // for image loading and decompression
+#include <QuickTime/QuickTimeComponents.h> // for file type support
+
+#include <OpenGL/CGLCurrent.h>
+#include <OpenGL/CGLContext.h>
+#include <OpenGL/gl.h>
+
+#import "MainOpenGLView.h"
+
+@implementation MainOpenGLView
+
+- (void) dealloc
+{
+ [super dealloc];
+}
+
+- (id)initWithFrame:(NSRect)frameRect
+{
+ // Init pixel format attribs
+ NSOpenGLPixelFormatAttribute attrs[] =
+ {
+ // Attributes Common to FullScreen and non-FullScreen
+ NSOpenGLPFAColorSize, 24,
+ NSOpenGLPFADepthSize, 16,
+ NSOpenGLPFADoubleBuffer,
+ NSOpenGLPFAAccelerated,
+ NSOpenGLPFANoRecovery,
+ 0
+ };
+
+ // Get pixel format from OpenGL
+ NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
+ if (!pixFmt)
+ {
+ NSLog(@"No pixel format -- exiting");
+ exit(1);
+ }
+
+ self = [super initWithFrame:frameRect pixelFormat:pixFmt];
+ return self;
+}
+/*
+- (void)displayMPixels
+{
+ static long loop_count = 0;
+ struct timeval t2;
+ unsigned long t;
+
+ loop_count++;
+
+ gettimeofday(&t2, NULL);
+ t = 1000000 * (t2.tv_sec - cycle_time.tv_sec) + (t2.tv_usec - cycle_time.tv_usec);
+
+ // Display the average data rate
+ if(t > 1000000 * STAT_UPDATE)
+ {
+ gettimeofday(&t2, NULL);
+ t = 1000000 * (t2.tv_sec - cycle_time.tv_sec) + (t2.tv_usec - cycle_time.tv_usec);
+ gettimeofday(&cycle_time, NULL);
+ avg_fps = (1000000.0f * (float) loop_count) / (float) t;
+
+ loop_count = 0;
+
+ gettimeofday(&cycle_time, NULL);
+ }
+}
+*/
+
+- (BOOL)canBeHQ
+{
+ [[self openGLContext] makeCurrentContext];
+ return (strstr(glGetString(GL_EXTENSIONS),"GL_EXT_texture_rectangle") != NULL);
+}
+
+ - (void) drawRect:(NSRect)rect
+ {
+ // Delegate to our scene object for rendering.
+
+ [[self openGLContext] makeCurrentContext];
+
+ glViewport(0, 0, (GLsizei) rect.size.width, (GLsizei) rect.size.height);
+
+ //GLfloat clear_color[4] = { 1.0f, 0.0f, 0.0f, 0.0f };
+ //glClearColor(clear_color[0], clear_color[1], clear_color[2], clear_color[3]);
+ //glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT+GL_STENCIL_BUFFER_BIT);
+
+ [myGoom render];
+
+ [[self openGLContext] flushBuffer];
+ }
+
+
+- (void)update // moved or resized
+{
+ NSRect rect;
+
+ [myGoom setSize:[self bounds].size];
+
+ [super update];
+
+ [[self openGLContext] makeCurrentContext];
+ [[self openGLContext] update];
+
+ rect = [self bounds];
+
+ glViewport(0, 0, (int) rect.size.width, (int) rect.size.height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+
+ [self setNeedsDisplay:true];
+}
+
+- (void)reshape // scrolled, moved or resized
+{
+ NSRect rect;
+
+ [myGoom setSize:[self bounds].size];
+
+ [super reshape];
+
+ [[self openGLContext] makeCurrentContext];
+ [[self openGLContext] update];
+
+ //[myGoom setSize:[self bounds].size];
+
+
+ rect = [self bounds];
+
+ glViewport(0, 0, (int) rect.size.width, (int) rect.size.height);
+
+ //[self loadTextures:GL_FALSE];
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ [self setNeedsDisplay:true];
+}
+
+- (IBAction) clientStorage: (id) sender
+{
+ [myGoom clientStorage:([sender state]==NSOnState)?GL_TRUE:GL_FALSE];
+
+ //[self loadTextures:GL_FALSE];
+}
+
+- (IBAction) rectTextures: (id) sender
+{
+ [myGoom setHighQuality:(rect_texture==NSOnState)?YES:NO];
+
+ //[self loadTextures:GL_FALSE];
+}
+
+- (IBAction) textureHint: (id) sender
+{
+ int tag = [[sender selectedItem] tag];
+ GLenum texture_hint = GL_STORAGE_CACHED_APPLE;
+ if(tag == 1) texture_hint = GL_STORAGE_PRIVATE_APPLE;
+ if(tag == 2) texture_hint = GL_STORAGE_SHARED_APPLE;
+
+ [myGoom setTextureHint:texture_hint];
+ //[self loadTextures:YES];
+}
+/*
+- (void)loadTextures: (GLboolean)first
+{
+ NSLog(@"LoadsTExtures");
+ PluginInfo * goomInfos = [myGoom infos];
+
+ NSRect rect = [self bounds];
+
+ [[self openGLContext] makeCurrentContext];
+ [[self openGLContext] update];
+ glEnable(GL_LIGHTING);
+ if(rect_texture)
+ {
+ if(!first)
+ {
+ GLint dt = 1;
+ glDeleteTextures(1, &dt);
+ }
+
+ goom_set_resolution (goomInfos, rect.size.width, rect.size.height);
+
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_TEXTURE_RECTANGLE_EXT);
+ glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 1);
+
+ glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL);
+
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint);
+ glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+
+ glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, [self bounds].size.width,
+ [self bounds].size.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [myGoom getGoomDataWithFPS:avg_fps]);
+ }
+ else
+ {
+ glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL);
+ glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL);
+
+ if(!first)
+ {
+ GLint dt = 1;
+ glDeleteTextures(1, &dt);
+ }
+
+ goom_set_resolution (goomInfos,IMAGE_SIZE, IMAGE_SIZE);
+
+ glDisable(GL_TEXTURE_RECTANGLE_EXT);
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, 1);
+
+ glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL);
+
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint);
+ glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage);
+ 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);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, IMAGE_SIZE,
+ IMAGE_SIZE, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [myGoom getGoomDataWithFPS:avg_fps]);
+ }
+}
+*/
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.h
new file mode 100755
index 0000000000..e6b3c375c6
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.h
@@ -0,0 +1,45 @@
+/*
+ *
+ Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
+ ("Apple") in consideration of your agreement to the following terms, and your
+ use, installation, modification or redistribution of this Apple software
+ constitutes acceptance of these terms. If you do not agree with these terms,
+ please do not use, install, modify or redistribute this Apple software.
+
+ In consideration of your agreement to abide by the following terms, and subject
+ to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
+ copyrights in this original Apple software (the "Apple Software"), to use,
+ reproduce, modify and redistribute the Apple Software, with or without
+ modifications, in source and/or binary forms; provided that if you redistribute
+ the Apple Software in its entirety and without modifications, you must retain
+ this notice and the following text and disclaimers in all such redistributions of
+ the Apple Software. Neither the name, trademarks, service marks or logos of
+ Apple Computer, Inc. may be used to endorse or promote products derived from the
+ Apple Software without specific prior written permission from Apple. Except as
+ expressly stated in this notice, no other rights or licenses, express or implied,
+ are granted by Apple herein, including but not limited to any patent rights that
+ may be infringed by your derivative works or by other works in which the Apple
+ Software may be incorporated.
+
+ The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+ WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
+ COMBINATION WITH YOUR PRODUCTS.
+
+ IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
+ OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
+ (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#import <Cocoa/Cocoa.h>
+
+@interface MyApplication : NSApplication
+{
+}
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.m
new file mode 100755
index 0000000000..38388c86c3
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.m
@@ -0,0 +1,57 @@
+/*
+ *
+ Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
+ ("Apple") in consideration of your agreement to the following terms, and your
+ use, installation, modification or redistribution of this Apple software
+ constitutes acceptance of these terms. If you do not agree with these terms,
+ please do not use, install, modify or redistribute this Apple software.
+
+ In consideration of your agreement to abide by the following terms, and subject
+ to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
+ copyrights in this original Apple software (the "Apple Software"), to use,
+ reproduce, modify and redistribute the Apple Software, with or without
+ modifications, in source and/or binary forms; provided that if you redistribute
+ the Apple Software in its entirety and without modifications, you must retain
+ this notice and the following text and disclaimers in all such redistributions of
+ the Apple Software. Neither the name, trademarks, service marks or logos of
+ Apple Computer, Inc. may be used to endorse or promote products derived from the
+ Apple Software without specific prior written permission from Apple. Except as
+ expressly stated in this notice, no other rights or licenses, express or implied,
+ are granted by Apple herein, including but not limited to any patent rights that
+ may be infringed by your derivative works or by other works in which the Apple
+ Software may be incorporated.
+
+ The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+ WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
+ COMBINATION WITH YOUR PRODUCTS.
+
+ IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
+ OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
+ (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#import "MyApplication.h"
+#import "AppController.h"
+
+@implementation MyApplication
+
+- (NSEvent *)nextEventMatchingMask:(unsigned int)mask
+ untilDate:(NSDate *)expiration inMode:(NSString *)mode dequeue:(BOOL)flag
+{
+ NSEvent *event;
+
+ event = [super nextEventMatchingMask:mask untilDate:expiration inMode:mode dequeue:flag];
+
+ //[[self delegate] UpdateDrawing];
+
+ return event;
+}
+
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.h
new file mode 100755
index 0000000000..7954b48a14
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.h
@@ -0,0 +1,36 @@
+//
+// SoundSampler.h
+// iGoom
+//
+// Created by Guillaume Borios on Thu May 27 2004.
+// Copyright (c) 2004 iOS. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#include <CoreAudio/CoreAudio.h>
+
+
+@interface SoundSampler : NSObject {
+
+ @private
+
+ IBOutlet NSPopUpButton * ODeviceList;
+ IBOutlet NSSlider * OSoundVolume;
+
+ AudioDeviceID oldDevice, curDevice;
+
+ signed short data[3][2][512];
+ int BufferIndexReady, BufferIndexRead, BufferIndexWrite;
+ NSLock * BufferLock;
+}
+
++(SoundSampler*)sharedSampler;
+-(void*)getData;
+-(void) UpdateDeviceList;
+-(void)updateBuffer:(const AudioBufferList *)inInputData withDevice:(AudioDeviceID)inDevice;
+
+-(IBAction)changeAudioDevice:(id)sender;
+-(IBAction)changeAudioVolume:(id)sender;
+-(void)refreshAudioVolumeInterface:(float)value;
+
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.mm b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.mm
new file mode 100755
index 0000000000..b9d321b799
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.mm
@@ -0,0 +1,372 @@
+//
+// SoundSampler.mm
+// iGoom
+//
+// Created by Guillaume Borios on Thu May 27 2004.
+// Copyright (c) 2004 iOS. All rights reserved.
+//
+
+#import "SoundSampler.h"
+
+#import "CoreAudioHardware.h"
+#import "CoreAudioDevice.h"
+
+#include <sys/types.h>
+#include <unistd.h>
+
+#define kAudioDeviceNone 0
+#define kAudioDeviceUndefined 0xFFFF
+
+
+OSStatus deviceChanged(AudioDeviceID inDevice, UInt32 /*inChannel*/, Boolean inIsInput, AudioDevicePropertyID inPropertyID, void * deviceController)
+{
+ if (inIsInput)
+ {
+ NS_DURING
+
+ switch(inPropertyID)
+ {
+ case kAudioDevicePropertyDeviceIsAlive:
+ case kAudioDevicePropertyHogMode:
+ case kAudioDevicePropertyDeviceHasChanged:
+ {
+ [(SoundSampler*)deviceController UpdateDeviceList];
+ CoreAudioDevice theDevice(inDevice);
+ [(SoundSampler*)deviceController refreshAudioVolumeInterface:theDevice.GetVolumeControlScalarValue(1,kAudioDeviceSectionInput)];
+ }
+ break;
+
+ default:
+ break;
+ };
+
+ NS_HANDLER
+ NS_ENDHANDLER
+ }
+ return 0;
+}
+
+OSStatus devicesChanged(AudioHardwarePropertyID property, void * deviceController)
+{
+ NS_DURING
+
+ switch(property)
+ {
+ case kAudioHardwarePropertyDevices:
+ [(SoundSampler*)deviceController UpdateDeviceList];
+ break;
+
+ default:
+ break;
+ };
+
+ NS_HANDLER
+ NS_ENDHANDLER
+
+ return 0;
+}
+
+static SoundSampler * sharedInstance = nil;
+
+@implementation SoundSampler
+
+-(SoundSampler*)init
+{
+ self = [super init];
+ if (self)
+ {
+ if (sharedInstance==nil) sharedInstance = self;
+ oldDevice = curDevice = kAudioDeviceUndefined;
+ BufferIndexReady = 2;
+ BufferIndexRead = 0;
+ BufferIndexWrite = 1;
+ BufferLock = [[NSLock alloc] init];
+ }
+ return self;
+}
+
++(SoundSampler*)sharedSampler
+{
+ if (sharedInstance==nil)
+ {
+ NSLog(@"Error : Sound Sampler invoked to early");
+ exit(0);
+ }
+ return sharedInstance;
+}
+
+-(void)awakeFromNib
+{
+ [ODeviceList setAutoenablesItems:NO];
+ [self UpdateDeviceList];
+ CoreAudioHardware::AddPropertyListener(kAudioHardwarePropertyDevices, (AudioHardwarePropertyListenerProc)devicesChanged, self);
+}
+
+-(void) dealloc
+{
+ CoreAudioHardware::RemovePropertyListener(kAudioHardwarePropertyDevices, (AudioHardwarePropertyListenerProc)devicesChanged);
+ [super dealloc];
+}
+
+
+OSStatus myDeviceProc(AudioDeviceID inDevice, const AudioTimeStamp * inNow,
+ const AudioBufferList * inInputData,
+ const AudioTimeStamp * inInputTime,
+ AudioBufferList * outOutputData,
+ const AudioTimeStamp * inOutputTime, void * inClientData)
+{
+ [(SoundSampler*)inClientData updateBuffer:inInputData withDevice:inDevice];
+}
+
+#define maxValue 32567.0f
+
+-(void)swapBuffersForRead:(BOOL)read
+{
+ int tmp;
+
+ [BufferLock lock];
+ if (read)
+ {
+ tmp = BufferIndexRead;
+ BufferIndexRead = BufferIndexReady;
+ BufferIndexReady = tmp;
+ }
+ else
+ {
+ tmp = BufferIndexWrite;
+ BufferIndexWrite = BufferIndexReady;
+ BufferIndexReady = tmp;
+ }
+ [BufferLock unlock];
+}
+
+-(void)updateBuffer:(const AudioBufferList *)inInputData withDevice:(AudioDeviceID)inDevice
+{
+ // WARNING !!! This function assumes the input format is (interleaved) Float32 !!!
+ int curBuffer;
+ int curPosition = 512-1;
+ int i;
+ for (curBuffer = inInputData->mNumberBuffers-1; (curBuffer >= 0) && (curPosition >= 0); --curBuffer)
+ {
+ UInt32 channels = inInputData->mBuffers[curBuffer].mNumberChannels;
+ UInt32 size = inInputData->mBuffers[curBuffer].mDataByteSize / (sizeof(Float32)*channels);
+ if ( (channels > 0) && (size > 0) )
+ {
+ if (channels == 1)
+ {
+ // We will duplicate the first channel
+ for (i=size-1; (i >=0 ) && (curPosition >= 0); --i)
+ {
+ data[BufferIndexWrite][0][curPosition]=(short)(maxValue * ((Float32*)inInputData->mBuffers[curBuffer].mData)[i]);
+ data[BufferIndexWrite][1][curPosition]=data[BufferIndexWrite][0][curPosition];
+ curPosition--;
+ }
+ }
+ else
+ {
+ // Uses only the 2 first channels
+ for (i=size-1; (i >=0 ) && (curPosition >= 1); --i)
+ {
+ data[BufferIndexWrite][0][curPosition]=(short)(maxValue * ((Float32*)inInputData->mBuffers[curBuffer].mData)[i]);
+ i--;
+ data[BufferIndexWrite][1][curPosition]=(short)(maxValue * ((Float32*)inInputData->mBuffers[curBuffer].mData)[i]);
+ curPosition--;
+ }
+ }
+ }
+ }
+ [self swapBuffersForRead:NO];
+}
+
+-(void*)getData
+{
+ if (oldDevice != curDevice )
+ {
+ // The device changed
+
+ // Stop the old one
+ if ( (oldDevice != kAudioDeviceUndefined) && (oldDevice != kAudioDeviceNone) )
+ {
+ AudioDeviceStop(oldDevice, myDeviceProc);
+ AudioDeviceRemoveIOProc(oldDevice, myDeviceProc);
+ bzero((void*)data,3*2*512*sizeof(short));
+ }
+ oldDevice = curDevice;
+
+ //Start the new one
+ if ( (curDevice != kAudioDeviceUndefined) && (curDevice != kAudioDeviceNone) )
+ {
+ AudioDeviceAddIOProc(curDevice, myDeviceProc, (void*)self);
+ AudioDeviceStart(curDevice, myDeviceProc);
+ }
+ }
+
+ [self swapBuffersForRead:YES];
+
+ return (void*)(&(data[BufferIndexRead][0][0]));
+}
+
+
+
+
+-(IBAction)_changeAudioDevice:(AudioDeviceID)device
+{
+ if (oldDevice==device) return;
+
+ //NSLog(@"Changing audio device from %d to %d",oldDevice,device);
+
+ if ( (oldDevice != kAudioDeviceUndefined) && (oldDevice != kAudioDeviceNone) )
+ {
+ CoreAudioDevice old(oldDevice);
+ old.RemovePropertyListener(kAudioPropertyWildcardChannel, kAudioPropertyWildcardSection, kAudioPropertyWildcardPropertyID, (AudioDevicePropertyListenerProc)deviceChanged);
+ }
+
+ curDevice = device;
+
+ if (device == kAudioDeviceNone)
+ {
+ [OSoundVolume setEnabled:NO];
+ [OSoundVolume setFloatValue:0.0f];
+ }
+ else
+ {
+ CoreAudioDevice theDevice(device);
+ theDevice.AddPropertyListener(kAudioPropertyWildcardChannel, kAudioPropertyWildcardSection, kAudioPropertyWildcardPropertyID, (AudioDevicePropertyListenerProc)deviceChanged, self);
+ if (theDevice.HasVolumeControl(1,kAudioDeviceSectionInput))
+ {
+ [OSoundVolume setEnabled:theDevice.VolumeControlIsSettable(1,kAudioDeviceSectionInput)];
+ [OSoundVolume setFloatValue:theDevice.GetVolumeControlScalarValue(1,kAudioDeviceSectionInput)];
+ }
+ else
+ {
+ [OSoundVolume setEnabled:NO];
+ [OSoundVolume setFloatValue:0.0f];
+ }
+ }
+}
+
+-(IBAction)changeAudioDevice:(id)sender
+{
+ //NSLog(@"Will change to %@",[[ODeviceList selectedItem]title]);
+ [self _changeAudioDevice:[[ODeviceList selectedItem]tag]];
+}
+
+
+-(void) AddDeviceToMenu:(CoreAudioDevice *)dev
+{
+ if (dev == nil)
+ {
+ [ODeviceList addItemWithTitle:[[NSBundle bundleForClass:[self class]] localizedStringForKey:@"None" value:nil table:nil]];
+ [[ODeviceList lastItem] setTag:kAudioDeviceNone];
+ }
+ else
+ {
+ [ODeviceList addItemWithTitle:@""];
+ NSMenuItem* zeItem = [ODeviceList lastItem];
+
+ NSString* name = (NSString*)dev->name();
+ [zeItem setTitle: [[NSBundle bundleForClass:[self class]] localizedStringForKey:name value:nil table:nil]];
+ [name release];
+ [zeItem setTag: dev->getDeviceID()];
+ }
+}
+
+
+-(void) UpdateDeviceList
+{
+ int i,c;
+
+
+ // Cleanup
+ [ODeviceList removeAllItems];
+ [self AddDeviceToMenu:nil];
+
+
+ // List devices
+ int n = CoreAudioHardware::numberOfDevices();
+ //NSLog(@"Current device %d",curDevice);
+ for(i = 0; i < n; i++)
+ {
+ CoreAudioDevice theDevice(CoreAudioHardware::deviceAtIndex(i));
+
+ // select audio devices with input streams only
+ if (theDevice.numberOfChannels(kAudioDeviceSectionInput) > 0)
+ {
+ [self AddDeviceToMenu:&theDevice];
+ }
+ //NSLog(@"Tag %d : %d",i,[ODeviceList lastItem]);
+ }
+
+ // Set up the new selection
+ pid_t theHogModeOwner;
+
+
+ // Choose the old device, if not hogged...
+ c = [ODeviceList indexOfItemWithTag: curDevice];
+ if (c != -1)
+ {
+ CoreAudioDevice dev(CoreAudioHardware::deviceAtIndex(i-1));
+ theHogModeOwner = dev.hogModeOwner();
+ if ((theHogModeOwner != -1) && (theHogModeOwner != getpid()))
+ {
+ c = -1;
+ }
+ }
+
+ // Disables all hogged audio inputs, and choose one if necessary and possible
+ int m = 1;
+ for (i = 0; i < n; i++)
+ {
+ CoreAudioDevice dev(CoreAudioHardware::deviceAtIndex(i));
+ if (dev.numberOfChannels(kAudioDeviceSectionInput) > 0)
+ {
+ theHogModeOwner = dev.hogModeOwner();
+ if ((theHogModeOwner != -1) && (theHogModeOwner != getpid()))
+ {
+ NS_DURING
+ [[ODeviceList itemAtIndex:m] setEnabled:NO];
+ NS_HANDLER
+ //NSLog(@"Exception 1 a pété ! c = %d, i = %d, n = %d, max = %d",c,i,n,[ODeviceList numberOfItems]);
+ NS_ENDHANDLER
+ }
+ else if (c == -1)
+ {
+ c = m;
+ NS_DURING
+ [self _changeAudioDevice:[[ODeviceList itemAtIndex:c] tag]];
+ NS_HANDLER
+ //NSLog(@"Exception 2 a pété ! c = %d, i = %d, n = %d, max = %d",c,i,n,[ODeviceList numberOfItems]);
+ NS_ENDHANDLER
+ }
+ m++;
+ }
+ }
+
+ // If nothing could be selected, choose "None"
+ if (c == -1)
+ {
+ c = 0;
+ [self _changeAudioDevice:kAudioDeviceNone];
+ }
+
+ [ODeviceList selectItemAtIndex:c];
+}
+
+
+-(void)refreshAudioVolumeInterface:(float)value
+{
+ [OSoundVolume setFloatValue:value];
+}
+
+-(IBAction)changeAudioVolume:(id)sender
+{
+ CoreAudioDevice theDevice(curDevice);
+ if (theDevice.VolumeControlIsSettable(1,kAudioDeviceSectionInput))
+ theDevice.SetVolumeControlScalarValue(1,kAudioDeviceSectionInput,[sender floatValue]);
+ if (theDevice.VolumeControlIsSettable(2,kAudioDeviceSectionInput))
+ theDevice.SetVolumeControlScalarValue(2,kAudioDeviceSectionInput,[sender floatValue]);
+}
+
+
+
+@end
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist
new file mode 100755
index 0000000000..bd9a0901b8
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>iGoom</string>
+ <key>CFBundleGetInfoString</key>
+ <string></string>
+ <key>CFBundleIconFile</key>
+ <string>icon.icns</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.ios.igoom.standalone</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string></string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string></string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>2.0</string>
+ <key>NSMainNibFile</key>
+ <string>MainMenu</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+</dict>
+</plist>
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch
new file mode 100755
index 0000000000..13686a200a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch
@@ -0,0 +1,7 @@
+//
+// Prefix header for all source files of the 'iGoom' target in the 'iGoom' project
+//
+
+#ifdef __OBJC__
+ #import <Cocoa/Cocoa.h>
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/icon.icns b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/icon.icns
new file mode 100644
index 0000000000..5eec9d8614
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/icon.icns
Binary files differ
diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/main.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/main.m
new file mode 100755
index 0000000000..b320f38777
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/main.m
@@ -0,0 +1,45 @@
+/*
+ *
+ Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
+ ("Apple") in consideration of your agreement to the following terms, and your
+ use, installation, modification or redistribution of this Apple software
+ constitutes acceptance of these terms. If you do not agree with these terms,
+ please do not use, install, modify or redistribute this Apple software.
+
+ In consideration of your agreement to abide by the following terms, and subject
+ to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
+ copyrights in this original Apple software (the "Apple Software"), to use,
+ reproduce, modify and redistribute the Apple Software, with or without
+ modifications, in source and/or binary forms; provided that if you redistribute
+ the Apple Software in its entirety and without modifications, you must retain
+ this notice and the following text and disclaimers in all such redistributions of
+ the Apple Software. Neither the name, trademarks, service marks or logos of
+ Apple Computer, Inc. may be used to endorse or promote products derived from the
+ Apple Software without specific prior written permission from Apple. Except as
+ expressly stated in this notice, no other rights or licenses, express or implied,
+ are granted by Apple herein, including but not limited to any patent rights that
+ may be infringed by your derivative works or by other works in which the Apple
+ Software may be incorporated.
+
+ The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+ WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
+ COMBINATION WITH YOUR PRODUCTS.
+
+ IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
+ OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
+ (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#import <Cocoa/Cocoa.h>
+
+int main(int argc, const char *argv[])
+{
+ return NSApplicationMain(argc, argv);
+}
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iGoom.xcode/project.pbxproj b/src/visualizations/Goom/goom2k4-0/mac/iGoom.xcode/project.pbxproj
new file mode 100755
index 0000000000..e29b627bb1
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iGoom.xcode/project.pbxproj
@@ -0,0 +1,1130 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 39;
+ objects = {
+ 1058C7A0FEA54F0111CA2CBB = {
+ children = (
+ 1058C7A1FEA54F0111CA2CBB,
+ 3B336C0906D1537B003DCDCB,
+ 3B336CD606D159F9003DCDCB,
+ );
+ isa = PBXGroup;
+ name = "Linked Frameworks";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 1058C7A1FEA54F0111CA2CBB = {
+ isa = PBXFileReference;
+ lastKnownFileType = wrapper.framework;
+ name = Cocoa.framework;
+ path = /System/Library/Frameworks/Cocoa.framework;
+ refType = 0;
+ sourceTree = "<absolute>";
+ };
+ 1058C7A2FEA54F0111CA2CBB = {
+ children = (
+ 3BE13CC706D3FE26005DAB04,
+ 29B97325FDCFA39411CA2CEA,
+ 29B97324FDCFA39411CA2CEA,
+ );
+ isa = PBXGroup;
+ name = "Other Frameworks";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+//100
+//101
+//102
+//103
+//104
+//190
+//191
+//192
+//193
+//194
+ 19C28FACFE9D520D11CA2CBB = {
+ children = (
+ 8D1107320486CEB800E47090,
+ 3BE13C9406D3FD5D005DAB04,
+ );
+ isa = PBXGroup;
+ name = Products;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+//190
+//191
+//192
+//193
+//194
+//290
+//291
+//292
+//293
+//294
+ 29B97313FDCFA39411CA2CEA = {
+ buildSettings = {
+ };
+ buildStyles = (
+ 4A9504CCFFE6A4B311CA0CBA,
+ 4A9504CDFFE6A4B311CA0CBA,
+ );
+ hasScannedForEncodings = 1;
+ isa = PBXProject;
+ mainGroup = 29B97314FDCFA39411CA2CEA;
+ projectDirPath = "";
+ targets = (
+ 8D1107260486CEB800E47090,
+ 3BE13C9306D3FD5D005DAB04,
+ );
+ };
+ 29B97314FDCFA39411CA2CEA = {
+ children = (
+ 3BE13CAB06D3FDB2005DAB04,
+ 3BE13C9B06D3FDB2005DAB04,
+ 3B336D8A06D3DE8E003DCDCB,
+ 29B97315FDCFA39411CA2CEA,
+ 29B97323FDCFA39411CA2CEA,
+ 19C28FACFE9D520D11CA2CBB,
+ );
+ isa = PBXGroup;
+ name = iGoom;
+ path = "";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 29B97315FDCFA39411CA2CEA = {
+ children = (
+ 32CA4F630368D1EE00C91783,
+ );
+ isa = PBXGroup;
+ name = "Other Sources";
+ path = "";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 29B97323FDCFA39411CA2CEA = {
+ children = (
+ 3BA6971006D8B8EF007E5D2B,
+ 3BE13C7E06D3FAE8005DAB04,
+ 1058C7A0FEA54F0111CA2CBB,
+ 1058C7A2FEA54F0111CA2CBB,
+ );
+ isa = PBXGroup;
+ name = Frameworks;
+ path = "";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 29B97324FDCFA39411CA2CEA = {
+ isa = PBXFileReference;
+ lastKnownFileType = wrapper.framework;
+ name = AppKit.framework;
+ path = /System/Library/Frameworks/AppKit.framework;
+ refType = 0;
+ sourceTree = "<absolute>";
+ };
+ 29B97325FDCFA39411CA2CEA = {
+ isa = PBXFileReference;
+ lastKnownFileType = wrapper.framework;
+ name = Foundation.framework;
+ path = /System/Library/Frameworks/Foundation.framework;
+ refType = 0;
+ sourceTree = "<absolute>";
+ };
+//290
+//291
+//292
+//293
+//294
+//320
+//321
+//322
+//323
+//324
+ 32CA4F630368D1EE00C91783 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = iGoom_Prefix.pch;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+//320
+//321
+//322
+//323
+//324
+//3B0
+//3B1
+//3B2
+//3B3
+//3B4
+ 3B336C0906D1537B003DCDCB = {
+ isa = PBXFileReference;
+ lastKnownFileType = wrapper.framework;
+ name = OpenGL.framework;
+ path = /System/Library/Frameworks/OpenGL.framework;
+ refType = 0;
+ sourceTree = "<absolute>";
+ };
+ 3B336C0A06D1537B003DCDCB = {
+ fileRef = 3B336C0906D1537B003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336CD606D159F9003DCDCB = {
+ isa = PBXFileReference;
+ lastKnownFileType = wrapper.framework;
+ name = CoreAudio.framework;
+ path = /System/Library/Frameworks/CoreAudio.framework;
+ refType = 0;
+ sourceTree = "<absolute>";
+ };
+ 3B336CD706D159F9003DCDCB = {
+ fileRef = 3B336CD606D159F9003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336D8A06D3DE8E003DCDCB = {
+ children = (
+ 3B336D9A06D3DE8E003DCDCB,
+ 3B336D8B06D3DE8E003DCDCB,
+ 3B336D8C06D3DE8E003DCDCB,
+ 3B336D9D06D3DE8E003DCDCB,
+ 3B336D9E06D3DE8E003DCDCB,
+ 3BCD10C30798B01500910E20,
+ 3BCD10C40798B02D00910E20,
+ 3B336D9B06D3DE8E003DCDCB,
+ 3B336D9C06D3DE8E003DCDCB,
+ 3B336D9306D3DE8E003DCDCB,
+ 3B336D9406D3DE8E003DCDCB,
+ 3B336D9506D3DE8E003DCDCB,
+ 3B336D9606D3DE8E003DCDCB,
+ 3B336D9706D3DE8E003DCDCB,
+ 3B336D9806D3DE8E003DCDCB,
+ );
+ isa = PBXGroup;
+ path = StandAlone;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D8B06D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = AppController.h;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D8C06D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.objc;
+ path = AppController.m;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D8F06D3DE8E003DCDCB = {
+ children = (
+ 3B336D9006D3DE8E003DCDCB,
+ );
+ isa = PBXVariantGroup;
+ name = InfoPlist.strings;
+ path = "";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9006D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = text.plist.strings;
+ name = English;
+ path = English.lproj/InfoPlist.strings;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9106D3DE8E003DCDCB = {
+ children = (
+ 3B336D9206D3DE8E003DCDCB,
+ );
+ isa = PBXVariantGroup;
+ name = MainMenu.nib;
+ path = "";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9206D3DE8E003DCDCB = {
+ isa = PBXFileReference;
+ lastKnownFileType = wrapper.nib;
+ name = English;
+ path = English.lproj/MainMenu.nib;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9306D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = Goom.h;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9406D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.objc;
+ path = Goom.m;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9506D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = GoomFXParam.h;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9606D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.objc;
+ path = GoomFXParam.m;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9706D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = GoomFXView.h;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9806D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.objc;
+ path = GoomFXView.m;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9A06D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.objc;
+ path = main.m;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9B06D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = MainOpenGLView.h;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9C06D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.objc;
+ path = MainOpenGLView.m;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9D06D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = MyApplication.h;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9E06D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.objc;
+ path = MyApplication.m;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336D9F06D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = SoundSampler.h;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336DA006D3DE8E003DCDCB = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.cpp.objcpp;
+ path = SoundSampler.mm;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B336DA106D3DE8E003DCDCB = {
+ fileRef = 3B336D8B06D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DA206D3DE8E003DCDCB = {
+ fileRef = 3B336D8C06D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DA506D3DE8E003DCDCB = {
+ fileRef = 3B336D8F06D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DA606D3DE8E003DCDCB = {
+ fileRef = 3B336D9106D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DA706D3DE8E003DCDCB = {
+ fileRef = 3B336D9306D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DA806D3DE8E003DCDCB = {
+ fileRef = 3B336D9406D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DA906D3DE8E003DCDCB = {
+ fileRef = 3B336D9506D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DAA06D3DE8E003DCDCB = {
+ fileRef = 3B336D9606D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DAB06D3DE8E003DCDCB = {
+ fileRef = 3B336D9706D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DAC06D3DE8E003DCDCB = {
+ fileRef = 3B336D9806D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DAE06D3DE8E003DCDCB = {
+ fileRef = 3B336D9A06D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DAF06D3DE8E003DCDCB = {
+ fileRef = 3B336D9B06D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DB006D3DE8E003DCDCB = {
+ fileRef = 3B336D9C06D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DB106D3DE8E003DCDCB = {
+ fileRef = 3B336D9D06D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DB206D3DE8E003DCDCB = {
+ fileRef = 3B336D9E06D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DB306D3DE8E003DCDCB = {
+ fileRef = 3B336D9F06D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336DB406D3DE8E003DCDCB = {
+ fileRef = 3B336DA006D3DE8E003DCDCB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B336E1206D3F5D2003DCDCB = {
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ 3BA696BF06D7FAA2007E5D2B,
+ );
+ isa = PBXCopyFilesBuildPhase;
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 3B73A57E0798599C001B0B2B = {
+ isa = PBXFileReference;
+ lastKnownFileType = image.png;
+ name = goom2k4.png;
+ path = ../../goom2k4.png;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B73A57F0798599C001B0B2B = {
+ fileRef = 3B73A57E0798599C001B0B2B;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B73A60207986421001B0B2B = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = CoreAudioHardware.h;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B73A60307986421001B0B2B = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.cpp.cpp;
+ path = CoreAudioHardware.cpp;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B73A60407986421001B0B2B = {
+ fileRef = 3B73A60207986421001B0B2B;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B73A60507986421001B0B2B = {
+ fileRef = 3B73A60307986421001B0B2B;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B73A67107986CB2001B0B2B = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = CoreAudioDevice.h;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B73A67207986CB2001B0B2B = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.cpp.cpp;
+ path = CoreAudioDevice.cpp;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3B73A67307986CB2001B0B2B = {
+ fileRef = 3B73A67107986CB2001B0B2B;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3B73A67407986CB2001B0B2B = {
+ fileRef = 3B73A67207986CB2001B0B2B;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BA4F62007A1C93D00722D4D = {
+ fileRef = 3BA7946306D4005C0013ADCC;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BA696BE06D7FA9A007E5D2B = {
+ fileRef = 3BE13C7E06D3FAE8005DAB04;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BA696BF06D7FAA2007E5D2B = {
+ fileRef = 3BE13C7E06D3FAE8005DAB04;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BA6971006D8B8EF007E5D2B = {
+ isa = PBXFileReference;
+ lastKnownFileType = archive.ar;
+ name = libgoom2.0.a;
+ path = iTunes/libgoom2.0.a;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BA6971E06D8BCE9007E5D2B = {
+ fileRef = 3BA6971006D8B8EF007E5D2B;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BA7946306D4005C0013ADCC = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = text.xml;
+ path = "iGoom-StandAlone.plist";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BCD10A60798AF8300910E20 = {
+ children = (
+ 3BCD10A70798AF8300910E20,
+ );
+ isa = PBXVariantGroup;
+ name = Localizable.strings;
+ path = French.lproj;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BCD10A70798AF8300910E20 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = text.plist.strings;
+ name = French;
+ path = Localizable.strings;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BCD10A80798AF8300910E20 = {
+ fileRef = 3BCD10A60798AF8300910E20;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BCD10C30798B01500910E20 = {
+ children = (
+ 3B73A67107986CB2001B0B2B,
+ 3B73A67207986CB2001B0B2B,
+ 3B73A60207986421001B0B2B,
+ 3B73A60307986421001B0B2B,
+ 3B336D9F06D3DE8E003DCDCB,
+ 3B336DA006D3DE8E003DCDCB,
+ );
+ isa = PBXGroup;
+ name = AudioRecorder;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BCD10C40798B02D00910E20 = {
+ children = (
+ 3B73A57E0798599C001B0B2B,
+ 3BA7946306D4005C0013ADCC,
+ 3B336D8F06D3DE8E003DCDCB,
+ 3B336D9106D3DE8E003DCDCB,
+ 3BCD10A60798AF8300910E20,
+ 3BCD18E9079A034800910E20,
+ );
+ isa = PBXGroup;
+ name = Ressources;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BCD18E9079A034800910E20 = {
+ isa = PBXFileReference;
+ lastKnownFileType = image.icns;
+ path = icon.icns;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BCD18EA079A034800910E20 = {
+ fileRef = 3BCD18E9079A034800910E20;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BE13C7E06D3FAE8005DAB04 = {
+ isa = PBXFileReference;
+ lastKnownFileType = "compiled.mach-o.dylib";
+ name = libgoom2.0.dylib;
+ path = StandAlone/libgoom2.0.dylib;
+ refType = 2;
+ sourceTree = SOURCE_ROOT;
+ };
+ 3BE13C9006D3FD5D005DAB04 = {
+ buildActionMask = 2147483647;
+ files = (
+ 3BE13CAC06D3FDB2005DAB04,
+ 3BE13CAD06D3FDB2005DAB04,
+ 3BE13CAE06D3FDB2005DAB04,
+ 3BE13CB006D3FDB2005DAB04,
+ 3BE13CB106D3FDB2005DAB04,
+ );
+ isa = PBXResourcesBuildPhase;
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 3BE13C9106D3FD5D005DAB04 = {
+ buildActionMask = 2147483647;
+ files = (
+ 3BE13CAF06D3FDB2005DAB04,
+ 3BE13CBE06D3FE0D005DAB04,
+ 3BE13D6B06D3FF60005DAB04,
+ );
+ isa = PBXSourcesBuildPhase;
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 3BE13C9206D3FD5D005DAB04 = {
+ buildActionMask = 2147483647;
+ files = (
+ 3BE13CC806D3FE26005DAB04,
+ 3BA6971E06D8BCE9007E5D2B,
+ );
+ isa = PBXFrameworksBuildPhase;
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 3BE13C9306D3FD5D005DAB04 = {
+ buildPhases = (
+ 3BE13C9006D3FD5D005DAB04,
+ 3BE13C9106D3FD5D005DAB04,
+ 3BE13C9206D3FD5D005DAB04,
+ );
+ buildRules = (
+ );
+ buildSettings = {
+ DSTROOT = "$(USER_LIBRARY_DIR)/iTunes/iTunes Plug-ins/";
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
+ GENERATE_PKGINFO_FILE = YES;
+ HEADER_SEARCH_PATHS = "/usr/local/include/ ../";
+ INFOPLIST_FILE = "iTunes/iGoom-Info.plist";
+ INSTALL_PATH = "";
+ LIBRARY_SEARCH_PATHS = "$(SRCROOT)/iTunes";
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = "-framework Carbon";
+ OTHER_REZFLAGS = "";
+ PRODUCT_NAME = iGoom;
+ SECTORDER_FLAGS = "";
+ WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
+ };
+ dependencies = (
+ );
+ isa = PBXNativeTarget;
+ name = "iGoom - iTunes";
+ productName = iGoom;
+ productReference = 3BE13C9406D3FD5D005DAB04;
+ productSettingsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
+<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
+<plist version=\"1.0\">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>iGoom</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.yourcompany.iGoom</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>CSResourcesFileMapped</key>
+ <string>yes</string>
+</dict>
+</plist>
+";
+ productType = "com.apple.product-type.bundle";
+ };
+ 3BE13C9406D3FD5D005DAB04 = {
+ explicitFileType = wrapper.cfbundle;
+ includeInIndex = 0;
+ isa = PBXFileReference;
+ path = iGoom.bundle;
+ refType = 3;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3BE13C9506D3FD5D005DAB04 = {
+ isa = PBXFileReference;
+ lastKnownFileType = text.xml;
+ path = "iGoom-Info.plist";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13C9B06D3FDB2005DAB04 = {
+ children = (
+ 3BE13CBD06D3FE0D005DAB04,
+ 3BE13D6A06D3FF60005DAB04,
+ 3BE13C9C06D3FDB2005DAB04,
+ 3BE13C9E06D3FDB2005DAB04,
+ 3BE13CA006D3FDB2005DAB04,
+ 3BE13CA506D3FDB2005DAB04,
+ 3BE13C9506D3FD5D005DAB04,
+ );
+ isa = PBXGroup;
+ path = iTunes;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13C9C06D3FDB2005DAB04 = {
+ children = (
+ 3BE13C9D06D3FDB2005DAB04,
+ 3BE13CA206D3FDB2005DAB04,
+ );
+ isa = PBXVariantGroup;
+ name = About.strings;
+ path = "";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13C9D06D3FDB2005DAB04 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = text.plist.strings;
+ name = English;
+ path = English.lproj/About.strings;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13C9E06D3FDB2005DAB04 = {
+ children = (
+ 3BE13C9F06D3FDB2005DAB04,
+ 3BE13CA306D3FDB2005DAB04,
+ );
+ isa = PBXVariantGroup;
+ name = InfoPlist.strings;
+ path = "";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13C9F06D3FDB2005DAB04 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = text.plist.strings;
+ name = English;
+ path = English.lproj/InfoPlist.strings;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13CA006D3FDB2005DAB04 = {
+ children = (
+ 3BE13CA106D3FDB2005DAB04,
+ 3BE13CA406D3FDB2005DAB04,
+ );
+ isa = PBXVariantGroup;
+ name = SettingsDialog.nib;
+ path = "";
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13CA106D3FDB2005DAB04 = {
+ isa = PBXFileReference;
+ lastKnownFileType = wrapper.nib;
+ name = English;
+ path = English.lproj/SettingsDialog.nib;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13CA206D3FDB2005DAB04 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = text.plist.strings;
+ name = French;
+ path = French.lproj/About.strings;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13CA306D3FDB2005DAB04 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = text.plist.strings;
+ name = French;
+ path = French.lproj/InfoPlist.strings;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13CA406D3FDB2005DAB04 = {
+ isa = PBXFileReference;
+ lastKnownFileType = wrapper.nib;
+ name = French;
+ path = French.lproj/SettingsDialog.nib;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13CA506D3FDB2005DAB04 = {
+ children = (
+ 3BE13CA606D3FDB2005DAB04,
+ 3BE13CA706D3FDB2005DAB04,
+ 3BE13CA806D3FDB2005DAB04,
+ );
+ isa = PBXGroup;
+ path = iTuneVisualAPI;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13CA606D3FDB2005DAB04 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
+ path = iTunesAPI.c;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13CA706D3FDB2005DAB04 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = iTunesAPI.h;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13CA806D3FDB2005DAB04 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = iTunesVisualAPI.h;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13CAB06D3FDB2005DAB04 = {
+ isa = PBXFileReference;
+ lastKnownFileType = text.rtf;
+ path = ReadMe.rtf;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13CAC06D3FDB2005DAB04 = {
+ fileRef = 3BE13C9C06D3FDB2005DAB04;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BE13CAD06D3FDB2005DAB04 = {
+ fileRef = 3BE13C9E06D3FDB2005DAB04;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BE13CAE06D3FDB2005DAB04 = {
+ fileRef = 3BE13CA006D3FDB2005DAB04;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BE13CAF06D3FDB2005DAB04 = {
+ fileRef = 3BE13CA606D3FDB2005DAB04;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BE13CB006D3FDB2005DAB04 = {
+ fileRef = 3BE13CA706D3FDB2005DAB04;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BE13CB106D3FDB2005DAB04 = {
+ fileRef = 3BE13CA806D3FDB2005DAB04;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BE13CBD06D3FE0D005DAB04 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
+ path = iGoom.c;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13CBE06D3FE0D005DAB04 = {
+ fileRef = 3BE13CBD06D3FE0D005DAB04;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BE13CC706D3FE26005DAB04 = {
+ isa = PBXFileReference;
+ lastKnownFileType = wrapper.framework;
+ name = Carbon.framework;
+ path = /System/Library/Frameworks/Carbon.framework;
+ refType = 0;
+ sourceTree = "<absolute>";
+ };
+ 3BE13CC806D3FE26005DAB04 = {
+ fileRef = 3BE13CC706D3FE26005DAB04;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 3BE13D6A06D3FF60005DAB04 = {
+ fileEncoding = 4;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.asm;
+ path = ppc_doubling.s;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 3BE13D6B06D3FF60005DAB04 = {
+ fileRef = 3BE13D6A06D3FF60005DAB04;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+//3B0
+//3B1
+//3B2
+//3B3
+//3B4
+//4A0
+//4A1
+//4A2
+//4A3
+//4A4
+ 4A9504CCFFE6A4B311CA0CBA = {
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ ZERO_LINK = YES;
+ };
+ isa = PBXBuildStyle;
+ name = Development;
+ };
+ 4A9504CDFFE6A4B311CA0CBA = {
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ ZERO_LINK = NO;
+ };
+ isa = PBXBuildStyle;
+ name = Deployment;
+ };
+//4A0
+//4A1
+//4A2
+//4A3
+//4A4
+//8D0
+//8D1
+//8D2
+//8D3
+//8D4
+ 8D1107260486CEB800E47090 = {
+ buildPhases = (
+ 8D1107290486CEB800E47090,
+ 8D11072C0486CEB800E47090,
+ 8D11072E0486CEB800E47090,
+ 3B336E1206D3F5D2003DCDCB,
+ );
+ buildRules = (
+ );
+ buildSettings = {
+ GCC_DYNAMIC_NO_PIC = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = Standalone/iGoom_Prefix.pch;
+ HEADER_SEARCH_PATHS = "/usr/local/include/ ../";
+ INFOPLIST_FILE = "StandAlone/iGoom-StandAlone.plist";
+ INSTALL_PATH = "$(HOME)/Applications";
+ LIBRARY_SEARCH_PATHS = "$(SRCROOT)/StandAlone";
+ LIBRARY_STYLE = STATIC;
+ OTHER_LDFLAGS = "";
+ PRODUCT_NAME = iGoom;
+ WRAPPER_EXTENSION = app;
+ };
+ dependencies = (
+ );
+ isa = PBXNativeTarget;
+ name = "iGoom - StandAlone";
+ productInstallPath = "$(HOME)/Applications";
+ productName = iGoom;
+ productReference = 8D1107320486CEB800E47090;
+ productType = "com.apple.product-type.application";
+ };
+ 8D1107290486CEB800E47090 = {
+ buildActionMask = 2147483647;
+ files = (
+ 3B336DA106D3DE8E003DCDCB,
+ 3B336DA506D3DE8E003DCDCB,
+ 3B336DA606D3DE8E003DCDCB,
+ 3B336DA706D3DE8E003DCDCB,
+ 3B336DA906D3DE8E003DCDCB,
+ 3B336DAB06D3DE8E003DCDCB,
+ 3B336DAF06D3DE8E003DCDCB,
+ 3B336DB106D3DE8E003DCDCB,
+ 3B336DB306D3DE8E003DCDCB,
+ 3B73A57F0798599C001B0B2B,
+ 3B73A60407986421001B0B2B,
+ 3B73A67307986CB2001B0B2B,
+ 3BCD10A80798AF8300910E20,
+ 3BCD18EA079A034800910E20,
+ 3BA4F62007A1C93D00722D4D,
+ );
+ isa = PBXResourcesBuildPhase;
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 8D11072C0486CEB800E47090 = {
+ buildActionMask = 2147483647;
+ files = (
+ 3B336DA206D3DE8E003DCDCB,
+ 3B336DA806D3DE8E003DCDCB,
+ 3B336DAA06D3DE8E003DCDCB,
+ 3B336DAC06D3DE8E003DCDCB,
+ 3B336DAE06D3DE8E003DCDCB,
+ 3B336DB006D3DE8E003DCDCB,
+ 3B336DB206D3DE8E003DCDCB,
+ 3B336DB406D3DE8E003DCDCB,
+ 3B73A60507986421001B0B2B,
+ 3B73A67407986CB2001B0B2B,
+ );
+ isa = PBXSourcesBuildPhase;
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 8D11072E0486CEB800E47090 = {
+ buildActionMask = 2147483647;
+ files = (
+ 8D11072F0486CEB800E47090,
+ 3B336C0A06D1537B003DCDCB,
+ 3B336CD706D159F9003DCDCB,
+ 3BA696BE06D7FA9A007E5D2B,
+ );
+ isa = PBXFrameworksBuildPhase;
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 8D11072F0486CEB800E47090 = {
+ fileRef = 1058C7A1FEA54F0111CA2CBB;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 8D1107320486CEB800E47090 = {
+ explicitFileType = wrapper.application;
+ includeInIndex = 0;
+ isa = PBXFileReference;
+ path = iGoom.app;
+ refType = 3;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/About.strings b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/About.strings
new file mode 100755
index 0000000000..da13a7f257
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/About.strings
@@ -0,0 +1,3 @@
+/* Localized versions of about strings */
+
+"AboutString" = "Made by Jeko, Gyom and Fred\n \nKeys :\nQ to switch Quality (Pixel Doubling)\nF to toggle frame rate display\nT to disable this display\n< and > to change sensitivity\n \nContact : Gyom (gyom@ios-software.com)";
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings
new file mode 100755
index 0000000000..a782e35463
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings
@@ -0,0 +1,7 @@
+/* Localized versions of Info.plist keys */
+
+CFBundleName = "iGoom";
+CFBundleShortVersionString = "2.0";
+CFBundleGetInfoString = "iGoom version 2.0, Copyright 2001/2003, iOS.";
+NSHumanReadableCopyright = "Copyright 2001/2003, iOS.";
+CFBundleVersion = "2.0"; \ No newline at end of file
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib
new file mode 100755
index 0000000000..ea58db1189
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib
@@ -0,0 +1,4 @@
+{
+IBClasses = ();
+IBVersion = 1;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib
new file mode 100755
index 0000000000..af29c6e4a1
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IBDocumentLocation</key>
+ <string>123 115 356 240 0 0 1280 1002 </string>
+ <key>IBFramework Version</key>
+ <string>364.0</string>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>166</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>7M34</string>
+ <key>targetFramework</key>
+ <string>IBCarbonFramework</string>
+</dict>
+</plist>
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib
new file mode 100755
index 0000000000..a1bd3ab781
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib
@@ -0,0 +1,138 @@
+<?xml version="1.0" standalone="yes"?>
+<object class="NSIBObjectData">
+ <string name="targetFramework">IBCarbonFramework</string>
+ <object name="rootObject" class="NSCustomObject" id="1">
+ <string name="customClass">NSApplication</string>
+ </object>
+ <array count="12" name="allObjects">
+ <object class="IBCarbonWindow" id="166">
+ <string name="windowRect">226 360 483 751 </string>
+ <string name="title">Settings</string>
+ <object name="rootControl" class="IBCarbonRootControl" id="167">
+ <string name="bounds">0 0 257 391 </string>
+ <string name="viewFrame">0 0 391 257 </string>
+ <array count="10" name="subviews">
+ <object class="IBCarbonGroupBox" id="208">
+ <string name="bounds">20 20 143 170 </string>
+ <string name="viewFrame">20 20 150 123 </string>
+ <boolean name="primary">FALSE</boolean>
+ </object>
+ <object class="IBCarbonCheckBox" id="180">
+ <string name="bounds">20 194 38 351 </string>
+ <string name="viewFrame">194 20 157 18 </string>
+ <ostype name="controlSignature">cbox</ostype>
+ <int name="controlID">2</int>
+ <string name="title">Pixel doubling (Q)</string>
+ </object>
+ <object class="IBCarbonButton" id="184">
+ <string name="bounds">217 163 237 233 </string>
+ <string name="viewFrame">163 217 70 20 </string>
+ <int name="controlID">1</int>
+ <string name="title">OK</string>
+ <ostype name="command">ok </ostype>
+ <int name="buttonType">1</int>
+ </object>
+ <object class="IBCarbonStaticText" id="185">
+ <string name="bounds">72 20 86 170 </string>
+ <string name="viewFrame">20 72 150 14 </string>
+ <string name="title">iGoom 2k4</string>
+ <int name="justification">1</int>
+ </object>
+ <object class="IBCarbonStaticText" id="199">
+ <string name="bounds">189 30 205 361 </string>
+ <string name="viewFrame">30 189 331 16 </string>
+ <string name="title">http://www.ios-software.com/</string>
+ <int name="justification">1</int>
+ </object>
+ <object class="IBCarbonCheckBox" id="201">
+ <string name="bounds">46 194 60 351 </string>
+ <string name="viewFrame">194 46 157 14 </string>
+ <ostype name="controlSignature">cbox</ostype>
+ <int name="controlID">3</int>
+ <string name="title">Show frame rate (F)</string>
+ </object>
+ <object class="IBCarbonStaticText" id="203">
+ <string name="bounds">165 30 181 361 </string>
+ <string name="viewFrame">30 165 331 16 </string>
+ <string name="title">Support and bug report : gyom@ios-software.com</string>
+ <int name="justification">1</int>
+ </object>
+ <object class="IBCarbonSlider" id="204">
+ <string name="bounds">119 193 145 371 </string>
+ <string name="viewFrame">193 119 178 26 </string>
+ <ostype name="controlSignature">slid</ostype>
+ <int name="controlID">4</int>
+ <boolean name="isLive">TRUE</boolean>
+ <int name="numTickMarks">11</int>
+ <int name="initialValue">160</int>
+ <int name="minimumValue">70</int>
+ <int name="maximumValue">250</int>
+ </object>
+ <object class="IBCarbonStaticText" id="205">
+ <string name="bounds">99 194 115 371 </string>
+ <string name="viewFrame">194 99 177 16 </string>
+ <string name="title">Sensitivity (&lt; and &gt;) :</string>
+ </object>
+ <object class="IBCarbonCheckBox" id="209">
+ <string name="bounds">68 194 82 371 </string>
+ <string name="viewFrame">194 68 177 14 </string>
+ <ostype name="controlSignature">cbox</ostype>
+ <int name="controlID">5</int>
+ <string name="title">Show infos when idle (T)</string>
+ </object>
+ </array>
+ </object>
+ <boolean name="receiveActivates">FALSE</boolean>
+ <boolean name="receiveUpdates">FALSE</boolean>
+ <boolean name="hasCollapseBox">FALSE</boolean>
+ <boolean name="hasHorizontalZoom">FALSE</boolean>
+ <boolean name="isResizable">FALSE</boolean>
+ <boolean name="hasVerticalZoom">FALSE</boolean>
+ <boolean name="compositing">TRUE</boolean>
+ <int name="carbonWindowClass">4</int>
+ <int name="windowPosition">1</int>
+ </object>
+ <reference idRef="167"/>
+ <reference idRef="180"/>
+ <reference idRef="184"/>
+ <reference idRef="185"/>
+ <reference idRef="199"/>
+ <reference idRef="201"/>
+ <reference idRef="203"/>
+ <reference idRef="204"/>
+ <reference idRef="205"/>
+ <reference idRef="208"/>
+ <reference idRef="209"/>
+ </array>
+ <array count="12" name="allParents">
+ <reference idRef="1"/>
+ <reference idRef="166"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ </array>
+ <dictionary count="7" name="nameTable">
+ <string>File&apos;s Owner</string>
+ <reference idRef="1"/>
+ <string>IBCarbonButton</string>
+ <reference idRef="184"/>
+ <string>IBCarbonCheckBox</string>
+ <reference idRef="180"/>
+ <string>IBCarbonStaticText</string>
+ <reference idRef="185"/>
+ <string>IBCarbonStaticText21</string>
+ <reference idRef="199"/>
+ <string>IBCarbonStaticText211</string>
+ <reference idRef="203"/>
+ <string>PluginSettings</string>
+ <reference idRef="166"/>
+ </dictionary>
+ <unsigned_int name="nextObjectID">210</unsigned_int>
+</object>
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/About.strings b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/About.strings
new file mode 100755
index 0000000000..04effbffcd
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/About.strings
@@ -0,0 +1,3 @@
+/* Localized versions of about strings */
+
+"AboutString" = "Ecrit par Jeko, Gyom et Fred\n \nTouches :\nQ pour changer de qualite\nF pour voir la frequence d'affichage\nT pour desactiver cet affichage\n< et > pour modifier la sensibilite\n \nContact : Gyom (gyom@ios-software.com)";
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings
new file mode 100755
index 0000000000..a782e35463
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings
@@ -0,0 +1,7 @@
+/* Localized versions of Info.plist keys */
+
+CFBundleName = "iGoom";
+CFBundleShortVersionString = "2.0";
+CFBundleGetInfoString = "iGoom version 2.0, Copyright 2001/2003, iOS.";
+NSHumanReadableCopyright = "Copyright 2001/2003, iOS.";
+CFBundleVersion = "2.0"; \ No newline at end of file
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib
new file mode 100755
index 0000000000..ea58db1189
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib
@@ -0,0 +1,4 @@
+{
+IBClasses = ();
+IBVersion = 1;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib
new file mode 100755
index 0000000000..af29c6e4a1
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IBDocumentLocation</key>
+ <string>123 115 356 240 0 0 1280 1002 </string>
+ <key>IBFramework Version</key>
+ <string>364.0</string>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>166</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>7M34</string>
+ <key>targetFramework</key>
+ <string>IBCarbonFramework</string>
+</dict>
+</plist>
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib
new file mode 100755
index 0000000000..b36e6fc27f
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib
@@ -0,0 +1,138 @@
+<?xml version="1.0" standalone="yes"?>
+<object class="NSIBObjectData">
+ <string name="targetFramework">IBCarbonFramework</string>
+ <object name="rootObject" class="NSCustomObject" id="1">
+ <string name="customClass">NSApplication</string>
+ </object>
+ <array count="12" name="allObjects">
+ <object class="IBCarbonWindow" id="166">
+ <string name="windowRect">61 758 318 1149 </string>
+ <string name="title">Réglages</string>
+ <object name="rootControl" class="IBCarbonRootControl" id="167">
+ <string name="bounds">0 0 257 391 </string>
+ <string name="viewFrame">0 0 391 257 </string>
+ <array count="10" name="subviews">
+ <object class="IBCarbonGroupBox" id="208">
+ <string name="bounds">20 20 143 170 </string>
+ <string name="viewFrame">20 20 150 123 </string>
+ <boolean name="primary">FALSE</boolean>
+ </object>
+ <object class="IBCarbonCheckBox" id="180">
+ <string name="bounds">20 194 38 371 </string>
+ <string name="viewFrame">194 20 177 18 </string>
+ <ostype name="controlSignature">cbox</ostype>
+ <int name="controlID">2</int>
+ <string name="title">Pixels doublés (Q)</string>
+ </object>
+ <object class="IBCarbonButton" id="184">
+ <string name="bounds">217 163 237 233 </string>
+ <string name="viewFrame">163 217 70 20 </string>
+ <int name="controlID">1</int>
+ <string name="title">OK</string>
+ <ostype name="command">ok </ostype>
+ <int name="buttonType">1</int>
+ </object>
+ <object class="IBCarbonStaticText" id="185">
+ <string name="bounds">72 20 86 170 </string>
+ <string name="viewFrame">20 72 150 14 </string>
+ <string name="title">iGoom 2k4</string>
+ <int name="justification">1</int>
+ </object>
+ <object class="IBCarbonStaticText" id="199">
+ <string name="bounds">189 30 205 361 </string>
+ <string name="viewFrame">30 189 331 16 </string>
+ <string name="title">http://www.ios-software.com/</string>
+ <int name="justification">1</int>
+ </object>
+ <object class="IBCarbonCheckBox" id="201">
+ <string name="bounds">46 194 60 371 </string>
+ <string name="viewFrame">194 46 177 14 </string>
+ <ostype name="controlSignature">cbox</ostype>
+ <int name="controlID">3</int>
+ <string name="title">Fréquence d&apos;affichage (F)</string>
+ </object>
+ <object class="IBCarbonStaticText" id="203">
+ <string name="bounds">165 20 181 371 </string>
+ <string name="viewFrame">20 165 351 16 </string>
+ <string name="title">Support et retours de bugs : gyom@ios-software.com</string>
+ <int name="justification">1</int>
+ </object>
+ <object class="IBCarbonSlider" id="204">
+ <string name="bounds">119 193 145 371 </string>
+ <string name="viewFrame">193 119 178 26 </string>
+ <ostype name="controlSignature">slid</ostype>
+ <int name="controlID">4</int>
+ <boolean name="isLive">TRUE</boolean>
+ <int name="numTickMarks">11</int>
+ <int name="initialValue">160</int>
+ <int name="minimumValue">70</int>
+ <int name="maximumValue">250</int>
+ </object>
+ <object class="IBCarbonStaticText" id="205">
+ <string name="bounds">99 194 115 371 </string>
+ <string name="viewFrame">194 99 177 16 </string>
+ <string name="title">Sensibilité (&lt; et &gt;) :</string>
+ </object>
+ <object class="IBCarbonCheckBox" id="209">
+ <string name="bounds">68 194 82 371 </string>
+ <string name="viewFrame">194 68 177 14 </string>
+ <ostype name="controlSignature">cbox</ostype>
+ <int name="controlID">5</int>
+ <string name="title">Afficher les infos (T)</string>
+ </object>
+ </array>
+ </object>
+ <boolean name="receiveActivates">FALSE</boolean>
+ <boolean name="receiveUpdates">FALSE</boolean>
+ <boolean name="hasCollapseBox">FALSE</boolean>
+ <boolean name="hasHorizontalZoom">FALSE</boolean>
+ <boolean name="isResizable">FALSE</boolean>
+ <boolean name="hasVerticalZoom">FALSE</boolean>
+ <boolean name="compositing">TRUE</boolean>
+ <int name="carbonWindowClass">4</int>
+ <int name="windowPosition">1</int>
+ </object>
+ <reference idRef="167"/>
+ <reference idRef="180"/>
+ <reference idRef="184"/>
+ <reference idRef="185"/>
+ <reference idRef="199"/>
+ <reference idRef="201"/>
+ <reference idRef="203"/>
+ <reference idRef="204"/>
+ <reference idRef="205"/>
+ <reference idRef="208"/>
+ <reference idRef="209"/>
+ </array>
+ <array count="12" name="allParents">
+ <reference idRef="1"/>
+ <reference idRef="166"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ </array>
+ <dictionary count="7" name="nameTable">
+ <string>File&apos;s Owner</string>
+ <reference idRef="1"/>
+ <string>IBCarbonButton</string>
+ <reference idRef="184"/>
+ <string>IBCarbonCheckBox</string>
+ <reference idRef="180"/>
+ <string>IBCarbonStaticText</string>
+ <reference idRef="185"/>
+ <string>IBCarbonStaticText21</string>
+ <reference idRef="199"/>
+ <string>IBCarbonStaticText211</string>
+ <reference idRef="203"/>
+ <string>PluginSettings</string>
+ <reference idRef="166"/>
+ </dictionary>
+ <unsigned_int name="nextObjectID">210</unsigned_int>
+</object>
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/Installer.applescript b/src/visualizations/Goom/goom2k4-0/mac/iTunes/Installer.applescript
new file mode 100644
index 0000000000..ca1af282df
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/Installer.applescript
@@ -0,0 +1 @@
+(* iTunes installer script for iGoom *) (* If application is running, warn and quit it *) set pid to do shell script "ps -U ${USER} | grep /Applications/iTunes.app/Contents/MacOS/iTunes | grep -v grep | cut -c1-5" if pid is not "" then display dialog "iTunes must not be running while installing. Can I quit it?" with icon 2 tell application "iTunes" quit end tell end if (* Install the new plugin *) set cmd to "\\rm -rf ~/\"Library/iTunes/iTunes Plug-ins\"iGoom.bundle" do shell script cmd set r to "err" set cmd to "\\cp -Rf /Volumes/iGoom/iGoom.bundle ~/\"Library/iTunes/iTunes Plug-ins\"" try do shell script cmd set r to "" end try if r is not "" then (* Troubleshooting *) display dialog "There was a problem during installation." buttons {"Open ReadMe", "Forum", "OK"} default button 1 with icon 0 set dresult to button returned of result if dresult is "Open ReadMe" then do shell script "open /Volumes/iGoom/ReadMe.rtf" else if dresult is "Forum" then open location "http://www.ios-software.com/?page=forum&quoi=1" end if end if else (* relaunch, but not too quickly ! *) set relaunched to false repeat until relaunched is true try tell application "iTunes" activate end tell set relaunched to true end try end repeat (* Select the new plugin et show it if possible *) tell application "iTunes" repeat with i in visuals if name of i is "iGoom" then set current visual to i try set full screen to false set visuals enabled to true play first item of library playlists end try end if end repeat end tell (* Tell the user the plugin was successfully installed *) activate display dialog "Installation was successful. If you like Goom, consider donating or buying some goodies !" buttons {"iOS Store", "Donate", "Use Goom"} default button "iOS Store" with icon 1 set dresult to button returned of result if dresult is "iOS Store" then open location "http://www.cafepress.com/iossoftware" end if if dresult is "Donate" then open location "http://www.ios-software.com/?page=index&what=about" end if if dresult is "Use Goom" then tell application "iTunes" activate end tell end if end if \ No newline at end of file
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom-Info.plist b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom-Info.plist
new file mode 100755
index 0000000000..9e574906e7
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom-Info.plist
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>iGoom</string>
+ <key>CFBundleGetInfoString</key>
+ <string>2k4 iGoom for iTunes © gyom &amp; jeko / iOS</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.ios.igoom</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>iGoom !</string>
+ <key>CFBundlePackageType</key>
+ <string>hvpl</string>
+ <key>CFBundleShortVersionString</key>
+ <string>2.4.1</string>
+ <key>CFBundleSignature</key>
+ <string>hook</string>
+ <key>CFBundleVersion</key>
+ <string>2.4.2</string>
+ <key>CFPlugInDynamicRegisterFunction</key>
+ <string></string>
+ <key>CFPlugInDynamicRegistration</key>
+ <string>NO</string>
+ <key>CFPlugInFactories</key>
+ <dict>
+ <key>00000000-0000-0000-0000-000000000000</key>
+ <string>MyFactoryFunction</string>
+ </dict>
+ <key>CFPlugInTypes</key>
+ <dict>
+ <key>00000000-0000-0000-0000-000000000000</key>
+ <array>
+ <string>00000000-0000-0000-0000-000000000000</string>
+ </array>
+ </dict>
+ <key>CFPlugInUnloadFunction</key>
+ <string></string>
+ <key>NSMainNibFile</key>
+ <string></string>
+</dict>
+</plist>
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom.c b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom.c
new file mode 100755
index 0000000000..28deaa10d4
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom.c
@@ -0,0 +1,896 @@
+// includes
+#include <stdio.h>
+#include "iTunesVisualAPI.h"
+#include "iTunesAPI.h"
+#include "src/goom.h"
+#include <CoreFoundation/CFBundle.h>
+#include <Carbon/Carbon.h>
+
+//*****************************************************
+#include <stdlib.h>
+#include <string.h>
+//*****************************************************
+
+CFStringRef CFBundleIdentifier;
+
+extern void ppc_doubling(unsigned int,UInt32 *,UInt32 *,UInt32 *,UInt32,UInt32);
+
+// typedef's, struct's, enum's, etc.
+#define kTVisualPluginName "\piGoom"
+#define kTVisualPluginCreator 'gyom'
+#define kTVisualPluginMajorVersion 2
+#define kTVisualPluginMinorVersion 4
+#define kTVisualPluginReleaseStage betaStage
+#define kTVisualPluginNonFinalRelease 1
+
+#define VERSION "2k4"
+
+#define kPixelDoublingPrefName "PixelDoubling"
+#define kShowFPSPrefName "ShowFPS"
+#define kSensitivityPrefName "Sensitivity"
+#define kShowAboutWhenIdlePrefName "ShowAboutWhenIdle"
+
+//#define Timers
+
+enum
+{
+ kOKSettingID = 1,
+ kPixelDoublingSettingID = 2,
+ kFrameRateSettingID = 3,
+ kSensitivitySettingID = 4,
+ kShowAboutWhenIdleSettingID = 5
+};
+
+typedef struct VisualPluginData {
+ void * appCookie;
+ ITAppProcPtr appProc;
+ ITFileSpec pluginFileSpec;
+
+ CGrafPtr destPort;
+ Rect destRect;
+ OptionBits destOptions;
+ UInt32 destBitDepth;
+
+ ITTrackInfo trackInfo;
+ ITStreamInfo streamInfo;
+
+ Boolean playing;
+
+ // Plugin-specific data
+ GWorldPtr offscreen;
+ signed short data[2][512];
+} VisualPluginData;
+
+
+// local (static) globals
+//static unsigned int useSpectrum = 0;
+static CGrafPtr gSavePort;
+static GDHandle gSaveDevice;
+static unsigned int changeRes = FALSE;
+static unsigned int oldx = 0, oldy = 0;
+static signed int forced = 0;
+static unsigned int showFPS = 0;
+static int showTexte = 0, showTitle = 1;
+static Boolean doublePixels = true;
+static int sensitivity = 160;
+static int ShowAboutWhenIdle = 0;
+static AbsoluteTime backUpTime;
+static char * aboutMessage;
+
+static PluginInfo * goomInfo;
+
+
+// exported function prototypes
+extern OSStatus iTunesPluginMainMachO(OSType message,PluginMessageInfo *messageInfo,void *refCon);
+
+// Calcul de diff de temps
+#ifdef Timers
+static void HowLong(const char* text)
+{
+ AbsoluteTime absTime;
+ Nanoseconds nanosec;
+
+ absTime = SubAbsoluteFromAbsolute(UpTime(), backUpTime);
+ nanosec = AbsoluteToNanoseconds(absTime);
+ fprintf(stderr,"Time for %s: %f\n", text, (float) UnsignedWideToUInt64( nanosec ) / 1000000.0);
+ backUpTime = UpTime();
+}
+#else
+#define HowLong(a)
+#endif
+
+// ProcessRenderData --> preprocessing des donnees en entrŽe
+static void ProcessRenderData(VisualPluginData *visualPluginData,const RenderVisualData *renderData)
+{
+ SInt16 index;
+ SInt32 channel;
+
+ if (renderData == nil)
+ {
+ bzero(&visualPluginData->data,sizeof(visualPluginData->data));
+ return;
+ }
+ else
+ {
+ for (channel = 0;channel < 2;channel++)
+ {
+ for (index = 0; index < 512; index++)
+ visualPluginData->data[channel][index] = (renderData->waveformData[channel][index]-127)*sensitivity;
+ }
+ }
+}
+
+// GetPortCopyBitsBitMap
+//
+static BitMap* GetPortCopyBitsBitMap(CGrafPtr port)
+{
+ BitMap* destBMap;
+
+#if ACCESSOR_CALLS_ARE_FUNCTIONS
+ destBMap = (BitMap*)GetPortBitMapForCopyBits(port);
+#else
+#if OPAQUE_TOOLBOX_STRUCTS
+ PixMapHandle pixMap;
+
+ pixMap = GetPortPixMap(port);
+ destBMap = (BitMap*) (*pixMap);
+#else
+ destBMap = (BitMap*) &((GrafPtr)port)->portBits;
+#endif
+#endif
+ return destBMap;
+}
+
+// RenderVisualPort
+/* OK, This is pretty weird : if we are not in pixel doubling mode,
+the goom internal buffer is copied on destPort via CopyBits().
+Now, if we are in pixel doubling mode : if we are full screen,
+the goom internal buffer is copied on another buffer with ppc_doubling()
+and then to destPort with CopyBits().*/
+
+char * Str255ToC(Str255 source)
+{
+ static char dst[255];
+ char * cur = dst, * src = (char*)source;
+ int i;
+ int size = *src;
+ if (source == NULL) return "";
+ src++;
+ for (i=0; i<size; i++)
+ {
+ *cur = *src;
+ switch (*cur)
+ {
+ case 'Ë' :
+ *cur = 'A';
+ break;
+ case 'ˆ' :
+ case '‡' :
+ case 'Š' :
+ case '‰' :
+ *cur = 'a';
+ break;
+ case 'æ' :
+ case 'é' :
+ case 'ƒ' :
+ *cur = 'E';
+ break;
+ case 'Ž' :
+ case '' :
+ case '' :
+ case '‘' :
+ *cur = 'e';
+ break;
+ case '“' :
+ case '•' :
+ case '”' :
+ case '’' :
+ *cur = 'i';
+ break;
+ case '–' :
+ *cur = 'n';
+ break;
+ case '' :
+ *cur = 'c';
+ break;
+ case '˜' :
+ case '—' :
+ case 'š' :
+ case '™' :
+ *cur = 'o';
+ break;
+ case '' :
+ case 'œ' :
+ case 'ž' :
+ case 'Ÿ' :
+ *cur = 'u';
+ break;
+ default : break;
+ }
+ src++;
+ cur++;
+ }
+ *cur = 0;
+ return dst;
+}
+
+static void RenderVisualPort(VisualPluginData *visualPluginData,CGrafPtr destPort,const Rect *destRect,Boolean onlyUpdate)
+{
+ BitMap* srcBitMap;
+ BitMap* dstBitMap;
+ unsigned int right, bottom;
+ Rect srcRect= *destRect;
+ Rect dstRect = srcRect;
+ int fullscreen;
+ static GWorldPtr offscreen;
+ PixMapHandle pixMapHdl = GetGWorldPixMap(visualPluginData->offscreen);
+ Point pt = {0,0};
+ static float fpssampler = 0;
+ static char textBuffer[15];
+ static char titleBuffer[255];
+ unsigned char * str, * str2;
+
+ AbsoluteTime absTime;
+ Nanoseconds nanosec;
+
+ LocalToGlobal(&pt);
+ fullscreen = (pt.v == 0);
+
+ if ((NULL == destPort) || (NULL == destRect) || (NULL == visualPluginData->offscreen)) return;
+
+ absTime = SubAbsoluteFromAbsolute(UpTime(), backUpTime);
+ nanosec = AbsoluteToNanoseconds(absTime);
+ fpssampler = 1000000000.0 / (float) UnsignedWideToUInt64( nanosec );
+ if (fpssampler>35) return;
+ backUpTime = UpTime();
+
+
+ GetGWorld(&gSavePort,&gSaveDevice);
+ SetGWorld(destPort,nil);
+
+ srcBitMap = GetPortCopyBitsBitMap(visualPluginData->offscreen);
+ dstBitMap = GetPortCopyBitsBitMap(destPort);
+
+ OffsetRect(&srcRect,-srcRect.left,-srcRect.top);
+ if (!pixMapHdl || !*pixMapHdl) return;
+
+ right = srcRect.right;
+ bottom = srcRect.bottom;
+ if ((right<2) || (bottom<2)) return;
+
+ // Update our offscreen pixmap
+ if ((changeRes) || (oldx != right) || (oldy != bottom))
+ {
+ if (doublePixels)
+ goom_set_resolution (goomInfo,right%2 + right/2, bottom/2 + bottom%2);
+ else
+ goom_set_resolution (goomInfo,right, bottom);
+ oldx = right;
+ oldy = bottom;
+ changeRes = FALSE;
+ }
+
+ str2 = NULL;
+ if (showTitle == 0)
+ {
+ strcpy(titleBuffer, Str255ToC(visualPluginData->trackInfo.name));
+ str2 = titleBuffer;
+ str = " ";
+ showTexte = 10000;
+ }
+ else
+ {
+ if (ShowAboutWhenIdle)
+ {
+ switch (showTexte)
+ {
+ case 0:
+ str2 = " ";
+ sprintf(textBuffer,"The iGoom %s",VERSION);
+ str = textBuffer;
+ break;
+ case 500:
+ str = "http://www.ios-software.com/";
+ break;
+ case 1000 :
+ str = aboutMessage;
+ break;
+ default :
+ str = NULL;
+ break;
+ }
+ }
+ else
+ {
+ str = " ";
+ }
+ }
+
+ if (doublePixels)
+ {
+ UInt32 rowBytes = (GetPixRowBytes(pixMapHdl))>>2;
+ register UInt32 *myX = (UInt32*) GetPixBaseAddr(pixMapHdl);
+ register UInt32 inc = 2*rowBytes - right - right%2;
+ register UInt32 *myx = (UInt32*) goom_update (goomInfo,visualPluginData->data,forced,(showFPS > 0)?fpssampler:-1,str2,str);
+
+ ppc_doubling(right/2 + right%2, myx, myX, myX + rowBytes, bottom/2,inc*4);
+ srcBitMap = GetPortCopyBitsBitMap(visualPluginData->offscreen);
+ CopyBits(srcBitMap,dstBitMap,&srcRect,&dstRect,srcCopy,nil);
+ }
+ else
+ {
+ NewGWorldFromPtr(&offscreen, k32ARGBPixelFormat,&srcRect, NULL, NULL, 0, (Ptr) goom_update (goomInfo,visualPluginData->data,forced, (showFPS > 0)?fpssampler:-1, str2, str), right*4);
+ HowLong("Goom");
+ srcBitMap = GetPortCopyBitsBitMap(offscreen);
+ CopyBits(srcBitMap,dstBitMap,&srcRect,&dstRect,srcCopy,nil);
+ DisposeGWorld(offscreen);
+ }
+ showTexte++;
+ if (showTexte>10000) showTexte = 10000;
+ showTitle = 1;
+ if (forced>0) forced = -1;
+
+ SetGWorld(gSavePort,gSaveDevice);
+}
+
+
+/* AllocateVisualData is where you should allocate any information that depends
+on the port or rect changing (like offscreen GWorlds). */
+static OSStatus AllocateVisualData(VisualPluginData *visualPluginData,CGrafPtr destPort,const Rect *destRect)
+{
+ OSStatus status;
+ Rect allocateRect;
+
+ (void) destPort;
+
+ GetGWorld(&gSavePort,&gSaveDevice);
+
+ allocateRect = *destRect;
+ OffsetRect(&allocateRect,-allocateRect.left,-allocateRect.top);
+
+ status = NewGWorld(&visualPluginData->offscreen,32,&allocateRect,nil,nil,useTempMem);
+ if (status == noErr)
+ {
+ PixMapHandle pix = GetGWorldPixMap(visualPluginData->offscreen);
+ LockPixels(pix);
+
+ // Offscreen starts out black
+ SetGWorld(visualPluginData->offscreen,nil);
+ ForeColor(blackColor);
+ PaintRect(&allocateRect);
+ }
+ SetGWorld(gSavePort,gSaveDevice);
+
+ return status;
+}
+
+// DeallocateVisualData is where you should deallocate the .
+static void DeallocateVisualData(VisualPluginData *visualPluginData)
+{
+ CFPreferencesAppSynchronize(CFBundleIdentifier);
+
+ if (visualPluginData->offscreen != nil)
+ {
+ DisposeGWorld(visualPluginData->offscreen);
+ visualPluginData->offscreen = nil;
+ }
+}
+
+// ChangeVisualPort
+static OSStatus ChangeVisualPort(VisualPluginData *visualPluginData,CGrafPtr destPort,const Rect *destRect)
+{
+ OSStatus status;
+ Boolean doAllocate;
+ Boolean doDeallocate;
+
+ status = noErr;
+
+ doAllocate = false;
+ doDeallocate = false;
+
+ if (destPort != nil)
+ {
+ if (visualPluginData->destPort != nil)
+ {
+ if (false == EqualRect(destRect,&visualPluginData->destRect))
+ {
+ doDeallocate = true;
+ doAllocate = true;
+ }
+ }
+ else
+ {
+ doAllocate = true;
+ }
+ }
+ else
+ {
+ doDeallocate = true;
+ }
+
+ if (doDeallocate)
+ DeallocateVisualData(visualPluginData);
+
+ if (doAllocate)
+ status = AllocateVisualData(visualPluginData,destPort,destRect);
+
+ if (status != noErr)
+ destPort = nil;
+
+ visualPluginData->destPort = destPort;
+ if (destRect != nil)
+ visualPluginData->destRect = *destRect;
+
+ return status;
+}
+
+// ResetRenderData
+static void ResetRenderData(VisualPluginData *visualPluginData)
+{
+ bzero(&visualPluginData->data,sizeof(visualPluginData->data));
+}
+
+// settingsControlHandler
+pascal OSStatus settingsControlHandler(EventHandlerCallRef inRef,EventRef inEvent, void* userData)
+{
+ WindowRef wind=NULL;
+ ControlID controlID;
+ ControlRef control=NULL;
+ //get control hit by event
+ GetEventParameter(inEvent,kEventParamDirectObject,typeControlRef,NULL,sizeof(ControlRef),NULL,&control);
+ wind=GetControlOwner(control);
+ GetControlID(control,&controlID);
+ switch(controlID.id){
+
+ case kShowAboutWhenIdleSettingID:
+ ShowAboutWhenIdle = GetControlValue(control);
+ CFPreferencesSetAppValue (CFSTR(kShowAboutWhenIdlePrefName),ShowAboutWhenIdle?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier);
+ break;
+
+ case kPixelDoublingSettingID:
+ doublePixels = GetControlValue(control);
+ CFPreferencesSetAppValue (CFSTR(kPixelDoublingPrefName),doublePixels?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier);
+ changeRes = TRUE;
+ break;
+
+ case kFrameRateSettingID:
+ showFPS = GetControlValue( control );
+ CFPreferencesSetAppValue (CFSTR(kShowFPSPrefName),showFPS?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier);
+ break;
+
+ case kSensitivitySettingID:
+ sensitivity = GetControlValue( control );
+ {
+ CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &sensitivity);
+ CFPreferencesSetAppValue (CFSTR(kSensitivityPrefName), value, CFBundleIdentifier);
+ CFRelease(value);
+ }
+ break;
+
+ case kOKSettingID:
+ HideWindow(wind);
+ break;
+ }
+ return noErr;
+}
+
+// VisualPluginHandler
+static OSStatus VisualPluginHandler(OSType message,VisualPluginMessageInfo *messageInfo,void *refCon)
+{
+ OSStatus status;
+ VisualPluginData * visualPluginData;
+
+ visualPluginData = (VisualPluginData*) refCon;
+
+ status = noErr;
+
+ switch (message)
+ {
+ // Sent when the visual plugin is registered. The plugin should do minimal
+ // memory allocations here. The resource fork of the plugin is still available.
+ case kVisualPluginInitMessage:
+ {
+ visualPluginData = (VisualPluginData*) NewPtrClear(sizeof(VisualPluginData));
+ if (visualPluginData == nil)
+ {
+ status = memFullErr;
+ break;
+ }
+ visualPluginData->appCookie = messageInfo->u.initMessage.appCookie;
+ visualPluginData->appProc = messageInfo->u.initMessage.appProc;
+ // Remember the file spec of our plugin file.
+ // We need this so we can open our resource fork during
+ // the configuration message
+
+ status = PlayerGetPluginFileSpec(visualPluginData->appCookie, visualPluginData->appProc, &visualPluginData->pluginFileSpec);
+ messageInfo->u.initMessage.refCon = (void*) visualPluginData;
+ goomInfo = goom_init(100,100);
+
+ //fprintf(stderr,"Loc : %s\n", CFStringGetCStringPtr(CFCopyLocalizedStringFromTableInBundle(CFSTR("AboutString"), CFSTR("About"), CFBundleGetBundleWithIdentifier(CFBundleIdentifier), NULL),kCFStringEncodingMacRoman));
+
+ aboutMessage = (char*)CFStringGetCStringPtr(CFCopyLocalizedStringFromTableInBundle(CFSTR("AboutString"), CFSTR("About"), CFBundleGetBundleWithIdentifier(CFBundleIdentifier), NULL),kCFStringEncodingMacRoman);
+
+ break;
+ }
+
+ // Sent when the visual plugin is unloaded
+ case kVisualPluginCleanupMessage:
+ if (visualPluginData != nil)
+ DisposePtr((Ptr)visualPluginData);
+
+ goom_close(goomInfo);
+ break;
+
+ // Sent when the visual plugin is enabled. iTunes currently enables all
+ // loaded visual plugins. The plugin should not do anything here.
+ case kVisualPluginEnableMessage:
+ if (true == visualPluginData->playing)
+ {
+ showTexte = 10000;
+ showTitle = 0;
+ }
+ else
+ {
+ showTexte = 0;
+ showTitle = 1;
+ }
+ case kVisualPluginDisableMessage:
+ break;
+
+ // Sent if the plugin requests idle messages. Do this by setting the kVisualWantsIdleMessages
+ // option in the RegisterVisualMessage.options field.
+ case kVisualPluginIdleMessage:
+ RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,false);
+ break;
+
+ // Sent if the plugin requests the ability for the user to configure it. Do this by setting
+ // the kVisualWantsConfigure option in the RegisterVisualMessage.options field.
+ case kVisualPluginConfigureMessage:
+ {
+
+ // kOKSettingID = 1,
+ //kPixelDoublingSettingID = 2,
+ //kFrameRateSettingID = 3,
+ //kSensitivitySettingID = 4
+
+ static EventTypeSpec controlEvent={kEventClassControl,kEventControlHit};
+ static const ControlID kPixelDoublingSettingControlID={'cbox',kPixelDoublingSettingID};
+ static const ControlID kFrameRateSettingControlID={'cbox',kFrameRateSettingID};
+ static const ControlID kSensitivitySettingControlID={'slid',kSensitivitySettingID};
+ static const ControlID kShowAboutWhenIdleSettingControlID={'cbox',kShowAboutWhenIdleSettingID};
+ static WindowRef settingsDialog=NULL;
+ static ControlRef PixelDoublingCTRL=NULL;
+ static ControlRef FrameRateCTRL=NULL;
+ static ControlRef SensitivityCTRL=NULL;
+ static ControlRef ShowAboutWhenIdleCTRL=NULL;
+
+ if(settingsDialog==NULL){
+ IBNibRef nibRef;
+ CFBundleRef iGoomPlugin;
+ //we have to find our bundle to load the nib inside of it
+ iGoomPlugin=CFBundleGetBundleWithIdentifier(CFBundleIdentifier);
+ CreateNibReferenceWithCFBundle(iGoomPlugin,CFSTR("SettingsDialog"), &nibRef);
+ CreateWindowFromNib(nibRef, CFSTR("PluginSettings"), &settingsDialog);
+ DisposeNibReference(nibRef);
+
+
+ //fprintf (stderr,"Picture @ %d\n", (PicHandle)GetPicture (12866));
+
+ InstallWindowEventHandler(settingsDialog,NewEventHandlerUPP(settingsControlHandler),
+ 1,&controlEvent,0,NULL);
+ GetControlByID(settingsDialog,&kPixelDoublingSettingControlID,&PixelDoublingCTRL);
+ GetControlByID(settingsDialog,&kFrameRateSettingControlID,&FrameRateCTRL);
+ GetControlByID(settingsDialog,&kSensitivitySettingControlID,&SensitivityCTRL);
+ GetControlByID(settingsDialog,&kShowAboutWhenIdleSettingControlID,&ShowAboutWhenIdleCTRL);
+ }
+ SetControlValue(PixelDoublingCTRL,doublePixels);
+ SetControlValue(FrameRateCTRL,showFPS);
+ SetControlValue(SensitivityCTRL,sensitivity);
+ SetControlValue(ShowAboutWhenIdleCTRL,ShowAboutWhenIdle);
+
+ ShowWindow(settingsDialog);
+ }
+ break;
+
+ // Sent when iTunes is going to show the visual plugin in a port. At
+ // this point,the plugin should allocate any large buffers it needs.
+ case kVisualPluginShowWindowMessage:
+ if (true == visualPluginData->playing)
+ {
+ showTexte = 10000;
+ showTitle = 0;
+ }
+ else
+ {
+ showTexte = 0;
+ showTitle = 1;
+ }
+ visualPluginData->destOptions = messageInfo->u.showWindowMessage.options;
+ status = ChangeVisualPort( visualPluginData, messageInfo->u.showWindowMessage.port,
+ &messageInfo->u.showWindowMessage.drawRect);
+ //FIXME setres here
+ break;
+ // Sent when iTunes is no longer displayed.
+ case kVisualPluginHideWindowMessage:
+
+ (void) ChangeVisualPort(visualPluginData,nil,nil);
+
+ bzero(&visualPluginData->trackInfo,sizeof(visualPluginData->trackInfo));
+ bzero(&visualPluginData->streamInfo,sizeof(visualPluginData->streamInfo));
+ break;
+
+ // Sent when iTunes needs to change the port or rectangle of the currently
+ // displayed visual.
+ case kVisualPluginSetWindowMessage:
+ visualPluginData->destOptions = messageInfo->u.setWindowMessage.options;
+
+ status = ChangeVisualPort( visualPluginData,
+ messageInfo->u.setWindowMessage.port,
+ &messageInfo->u.setWindowMessage.drawRect);
+ break;
+
+ // Sent for the visual plugin to render a frame.
+ case kVisualPluginRenderMessage:
+ ProcessRenderData(visualPluginData,messageInfo->u.renderMessage.renderData);
+ RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,false);
+ break;
+
+ // Sent in response to an update event. The visual plugin should update
+ // into its remembered port. This will only be sent if the plugin has been
+ // previously given a ShowWindow message.
+ case kVisualPluginUpdateMessage:
+ RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,true);
+ break;
+
+ // Sent when the player starts.
+ case kVisualPluginPlayMessage:
+ if (messageInfo->u.playMessage.trackInfo != nil)
+ visualPluginData->trackInfo = *messageInfo->u.playMessage.trackInfo;
+ else
+ bzero(&visualPluginData->trackInfo,sizeof(visualPluginData->trackInfo));
+
+ if (messageInfo->u.playMessage.streamInfo != nil)
+ visualPluginData->streamInfo = *messageInfo->u.playMessage.streamInfo;
+ else
+ bzero(&visualPluginData->streamInfo,sizeof(visualPluginData->streamInfo));
+
+ visualPluginData->playing = true;
+ showTexte = 10000;
+ showTitle = 0;
+ break;
+
+ // Sent when the player changes the current track information. This
+ // is used when the information about a track changes,or when the CD
+ // moves onto the next track. The visual plugin should update any displayed
+ // information about the currently playing song.
+ case kVisualPluginChangeTrackMessage:
+ if (messageInfo->u.changeTrackMessage.trackInfo != nil)
+ visualPluginData->trackInfo = *messageInfo->u.changeTrackMessage.trackInfo;
+ else
+ bzero(&visualPluginData->trackInfo,sizeof(visualPluginData->trackInfo));
+
+ if (messageInfo->u.changeTrackMessage.streamInfo != nil)
+ visualPluginData->streamInfo = *messageInfo->u.changeTrackMessage.streamInfo;
+ else
+ bzero(&visualPluginData->streamInfo,sizeof(visualPluginData->streamInfo));
+ showTexte = 10000;
+ showTitle = 0;
+ break;
+
+ // Sent when the player stops.
+ case kVisualPluginStopMessage:
+ visualPluginData->playing = false;
+ ResetRenderData(visualPluginData);
+ //RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,true);
+ showTexte = 0;
+ showTitle = 1;
+ break;
+
+ // Sent when the player changes position.
+ case kVisualPluginSetPositionMessage:
+ break;
+
+ // Sent when the player pauses. iTunes does not currently use pause or unpause.
+ // A pause in iTunes is handled by stopping and remembering the position.
+ case kVisualPluginPauseMessage:
+ visualPluginData->playing = false;
+ ResetRenderData(visualPluginData);
+ //RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,true);
+ break;
+
+ // Sent when the player unpauses. iTunes does not currently use pause or unpause.
+ // A pause in iTunes is handled by stopping and remembering the position.
+ case kVisualPluginUnpauseMessage:
+ visualPluginData->playing = true;
+ break;
+
+ // Sent to the plugin in response to a MacOS event. The plugin should return noErr
+ // for any event it handles completely,or an error (unimpErr) if iTunes should handle it.
+ case kVisualPluginEventMessage:
+ {
+ EventRecord* tEventPtr = messageInfo->u.eventMessage.event;
+ if ((tEventPtr->what == keyDown) || (tEventPtr->what == autoKey))
+ { // charCodeMask,keyCodeMask;
+ char theChar = tEventPtr->message & charCodeMask;
+
+ switch (theChar) // Process keys here
+ {
+
+ case 't':
+ case 'T':
+ ShowAboutWhenIdle = (ShowAboutWhenIdle==0)?1:0;
+ CFPreferencesSetAppValue (CFSTR(kShowAboutWhenIdlePrefName),ShowAboutWhenIdle?CFSTR("YES"):CFSTR("NO"), CFBundleIdentifier);
+ break;
+ case 'q':
+ case 'Q':
+ doublePixels = (doublePixels==0)?1:0;
+ CFPreferencesSetAppValue (CFSTR(kPixelDoublingPrefName),doublePixels?CFSTR("YES"):CFSTR("NO"), CFBundleIdentifier);
+ changeRes = TRUE;
+ break;
+ case '0':
+ forced = (forced == 0) ? -1 : 0;
+ break;
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ forced = theChar - '0';
+ break;
+ case 'f':
+ case 'F':
+ showFPS = (showFPS==0)?1:0;
+ CFPreferencesSetAppValue (CFSTR(kShowFPSPrefName),showFPS?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier);
+ break;
+
+ case '>':
+ if (sensitivity <= 240) sensitivity += 10;
+ {
+ CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &sensitivity);
+ CFPreferencesSetAppValue (CFSTR(kSensitivityPrefName), value, CFBundleIdentifier);
+ CFRelease(value);
+ }
+ break;
+ case '<':
+ if (sensitivity >= 80) sensitivity -= 10;
+ {
+ CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &sensitivity);
+ CFPreferencesSetAppValue (CFSTR(kSensitivityPrefName), value, CFBundleIdentifier);
+ CFRelease(value);
+ }
+ break;
+
+ case '\r':
+ case '\n':
+ break;
+ default:
+ status = unimpErr;
+ break;
+ }
+ }
+ else
+ status = unimpErr;
+ }
+ break;
+
+ default:
+ status = unimpErr;
+ break;
+ }
+ return status;
+}
+
+// RegisterVisualPlugin
+static OSStatus RegisterVisualPlugin(PluginMessageInfo *messageInfo)
+{
+ OSStatus status;
+ PlayerMessageInfo playerMessageInfo;
+ Str255 pluginName = kTVisualPluginName;
+#ifdef Timers
+ backUpTime = UpTime();
+#endif
+
+ CFStringRef aString;
+ CFNumberRef aNumber;
+ CFComparisonResult result;
+
+ CFBundleIdentifier = CFSTR("com.ios.igoom");
+
+ // Read the preferences
+ aString = CFPreferencesCopyAppValue(CFSTR(kPixelDoublingPrefName),CFBundleIdentifier);
+ if (aString != NULL)
+ {
+ result = CFStringCompareWithOptions(aString, CFSTR("YES"), CFRangeMake(0,CFStringGetLength(aString)), kCFCompareCaseInsensitive);
+ if (result == kCFCompareEqualTo) {
+ doublePixels = true;
+ }
+ else doublePixels = false;
+ }
+
+ aString = CFPreferencesCopyAppValue(CFSTR(kShowFPSPrefName),CFBundleIdentifier);
+ if (aString != NULL)
+ {
+ result = CFStringCompareWithOptions(aString, CFSTR("YES"), CFRangeMake(0,CFStringGetLength(aString)), kCFCompareCaseInsensitive);
+ if (result == kCFCompareEqualTo) {
+ showFPS = true;
+ }
+ else showFPS = false;
+ }
+
+ aString = CFPreferencesCopyAppValue(CFSTR(kShowAboutWhenIdlePrefName),CFBundleIdentifier);
+ if (aString != NULL)
+ {
+ result = CFStringCompareWithOptions(aString, CFSTR("YES"), CFRangeMake(0,CFStringGetLength(aString)), kCFCompareCaseInsensitive);
+ if (result == kCFCompareEqualTo) {
+ ShowAboutWhenIdle = true;
+ }
+ else ShowAboutWhenIdle = false;
+ }
+
+ aNumber = CFPreferencesCopyAppValue(CFSTR(kSensitivityPrefName),CFBundleIdentifier);
+ if (aNumber != NULL)
+ {
+ CFNumberGetValue(aNumber,kCFNumberIntType,&sensitivity);
+ }
+
+
+
+
+ bzero(&playerMessageInfo.u.registerVisualPluginMessage,sizeof(playerMessageInfo.u.registerVisualPluginMessage));
+ BlockMoveData((Ptr)&pluginName[0],(Ptr)&playerMessageInfo.u.registerVisualPluginMessage.name[0],pluginName[0] + 1);
+
+ SetNumVersion(&playerMessageInfo.u.registerVisualPluginMessage.pluginVersion, kTVisualPluginMajorVersion, kTVisualPluginMinorVersion, kTVisualPluginReleaseStage, kTVisualPluginNonFinalRelease);
+
+ playerMessageInfo.u.registerVisualPluginMessage.options = kVisualWantsIdleMessages | kVisualWantsConfigure;
+ playerMessageInfo.u.registerVisualPluginMessage.handler = (VisualPluginProcPtr)VisualPluginHandler;
+ playerMessageInfo.u.registerVisualPluginMessage.registerRefCon = 0;
+ playerMessageInfo.u.registerVisualPluginMessage.creator = kTVisualPluginCreator;
+
+ playerMessageInfo.u.registerVisualPluginMessage.timeBetweenDataInMS = 0xFFFFFFFF; // 16 milliseconds = 1 Tick, 0xFFFFFFFF = Often as possible.
+ playerMessageInfo.u.registerVisualPluginMessage.numWaveformChannels = 2;
+ playerMessageInfo.u.registerVisualPluginMessage.numSpectrumChannels = 0;
+
+ playerMessageInfo.u.registerVisualPluginMessage.minWidth = 100;
+ playerMessageInfo.u.registerVisualPluginMessage.minHeight = 100;
+ playerMessageInfo.u.registerVisualPluginMessage.maxWidth = 2000;
+ playerMessageInfo.u.registerVisualPluginMessage.maxHeight = 2000;
+ playerMessageInfo.u.registerVisualPluginMessage.minFullScreenBitDepth = 32;
+ playerMessageInfo.u.registerVisualPluginMessage.maxFullScreenBitDepth = 32;
+ playerMessageInfo.u.registerVisualPluginMessage.windowAlignmentInBytes = 0;
+
+ status = PlayerRegisterVisualPlugin(messageInfo->u.initMessage.appCookie,messageInfo->u.initMessage.appProc,&playerMessageInfo);
+/*
+ Gestalt(gestaltPowerPCProcessorFeatures,&CPU);
+ if (1 & (CPU >> gestaltPowerPCHasVectorInstructions)) CPU_FLAVOUR = 1;
+ else CPU_FLAVOUR = 0;
+*/
+
+ return status;
+}
+
+// main entrypoint
+OSStatus iTunesPluginMainMachO(OSType message,PluginMessageInfo *messageInfo,void *refCon)
+{
+ OSStatus status;
+
+ (void) refCon;
+
+ switch (message)
+ {
+ case kPluginInitMessage:
+ status = RegisterVisualPlugin(messageInfo);
+ break;
+ case kPluginCleanupMessage:
+ status = noErr;
+ break;
+ default:
+ status = unimpErr;
+ break;
+ }
+
+ return status;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c
new file mode 100755
index 0000000000..ef68202c2a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c
@@ -0,0 +1 @@
+/* File: iTunesAPI.c Contains: iTunes Plug-ins interfaces Version: Technology: iTunes Release: 1.1 Copyright: © 2001 by Apple Computer, Inc., all rights reserved. Bugs?: For bug reports, consult the following page on the World Wide Web: http://developer.apple.com/bugreporter/ */ #include "iTunesAPI.h" #include "iTunesVisualAPI.h" // MemClear // static void MemClear (LogicalAddress dest, SInt32 length) { register unsigned char *ptr; ptr = (unsigned char *) dest; if( length > 16 ) { register unsigned long *longPtr; while( ((unsigned long) ptr & 3) != 0 ) { *ptr++ = 0; --length; } longPtr = (unsigned long *) ptr; while( length >= 4 ) { *longPtr++ = 0; length -= 4; } ptr = (unsigned char *) longPtr; } while( --length >= 0 ) { *ptr++ = 0; } } // SetNumVersion // void SetNumVersion (NumVersion *numVersion, UInt8 majorRev, UInt8 minorAndBugRev, UInt8 stage, UInt8 nonRelRev) { numVersion->majorRev = majorRev; numVersion->minorAndBugRev = minorAndBugRev; numVersion->stage = stage; numVersion->nonRelRev = nonRelRev; } // ITCallApplication // OSStatus ITCallApplication (void *appCookie, ITAppProcPtr handler, OSType message, PlayerMessageInfo *messageInfo) { PlayerMessageInfo localMessageInfo; if (messageInfo == nil) { MemClear(&localMessageInfo, sizeof(localMessageInfo)); messageInfo = &localMessageInfo; } messageInfo->messageMajorVersion = kITCurrentPluginMajorMessageVersion; messageInfo->messageMinorVersion = kITCurrentPluginMinorMessageVersion; messageInfo->messageInfoSize = sizeof(PlayerMessageInfo); return handler(appCookie, message, messageInfo); } // PlayerSetFullScreen // OSStatus PlayerSetFullScreen (void *appCookie, ITAppProcPtr appProc, Boolean fullScreen) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setFullScreenMessage.fullScreen = fullScreen; return ITCallApplication(appCookie, appProc, kPlayerSetFullScreenMessage, &messageInfo); } // PlayerSetFullScreenOptions // OSStatus PlayerSetFullScreenOptions (void *appCookie, ITAppProcPtr appProc, SInt16 minBitDepth, SInt16 maxBitDepth, SInt16 preferredBitDepth, SInt16 desiredWidth, SInt16 desiredHeight) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setFullScreenOptionsMessage.minBitDepth = minBitDepth; messageInfo.u.setFullScreenOptionsMessage.maxBitDepth = maxBitDepth; messageInfo.u.setFullScreenOptionsMessage.preferredBitDepth = preferredBitDepth; messageInfo.u.setFullScreenOptionsMessage.desiredWidth = desiredWidth; messageInfo.u.setFullScreenOptionsMessage.desiredHeight = desiredHeight; return ITCallApplication(appCookie, appProc, kPlayerSetFullScreenOptionsMessage, &messageInfo); } // PlayerGetPluginData // OSStatus PlayerGetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize) { OSStatus status; PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.getPluginDataMessage.dataPtr = dataPtr; messageInfo.u.getPluginDataMessage.dataBufferSize = dataBufferSize; status = ITCallApplication(appCookie, appProc, kPlayerGetPluginDataMessage, &messageInfo); if (dataSize != nil) *dataSize = messageInfo.u.getPluginDataMessage.dataSize; return status; } // PlayerSetPluginData // OSStatus PlayerSetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataSize) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setPluginDataMessage.dataPtr = dataPtr; messageInfo.u.setPluginDataMessage.dataSize = dataSize; return ITCallApplication(appCookie, appProc, kPlayerSetPluginDataMessage, &messageInfo); } // PlayerGetPluginNamedData // OSStatus PlayerGetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize) { OSStatus status; PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.getPluginNamedDataMessage.dataName = dataName; messageInfo.u.getPluginNamedDataMessage.dataPtr = dataPtr; messageInfo.u.getPluginNamedDataMessage.dataBufferSize = dataBufferSize; status = ITCallApplication(appCookie, appProc, kPlayerGetPluginNamedDataMessage, &messageInfo); if (dataSize != nil) *dataSize = messageInfo.u.getPluginNamedDataMessage.dataSize; return status; } // PlayerSetPluginNamedData // OSStatus PlayerSetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataSize) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setPluginNamedDataMessage.dataName = dataName; messageInfo.u.setPluginNamedDataMessage.dataPtr = dataPtr; messageInfo.u.setPluginNamedDataMessage.dataSize = dataSize; return ITCallApplication(appCookie, appProc, kPlayerSetPluginNamedDataMessage, &messageInfo); } // PlayerIdle // OSStatus PlayerIdle (void *appCookie, ITAppProcPtr appProc) { return ITCallApplication(appCookie, appProc, kPlayerIdleMessage, nil); } // PlayerShowAbout // void PlayerShowAbout (void *appCookie, ITAppProcPtr appProc) { ITCallApplication(appCookie, appProc, kPlayerShowAboutMessage, nil); } // PlayerOpenURL // void PlayerOpenURL (void *appCookie, ITAppProcPtr appProc, SInt8 *string, UInt32 length) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.openURLMessage.url = string; messageInfo.u.openURLMessage.length = length; ITCallApplication(appCookie, appProc, kPlayerOpenURLMessage, &messageInfo); } // PlayerUnregisterPlugin // OSStatus PlayerUnregisterPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo) { return ITCallApplication(appCookie, appProc, kPlayerUnregisterPluginMessage, messageInfo); } // PlayerRegisterVisualPlugin // OSStatus PlayerRegisterVisualPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo) { return ITCallApplication(appCookie, appProc, kPlayerRegisterVisualPluginMessage, messageInfo); } // PlayerRegisterDevicePlugin // OSStatus PlayerRegisterDevicePlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo) { return ITCallApplication(appCookie, appProc, kPlayerRegisterDevicePluginMessage, messageInfo); } // PlayerSetDeviceSerialNumber // OSStatus PlayerSetDeviceSerialNumber (void *appCookie, ITAppProcPtr appProc, ConstStringPtr serialNumber) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setDeviceSerialNumberMessage.serialNumber = serialNumber; return ITCallApplication(appCookie, appProc, kPlayerSetDeviceSerialNumberMessage, &messageInfo); } // PlayerHandleMacOSEvent // OSStatus PlayerHandleMacOSEvent (void *appCookie, ITAppProcPtr appProc, const EventRecord *theEvent, Boolean *eventHandled) { PlayerMessageInfo messageInfo; OSStatus status; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.handleMacOSEventMessage.theEvent = theEvent; status = ITCallApplication(appCookie, appProc, kPlayerHandleMacOSEventMessage, &messageInfo); if( eventHandled != nil ) *eventHandled = messageInfo.u.handleMacOSEventMessage.handled; return status; } // PlayerGetPluginFileSpec // OSStatus PlayerGetPluginFileSpec (void *appCookie, ITAppProcPtr appProc, FSSpec *pluginFileSpec) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.getPluginFileSpecMessage.fileSpec = pluginFileSpec; return ITCallApplication(appCookie, appProc, kPlayerGetPluginFileSpecMessage, &messageInfo); } \ No newline at end of file
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h
new file mode 100755
index 0000000000..69e651d862
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h
@@ -0,0 +1 @@
+/* File: iTunesAPI.h Contains: iTunes Plug-ins interfaces Version: Technology: iTunes Release: 1.1 Copyright: � 2001 by Apple Computer, Inc., all rights reserved. Bugs?: For bug reports, consult the following page on the World Wide Web: http://developer.apple.com/bugreporter/ */ #ifndef __ITUNESAPI__ #define __ITUNESAPI__ #include <Carbon/Carbon.h> /* #if PRAGMA_ONCE #pragma once #endif */ #ifdef __cplusplus extern "C" { #endif /* #if PRAGMA_STRUCT_ALIGN #pragma options align=power #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(push, 2) #elif PRAGMA_STRUCT_PACK #pragma pack(2) #endif */ enum { kITCurrentPluginMajorMessageVersion = 10, kITCurrentPluginMinorMessageVersion = 1 }; enum { kTrackSupportsID3Tags = (1L << 0), kTrackHasVariableBitRate = (1L << 1), kTrackIsFolder = (1L << 2), /* Device tracks only. Information returned is for a folder */ kTrackIsLocked = (1L << 3), /* Device tracks only. Track cannot be deleted or renamed */ kTrackCanBeDownloaded = (1L << 4), /* Device tracks only. Track can be copied from device to desktop. */ kTrackIsHidden = (1L << 5) /* Device tracks only. Track should not be displayed in the device window. */ }; typedef OptionBits ITTrackAttributes; enum { /* These mask values are specified in ITTrackInfo.validFields to indicate which fields contain valid data */ kITTINameFieldMask = (1L << 0), kITTIFileNameFieldMask = (1L << 1), kITTIArtistFieldMask = (1L << 2), kITTIAlbumFieldMask = (1L << 3), kITTIGenreFieldMask = (1L << 4), kITTIKindFieldMask = (1L << 5), kITTITrackNumberFieldsMask = (1L << 6), kITTIYearFieldMask = (1L << 7), kITTISoundVolumeFieldMask = (1L << 8), kITTICommentsFieldMask = (1L << 10), kITTITotalTimeFieldMask = (1L << 11), kITTIStartTimeFieldMask = (1L << 12), kITTIStopTimeFieldMask = (1L << 13), kITTISizeFieldMask = (1L << 14), kITTIBitRateFieldMask = (1L << 15), kITTISampleRateFieldMask = (1L << 16), kITTIAttributesFieldMask = (1L << 17), kITTIFileTypeFieldMask = (1L << 18), kITTIDateFieldMask = (1L << 19) }; typedef OptionBits ITTIFieldMask; struct ITTrackInfo { ITTIFieldMask validFields; UInt32 reserved; /* Must be zero */ Str255 name; Str255 fileName; Str255 artist; Str255 album; Str255 genre; Str255 kind; UInt32 trackNumber; UInt32 numTracks; UInt16 year; SInt16 soundVolumeAdjustment; /* Valid range is -255 to +255 */ Str255 unusedReserved1; /* Must be empty string */ Str255 comments; UInt32 totalTimeInMS; UInt32 startTimeInMS; UInt32 stopTimeInMS; UInt32 sizeInBytes; UInt32 bitRate; UInt32 sampleRateFixed; OSType fileType; UInt32 date; UInt32 unusedReserved2; /* Must be zero */ ITTrackAttributes attributes; ITTrackAttributes validAttributes; /* Mask indicating which attributes are applicable */ }; typedef struct ITTrackInfo ITTrackInfo; enum { kCurrentITStreamInfoVersion = 1 }; typedef FSSpec ITFileSpec; struct ITFileLocation { ITFileSpec spec; FInfo fInfo; }; typedef struct ITFileLocation ITFileLocation; struct ITStreamInfo { SInt32 version; Str255 streamTitle; Str255 streamURL; Str255 streamMessage; }; typedef struct ITStreamInfo ITStreamInfo; enum { /* messages sent to plugin main */ kPluginInitMessage = 'init', kPluginCleanupMessage = 'clr ', kPluginIdleMessage = 'idle' }; enum { /* PluginInitMessage.options */ kPluginWantsIdleMessages = (1L << 1), /* Send idle messages to plugin main */ kPluginWantsToBeLeftOpen = (1L << 2) /* Don't close this plugin just because */ /* it didn't register anyone */ }; enum { /* iTunes API messages */ kPlayerRegisterVisualPluginMessage = 'rvis', /* Register a visual plugin */ kPlayerRegisterDevicePluginMessage = 'rdev', /* Register a device plugin */ /* Available for all plugins */ kPlayerIdleMessage = 'idle', /* Give iTunes some time */ kPlayerShowAboutMessage = 'abou', /* Show the about box. */ kPlayerOpenURLMessage = 'url ', /* Open a URL */ kPlayerSetPluginDataMessage = 'sprf', /* Set plugin preferences */ kPlayerGetPluginDataMessage = 'gprf', /* Get plugin preferences */ kPlayerSetPluginNamedDataMessage = 'snpr', /* Set plugin named preferenes */ kPlayerGetPluginNamedDataMessage = 'gnpr', /* Get plugin named preferenes */ kPlayerHandleMacOSEventMessage = 'evnt', /* Tell player to handle unhandled event */ kPlayerGetPluginFileSpecMessage = 'pspc', /* Get the location of the plugin executable */ /* Available for visual plugins */ kPlayerSetFullScreenMessage = 'sful', /* Set full screen mode */ kPlayerSetFullScreenOptionsMessage = 'sfop', /* Set full screen options */ /* Available for device plugins */ kPlayerSetDeviceSerialNumberMessage = 'dvsn', /* Set a serial number string for a device. Needed for per-device prefs */ kPlayerUnregisterPluginMessage = 'unrg' /* Unregister the plugin this comes from */ }; typedef OSStatus (*ITAppProcPtr)(void *appCookie, OSType message,void *messageInfo); /* Plugin main Messages */ struct PluginInitMessage { UInt32 majorVersion; /* Input */ UInt32 minorVersion; /* Input */ void * appCookie; /* Input */ ITAppProcPtr appProc; /* Input */ OptionBits options; /* Output, see above for values */ void * refCon; /* Output */ }; typedef struct PluginInitMessage PluginInitMessage; struct PluginMessageInfo { union { PluginInitMessage initMessage; } u; }; typedef struct PluginMessageInfo PluginMessageInfo; /* Plugin main entry point message handler */ typedef OSStatus (*PluginProcPtr)(OSType message, PluginMessageInfo *messageInfo, void *refCon); /* Visual plugin message handler */ typedef OSStatus (*VisualPluginProcPtr)(OSType message,void *messageInfo, void *refCon); /* Device plugin message handler */ typedef OSStatus (*DevicePluginProcPtr)(OSType message,void *messageInfo, void *refCon); /* Callbacks to iTunes */ enum { /* PlayerRegisterVisualPluginMessage.options */ kVisualWantsIdleMessages = (1L << 3), kVisualWantsConfigure = (1L << 5) }; struct PlayerRegisterVisualPluginMessage { /* Input from plugin */ Str63 name; /* Displayed in the Visual menu */ OptionBits options; /* See above */ OSType creator; /* Identifies the plugin */ NumVersion pluginVersion; /* Version number of the plugin */ VisualPluginProcPtr handler; /* Handler for the plugin's messages */ void * registerRefCon; /* RefCon for the plugin's handler */ UInt32 timeBetweenDataInMS; /* How often to call the plugin (0xFFFFFFFF = as often as possible) */ UInt32 numWaveformChannels; /* 0-2 waveforms requested */ UInt32 numSpectrumChannels; /* 0-2 spectrums requested */ SInt16 minWidth; /* Minimum resizeable width */ SInt16 minHeight; /* Minimum resizeable height */ SInt16 maxWidth; /* Maximum resizeable width */ SInt16 maxHeight; /* Maximum resizeable height */ UInt16 minFullScreenBitDepth; /* 0 = Any */ UInt16 maxFullScreenBitDepth; /* 0 = Any */ UInt16 windowAlignmentInBytes; /* Reserved (should be zero) */ }; typedef struct PlayerRegisterVisualPluginMessage PlayerRegisterVisualPluginMessage; enum { /* PlayerRegisterDevicePluginMessage.options */ kDeviceWantsIdleMessages = (1L << 0) }; struct PlayerRegisterDevicePluginMessage { /* Input from plugin */ Str63 name; /* Used internally. Not currently displayed */ OptionBits options; /* See above */ NumVersion pluginVersion; /* Version number of the plugin */ DevicePluginProcPtr handler; /* Handler for the plugin's messages */ void * registerRefCon; /* RefCon for the plugin's handler */ UInt32 reserved[2]; /* Must be zero */ }; typedef struct PlayerRegisterDevicePluginMessage PlayerRegisterDevicePluginMessage; struct PlayerSetFullScreenMessage { Boolean fullScreen; }; typedef struct PlayerSetFullScreenMessage PlayerSetFullScreenMessage; struct PlayerSetFullScreenOptionsMessage { SInt16 minBitDepth; /* 0 = Any */ SInt16 maxBitDepth; /* 0 = Any */ SInt16 preferredBitDepth; /* 0 = Current */ SInt16 desiredWidth; /* Must be within minWidth & maxWidth */ SInt16 desiredHeight; /* Must be within minHeight & maxHeight */ }; typedef struct PlayerSetFullScreenOptionsMessage PlayerSetFullScreenOptionsMessage; struct PlayerOpenURLMessage { SInt8 * url; UInt32 length; }; typedef struct PlayerOpenURLMessage PlayerOpenURLMessage; struct PlayerSetPluginDataMessage { void * dataPtr; /* Input */ UInt32 dataSize; /* Input */ }; typedef struct PlayerSetPluginDataMessage PlayerSetPluginDataMessage; struct PlayerGetPluginDataMessage { void * dataPtr; /* Input */ UInt32 dataBufferSize; /* Input */ UInt32 dataSize; /* Output */ }; typedef struct PlayerGetPluginDataMessage PlayerGetPluginDataMessage; struct PlayerSetPluginNamedDataMessage { ConstStringPtr dataName; /* Input */ void * dataPtr; /* Input */ UInt32 dataSize; /* Input */ }; typedef struct PlayerSetPluginNamedDataMessage PlayerSetPluginNamedDataMessage; struct PlayerGetPluginNamedDataMessage { ConstStringPtr dataName; /* Input */ void * dataPtr; /* Input */ UInt32 dataBufferSize; /* Input */ UInt32 dataSize; /* Output */ }; typedef struct PlayerGetPluginNamedDataMessage PlayerGetPluginNamedDataMessage; struct PlayerHandleMacOSEventMessage { const EventRecord * theEvent; /* Input */ Boolean handled; /* Output */ }; typedef struct PlayerHandleMacOSEventMessage PlayerHandleMacOSEventMessage; struct PlayerGetPluginFileSpecMessage { FSSpec * fileSpec; /* Output */ }; typedef struct PlayerGetPluginFileSpecMessage PlayerGetPluginFileSpecMessage; struct PlayerSetDeviceSerialNumberMessage { ConstStringPtr serialNumber; /* Input */ }; typedef struct PlayerSetDeviceSerialNumberMessage PlayerSetDeviceSerialNumberMessage; struct PlayerMessageInfo { UInt32 messageMajorVersion; /* Should be kITCurrentPluginMajorMessageVersion */ UInt32 messageMinorVersion; /* Should be kITCurrentPluginMinorMessageVersion */ UInt32 messageInfoSize; /* Should be sizeof(PlayerMessageInfo) */ union { PlayerRegisterVisualPluginMessage registerVisualPluginMessage; PlayerRegisterDevicePluginMessage registerDevicePluginMessage; PlayerOpenURLMessage openURLMessage; PlayerSetPluginDataMessage setPluginDataMessage; PlayerGetPluginDataMessage getPluginDataMessage; PlayerSetPluginNamedDataMessage setPluginNamedDataMessage; PlayerGetPluginNamedDataMessage getPluginNamedDataMessage; PlayerHandleMacOSEventMessage handleMacOSEventMessage; PlayerGetPluginFileSpecMessage getPluginFileSpecMessage; PlayerSetFullScreenMessage setFullScreenMessage; PlayerSetFullScreenOptionsMessage setFullScreenOptionsMessage; PlayerSetDeviceSerialNumberMessage setDeviceSerialNumberMessage; } u; }; typedef struct PlayerMessageInfo PlayerMessageInfo; extern OSStatus ITCallApplication (void *appCookie, ITAppProcPtr appProc, OSType message, PlayerMessageInfo *messageInfo); extern void SetNumVersion (NumVersion *numVersion, UInt8 majorRev, UInt8 minorAndBugRev, UInt8 stage, UInt8 nonRelRev); /* for use from plugin main */ extern OSStatus PlayerRegisterVisualPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo); extern OSStatus PlayerRegisterDevicePlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo); /* For all plugins */ extern OSStatus PlayerIdle (void *appCookie, ITAppProcPtr appProc); extern void PlayerShowAbout (void *appCookie, ITAppProcPtr appProc); extern void PlayerOpenURL (void *appCookie, ITAppProcPtr appProc, SInt8 *string, UInt32 length); extern OSStatus PlayerGetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize); extern OSStatus PlayerSetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataSize); extern OSStatus PlayerGetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize); extern OSStatus PlayerSetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataSize); extern OSStatus PlayerHandleMacOSEvent (void *appCookie, ITAppProcPtr appProc, const EventRecord *theEvent, Boolean *eventHandled); extern OSStatus PlayerGetPluginFileSpec (void *appCookie, ITAppProcPtr appProc, FSSpec *pluginFileSpec); /* For visual plugins */ extern OSStatus PlayerSetFullScreen (void *appCookie, ITAppProcPtr appProc, Boolean fullScreen); extern OSStatus PlayerSetFullScreenOptions (void *appCookie, ITAppProcPtr appProc, SInt16 minBitDepth, SInt16 maxBitDepth, SInt16 preferredBitDepth, SInt16 desiredWidth, SInt16 desiredHeight); /* For device plugins */ extern OSStatus PlayerSetDeviceSerialNumber (void *appCookie, ITAppProcPtr appProc, ConstStringPtr serialNumber); extern OSStatus PlayerUnregisterPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo); /* #if PRAGMA_STRUCT_ALIGN #pragma options align=reset #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(pop) #elif PRAGMA_STRUCT_PACK #pragma pack() #endif */ #ifdef __cplusplus } #endif #endif /* __ITUNESAPI__ */ \ No newline at end of file
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h
new file mode 100755
index 0000000000..a63f977285
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h
@@ -0,0 +1 @@
+/* File: iTunesVisualAPI.h Contains: iTunes Visual Plug-ins interfaces Version: Technology: iTunes Release: 1.1 Copyright: � 2001 by Apple Computer, Inc., all rights reserved. Bugs?: For bug reports, consult the following page on the World Wide Web: http://developer.apple.com/bugreporter/ */ #ifndef __ITUNESVISUALAPI__ #define __ITUNESVISUALAPI__ #include "iTunesAPI.h" /* #if PRAGMA_ONCE #pragma once #endif */ #ifdef __cplusplus extern "C" { #endif /* #if PRAGMA_STRUCT_ALIGN #pragma options align=power #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(push, 2) #elif PRAGMA_STRUCT_PACK #pragma pack(2) #endif */ enum { /* VisualPlugin messages */ kVisualPluginIdleMessage = 'null', kVisualPluginInitMessage = 'init', kVisualPluginCleanupMessage = 'clr ', kVisualPluginConfigureMessage = 'cnfg', /* Configure the plugin (may not be enabled) */ kVisualPluginEnableMessage = 'von ', /* Turn on the module (automatic)*/ kVisualPluginDisableMessage = 'voff', /* Turn off the module */ kVisualPluginShowWindowMessage = 'show', /* Show the plugin window (allocate large memory here!) */ kVisualPluginHideWindowMessage = 'hide', /* Hide the plugin window (deallocate large memory here!) */ kVisualPluginSetWindowMessage = 'swin', /* Change the window parameters */ kVisualPluginRenderMessage = 'vrnd', /* Render to window */ kVisualPluginUpdateMessage = 'vupd', /* Update the window */ kVisualPluginPlayMessage = 'vply', /* Playing a track */ kVisualPluginChangeTrackMessage = 'ctrk', /* Change track (for CD continuous play) */ kVisualPluginStopMessage = 'vstp', /* Stopping a track */ kVisualPluginSetPositionMessage = 'setp', /* Setting the position of a track */ kVisualPluginPauseMessage = 'vpau', /* Pausing a track (unused - Pause is stop) */ kVisualPluginUnpauseMessage = 'vunp', /* Unpausing a track (unused - Pause is stop) */ kVisualPluginEventMessage = 'vevt' /* Mac-event. */ }; /* VisualPlugin messages */ enum { kVisualMaxDataChannels = 2, kVisualNumWaveformEntries = 512, kVisualNumSpectrumEntries = 512 }; enum { /* ShowWindow options */ kWindowIsFullScreen = (1L << 0) }; struct RenderVisualData { UInt8 numWaveformChannels; UInt8 waveformData[kVisualMaxDataChannels][kVisualNumWaveformEntries]; UInt8 numSpectrumChannels; UInt8 spectrumData[kVisualMaxDataChannels][kVisualNumSpectrumEntries]; }; typedef struct RenderVisualData RenderVisualData; struct VisualPluginInitMessage { UInt32 messageMajorVersion; /* Input */ UInt32 messageMinorVersion; /* Input */ NumVersion appVersion; /* Input */ void * appCookie; /* Input */ ITAppProcPtr appProc; /* Input */ OptionBits options; /* Output */ void * refCon; /* Output */ }; typedef struct VisualPluginInitMessage VisualPluginInitMessage; struct VisualPluginShowWindowMessage { CGrafPtr port; /* Input */ Rect drawRect; /* Input */ OptionBits options; /* Input */ }; typedef struct VisualPluginShowWindowMessage VisualPluginShowWindowMessage; struct VisualPluginSetWindowMessage { CGrafPtr port; /* Input */ Rect drawRect; /* Input */ OptionBits options; /* Input */ }; typedef struct VisualPluginSetWindowMessage VisualPluginSetWindowMessage; struct VisualPluginPlayMessage { ITTrackInfo * trackInfo; /* Input */ ITStreamInfo * streamInfo; /* Input */ SInt32 volume; /* Input */ UInt32 bitRate; /* Input */ SoundComponentData soundFormat; /* Input */ }; typedef struct VisualPluginPlayMessage VisualPluginPlayMessage; struct VisualPluginChangeTrackMessage { ITTrackInfo * trackInfo; /* Input */ ITStreamInfo * streamInfo; /* Input */ }; typedef struct VisualPluginChangeTrackMessage VisualPluginChangeTrackMessage; struct VisualPluginRenderMessage { RenderVisualData * renderData; /* Input */ UInt32 timeStampID; /* Input */ }; typedef struct VisualPluginRenderMessage VisualPluginRenderMessage; struct VisualPluginSetPositionMessage { UInt32 positionTimeInMS; /* Input */ }; typedef struct VisualPluginSetPositionMessage VisualPluginSetPositionMessage; struct VisualPluginEventMessage { EventRecord * event; /* Input */ }; typedef struct VisualPluginEventMessage VisualPluginEventMessage; struct VisualPluginMessageInfo { union { VisualPluginInitMessage initMessage; VisualPluginShowWindowMessage showWindowMessage; VisualPluginSetWindowMessage setWindowMessage; VisualPluginPlayMessage playMessage; VisualPluginChangeTrackMessage changeTrackMessage; VisualPluginRenderMessage renderMessage; VisualPluginSetPositionMessage setPositionMessage; VisualPluginEventMessage eventMessage; } u; }; typedef struct VisualPluginMessageInfo VisualPluginMessageInfo; /* #if PRAGMA_STRUCT_ALIGN #pragma options align=reset #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(pop) #elif PRAGMA_STRUCT_PACK #pragma pack() #endif */ #ifdef __cplusplus } #endif #endif /* __ITUNESVISUALAPI__ */ \ No newline at end of file
diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/ppc_doubling.s b/src/visualizations/Goom/goom2k4-0/mac/iTunes/ppc_doubling.s
new file mode 100755
index 0000000000..161326152f
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/ppc_doubling.s
@@ -0,0 +1,50 @@
+.section regular,__TEXT
+.globl _ppc_doubling ; name of the function to call by C program
+
+; width (src width)->r3
+; myx (src) ->r4
+; myX (dest) ->r5
+; myX2 (dest + 1 complete line)->r6
+; heigth (src height)->r7
+; inc (increment for next line in dest) ->r8
+
+_ppc_doubling:
+
+mtspr ctr,r3
+
+addi r4,r4,-4
+addi r5,r5,-4
+addi r6,r6,-4
+
+1:;boucle:
+
+lwzu r10,4(r4)
+stwu r10,4(r5)
+stwu r10,4(r5)
+stwu r10,4(r6)
+stwu r10,4(r6)
+
+bdnz 1boucle
+
+subi r7,r7,1
+add r5,r5,r8
+cmpwi cr1,r7,0
+add r6,r6,r8
+mtspr ctr,r3
+bgt cr1,1boucle
+
+blr
+
+;backup
+
+lwzu r10,4(r4)
+stwu r10,4(r5)
+stwu r10,4(r6)
+stwu r10,4(r5)
+stwu r10,4(r6)
+
+lwzu r10,4(r4)
+stwu r10,4(r5)
+stwu r10,4(r6)
+stwu r10,4(r5)
+stwu r10,4(r6)
diff --git a/src/visualizations/Goom/goom2k4-0/mkinstalldirs b/src/visualizations/Goom/goom2k4-0/mkinstalldirs
new file mode 100755
index 0000000000..4191a45dbd
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/mkinstalldirs
@@ -0,0 +1,162 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2009-04-28.21; # UTC
+
+# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+IFS=" "" $nl"
+errstatus=0
+dirmode=
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake@gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+ case $1 in
+ -h | --help | --h*) # -h for help
+ echo "$usage"
+ exit $?
+ ;;
+ -m) # -m PERM arg
+ shift
+ test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+ dirmode=$1
+ shift
+ ;;
+ --version)
+ echo "$0 $scriptversion"
+ exit $?
+ ;;
+ --) # stop option processing
+ shift
+ break
+ ;;
+ -*) # unknown option
+ echo "$usage" 1>&2
+ exit 1
+ ;;
+ *) # first non-opt arg
+ break
+ ;;
+ esac
+done
+
+for file
+do
+ if test -d "$file"; then
+ shift
+ else
+ break
+ fi
+done
+
+case $# in
+ 0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error. This is a problem when calling mkinstalldirs
+# from a parallel make. We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+ '')
+ if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ echo "mkdir -p -- $*"
+ exec mkdir -p -- "$@"
+ else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ test -d ./-p && rmdir ./-p
+ test -d ./--version && rmdir ./--version
+ fi
+ ;;
+ *)
+ if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+ test ! -d ./--version; then
+ echo "mkdir -m $dirmode -p -- $*"
+ exec mkdir -m "$dirmode" -p -- "$@"
+ else
+ # Clean up after NextStep and OpenStep mkdir.
+ for d in ./-m ./-p ./--version "./$dirmode";
+ do
+ test -d $d && rmdir $d
+ done
+ fi
+ ;;
+esac
+
+for file
+do
+ case $file in
+ /*) pathcomp=/ ;;
+ *) pathcomp= ;;
+ esac
+ oIFS=$IFS
+ IFS=/
+ set fnord $file
+ shift
+ IFS=$oIFS
+
+ for d
+ do
+ test "x$d" = x && continue
+
+ pathcomp=$pathcomp$d
+ case $pathcomp in
+ -*) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ else
+ if test ! -z "$dirmode"; then
+ echo "chmod $dirmode $pathcomp"
+ lasterr=
+ chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+ if test ! -z "$lasterr"; then
+ errstatus=$lasterr
+ fi
+ fi
+ fi
+ fi
+
+ pathcomp=$pathcomp/
+ done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/Makefile.am b/src/visualizations/Goom/goom2k4-0/sdl-goom/Makefile.am
new file mode 100644
index 0000000000..417329b020
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/Makefile.am
@@ -0,0 +1,11 @@
+# the goom2 stand alone program
+
+if HAVE_SDL
+bin_PROGRAMS = goom2
+
+goom2_LDADD = $(top_builddir)/src/libgoom2.la
+goom2_LDFLAGS = $(SDL_LIBS) `gtk-config --libs`
+goom2_SOURCES = frame_rate_tester.c gmtimer.c gtk-callbacks.c gtk-interface.c gtk-support.c pixeldoubler.c readme.c sdl_goom.c sdl_pixeldoubler.c surface.c
+INCLUDES=$(SDL_CFLAGS) `gtk-config --cflags` -I../src/
+endif
+
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.c
new file mode 100644
index 0000000000..3e438790dd
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.c
@@ -0,0 +1,83 @@
+/*
+ * file : frame_rate_tester.c
+ * author : JC Hoelt <jeko@free.fr>
+ *
+ * birth : 2001-03-07 22:56
+ * version : 2001-03-07 22:56
+ *
+ * content : the function to calculate the frame rate
+ */
+
+#include "goom_config.h"
+#include "frame_rate_tester.h"
+#include "gmtimer.h"
+#include <pthread.h>
+
+pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
+
+/************** data ******************/
+
+#define NUMBER_OF_FRAMES_IN_BUFFER 20
+
+static float endlessTable[NUMBER_OF_FRAMES_IN_BUFFER];
+static guint32 currentPosInET;
+
+static GMTimer *timer = 0;
+
+/************** functions **************/
+
+/* initialize the tester. do nothing if it has ever been initialized */
+void
+framerate_tester_init ()
+{
+ float curTime;
+ guint32 i;
+
+ pthread_mutex_lock (&mut);
+
+ if (!timer) {
+ timer = gmtimer_new ();
+ }
+ curTime = gmtimer_getvalue (timer);
+ for (i = 0; i < NUMBER_OF_FRAMES_IN_BUFFER; i++)
+ endlessTable[i] = curTime;
+ currentPosInET = 0;
+
+ pthread_mutex_unlock (&mut);
+}
+
+/* close the tester. do nothing if it hasn't been initialized */
+void
+framerate_tester_close ()
+{
+ pthread_mutex_lock (&mut);
+ gmtimer_delete (&timer);
+ timer = 0;
+ pthread_mutex_unlock (&mut);
+}
+
+/* return the frame displayed by seconds */
+float
+framerate_tester_getvalue ()
+{
+ guint32 oldPos;
+ int ret;
+
+ pthread_mutex_lock (&mut);
+ oldPos = (currentPosInET + 1) % NUMBER_OF_FRAMES_IN_BUFFER;
+
+ ret = (float) NUMBER_OF_FRAMES_IN_BUFFER
+ / (endlessTable[currentPosInET] - endlessTable[oldPos]);
+ pthread_mutex_unlock (&mut);
+ return ret;
+}
+
+/* inform the tester that a new frame has been displayed */
+void
+framerate_tester_newframe ()
+{
+ pthread_mutex_lock (&mut);
+ currentPosInET = (currentPosInET + 1) % NUMBER_OF_FRAMES_IN_BUFFER;
+ endlessTable[currentPosInET] = gmtimer_getvalue (timer);
+ pthread_mutex_unlock (&mut);
+}
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.h
new file mode 100644
index 0000000000..07aa4d6815
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.h
@@ -0,0 +1,30 @@
+/*
+ * file : frame_rate_tester.h
+ * author : JC Hoelt <jeko@free.fr>
+ *
+ * birth : 2001-03-07 22:56
+ * version : 2001-03-07 22:56
+ *
+ * content : the function to calculate the frame rate
+ */
+
+#ifndef _FRAME_RATE_TESTER_H
+#define _FRAME_RATE_TESTER_H
+
+#include "goom_config.h"
+
+/************** functions **************/
+
+/* initialize the tester. do nothing if it has ever been initialized */
+void framerate_tester_init ();
+
+/* close the tester. do nothing if it hasn't been initialized */
+void framerate_tester_close ();
+
+/* return the frame displayed per seconds */
+float framerate_tester_getvalue ();
+
+/* inform the tester that a new frame has been displayed */
+void framerate_tester_newframe ();
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.c
new file mode 100644
index 0000000000..a3f00ca06a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.c
@@ -0,0 +1,42 @@
+/*
+ * file : linux/glibfunc.c
+ * author : JC Hoelt <jeko@free.fr>
+ *
+ * birth : 2001-03-03 13:42
+ * version : 2001-03-03 14:10
+ *
+ * content : the function to manipulate the time, etc.
+ */
+
+#include <glib.h>
+#include "gmtimer.h"
+
+/************** functions **************/
+
+/* initialize the timer. do nothing if the timer has ever been initialized */
+GMTimer *
+gmtimer_new ()
+{
+ GTimer *goom_timer = g_timer_new ();
+
+ g_timer_start (goom_timer);
+ return (void *) goom_timer;
+}
+
+/* close the timer. do nothing if the timer hasn't been initialized */
+void
+gmtimer_delete (GMTimer ** t)
+{
+ GTimer *goom_timer = *(GTimer **) t;
+
+ g_timer_stop (goom_timer);
+ g_free (goom_timer);
+ *t = 0;
+}
+
+/* return the number of seconds since the initialization of the timer */
+float
+gmtimer_getvalue (GMTimer * t)
+{
+ return g_timer_elapsed ((GTimer *) t, NULL);
+}
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.h
new file mode 100644
index 0000000000..951369a9f6
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.h
@@ -0,0 +1,31 @@
+/*
+ * file : timer.h
+ * author : JC Hoelt <jeko@free.fr>
+ *
+ * birth : 2001-03-03 13:42
+ * version : 2001-03-03 13:42
+ *
+ * content : the function to manipulate the time.
+ *
+ * this functions are implemented on an os-dependant directory.
+ */
+
+#ifndef _GMTIMER_H
+#define _GMTIMER_H
+
+#include "goom_config.h"
+
+typedef void GMTimer;
+
+/************** functions **************/
+
+/* initialize the timer. do nothing if the timer has ever been initialized */
+GMTimer *gmtimer_new ();
+
+/* close the timer. do nothing if the timer hasn't been initialized */
+void gmtimer_delete (GMTimer ** t);
+
+/* return the number of seconds since the initialization of the timer */
+float gmtimer_getvalue (GMTimer *);
+
+#endif /* _GMTIMER_H */
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.c
new file mode 100644
index 0000000000..d402abafc8
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.c
@@ -0,0 +1,416 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+#include "gtk-callbacks.h"
+#include "gtk-interface.h"
+#include "gtk-support.h"
+
+#define WINSIZE_COMBO "combo_winsize"
+
+#include "sdl_goom.h"
+#include "goom_config_param.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static SdlGoom *sdlGoom;
+static GtkObject *owin;
+
+static GdkColor color_blue;
+static GdkColor color_red;
+
+void highlight_buffer(GtkText *editable)
+{
+ static int last_len = 0;
+ int i, len;
+ int next_add = 0;
+
+ return;
+
+ gint save_pos = gtk_editable_get_position(GTK_EDITABLE(editable)); /* save current pos */
+ gchar *txt = gtk_editable_get_chars (GTK_EDITABLE(editable),0,-1);
+ len = strlen(txt);
+ if (len == 0) return;
+
+ if (len == last_len) return;
+ last_len = len;
+
+ gtk_text_freeze(editable);
+
+ gtk_text_set_point(editable,0);
+ gtk_text_forward_delete(editable,len);
+
+ for (i=0;i<len-1;++i) {
+ if ((txt[i]=='/')&&(txt[i+1]=='*')) {
+ if (i>next_add) {
+ gtk_text_insert (editable, 0, 0, 0, txt+next_add, i-next_add);
+ next_add = i;
+ }
+ }
+ if ((txt[i]=='*')&&(txt[i+1]=='/')) {
+ if (i>next_add) {
+ gtk_text_insert (editable, 0, &color_blue, 0, txt+next_add, i-next_add+2);
+ next_add = i + 2;
+ }
+ }
+ }
+ if (next_add < len) {
+ gtk_text_insert (editable, 0, 0, 0, txt+next_add, len-next_add);
+ }
+
+ /* gtk_editable_set_position(GTK_EDITABLE(editable),save_pos+40);
+ gtk_editable_set_position(GTK_EDITABLE(editable),save_pos-40); */
+
+ gtk_editable_set_position(GTK_EDITABLE(editable),save_pos); /* restore current pos */
+ gtk_text_thaw(editable);
+ g_free(txt);
+}
+
+void
+on_spinbutton_int_changed (GtkEditable *editable,
+ gpointer user_data)
+{
+ PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param");
+ IVAL(*param) = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(editable));
+ param->changed(param);
+}
+
+void
+on_adj_float_changed (GtkWidget *w,
+ gpointer user_data)
+{
+ PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(w),"param");
+ FVAL(*param) = GTK_ADJUSTMENT(w)->value;
+ param->changed(param);
+}
+
+void
+on_text_changed (GtkEditable *editable,
+ gpointer user_data)
+{
+ PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param");
+ gchar *txt = gtk_editable_get_chars (editable,0,-1);
+ set_str_param_value(param, txt);
+ param->changed(param);
+ g_free(txt);
+ highlight_buffer(GTK_TEXT(editable));
+}
+
+void
+on_list_changed (GtkEditable *editable,
+ gpointer user_data)
+{
+ PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param");
+ gchar *txt = gtk_editable_get_chars (editable,0,-1);
+ set_list_param_value(param, txt);
+ param->changed(param);
+ g_free(txt);
+}
+
+void
+on_bool_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(togglebutton),"param");
+ BVAL(*param) = gtk_toggle_button_get_active(togglebutton);
+ param->changed(param);
+}
+
+void my_int_listener (PluginParam *param) {
+ GtkEditable *editable;
+
+ if (sdlGoom->config_win == 0) return;
+ editable = GTK_EDITABLE(param->user_data);
+
+ if (editable) {
+ int pos = 0;
+ char str[256];
+ sprintf (str, "%d", IVAL(*param));
+ if (strcmp(str,gtk_editable_get_chars(editable,0,-1))) {
+ gtk_editable_delete_text (editable,0,-1);
+ gtk_editable_insert_text (editable,str,strlen(str),&pos);
+ }
+ }
+}
+
+void my_list_listener (PluginParam *param) {
+ GtkEntry *editable;
+
+ if (sdlGoom->config_win == 0) return;
+ editable = GTK_ENTRY(param->user_data);
+
+ if (editable) {
+ if (strcmp(gtk_entry_get_text(editable),LVAL(*param))) {
+ gtk_entry_set_text (editable, LVAL(*param));
+ }
+ }
+}
+
+void my_bool_listener (PluginParam *param) {
+ GtkCheckButton *editable;
+
+ if (sdlGoom->config_win == 0) return;
+ editable = GTK_CHECK_BUTTON(param->user_data);
+
+ if (editable) {
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(editable)) != BVAL(*param))
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(editable),BVAL(*param));
+ }
+}
+
+void my_float_listener_progress (PluginParam *param) {
+ GtkProgressBar *progress;
+
+ if (sdlGoom->config_win == 0) return;
+ progress = GTK_PROGRESS_BAR(param->user_data);
+
+ if (progress) {
+ if (FVAL(*param)<FMIN(*param))
+ FVAL(*param) = FMIN(*param);
+ if (FVAL(*param)>FMAX(*param))
+ FVAL(*param) = FMAX(*param);
+ gtk_progress_bar_update (progress, FVAL(*param));
+ }
+}
+
+void my_float_listener_scale (PluginParam *param) {
+ GtkRange *range;
+
+ if (sdlGoom->config_win == 0) return;
+ range = GTK_RANGE(param->user_data);
+
+ if (range) {
+ GtkAdjustment *adj;
+ if (FVAL(*param) < FMIN(*param))
+ FVAL(*param) = FMIN(*param);
+ if (FVAL(*param) > FMAX(*param))
+ FVAL(*param) = FMAX(*param);
+
+ adj = gtk_range_get_adjustment(range);
+ adj->value = FVAL(*param);
+ gtk_adjustment_value_changed(adj);
+// gtk_range_set_adjustment(range, adj);
+ }
+}
+
+void addParams (GtkNotebook *notebook, PluginParameters *params) {
+ int n;
+ GtkWidget *table = gtk_table_new (params->nbParams, 2, FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER (table), 11);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+
+ for (n=0;n<params->nbParams;++n) {
+ if (params->params[n] == 0) {
+ GtkWidget *hseparator = gtk_hseparator_new ();
+ gtk_widget_show (hseparator);
+ gtk_table_attach (GTK_TABLE (table), hseparator, 0, 2, n, n+1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 5);
+ } else {
+ PluginParam *p = params->params[n];
+ int type = p->type;
+
+ if (type != PARAM_BOOLVAL) {
+ GtkWidget *label4 = gtk_label_new (p->name);
+ gtk_widget_show (label4);
+ gtk_table_attach (GTK_TABLE (table), label4, 0, 1, n, n+1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_RIGHT);
+ gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5);
+ }
+
+ switch (type) {
+ case PARAM_INTVAL: {
+ GtkWidget *spinbutton_adj,*spinbutton;
+
+ spinbutton_adj = (GtkWidget*)gtk_adjustment_new (
+ p->param.ival.value,
+ p->param.ival.min, p->param.ival.max,
+ p->param.ival.step, p->param.ival.step*10,
+ p->param.ival.step*10);
+ spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0);
+ gtk_widget_show (spinbutton);
+ gtk_table_attach (GTK_TABLE (table), spinbutton, 1, 2, n, n+1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 1);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
+ gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinbutton),
+ GTK_UPDATE_IF_VALID);
+ p->user_data = spinbutton;
+ gtk_object_set_data (GTK_OBJECT(spinbutton),"param",(void*)p);
+ p->change_listener = my_int_listener;
+ gtk_signal_connect (GTK_OBJECT (spinbutton), "changed",
+ GTK_SIGNAL_FUNC (on_spinbutton_int_changed),
+ NULL);
+ break;
+ }
+
+ case PARAM_FLOATVAL: {
+ GtkWidget *progress,*prog_adj;
+
+ prog_adj = (GtkWidget*)gtk_adjustment_new (
+ p->param.fval.value,
+ p->param.fval.min, p->param.fval.max,
+ p->param.fval.step, p->param.fval.step*10,
+ p->param.fval.step*10);
+
+ if (p->rw)
+ progress = gtk_hscale_new(GTK_ADJUSTMENT(prog_adj));
+ else
+ progress = gtk_progress_bar_new_with_adjustment(GTK_ADJUSTMENT(prog_adj));
+ gtk_widget_show(progress);
+ gtk_table_attach (GTK_TABLE (table), progress, 1, 2, n, n+1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 1);
+
+ p->user_data = progress;
+ if (p->rw) {
+ p->change_listener = my_float_listener_scale;
+ gtk_object_set_data (GTK_OBJECT(prog_adj),"param",(void*)p);
+ gtk_signal_connect (GTK_OBJECT (prog_adj), "value-changed",
+ GTK_SIGNAL_FUNC (on_adj_float_changed),
+ NULL);
+ }
+ else
+ p->change_listener = my_float_listener_progress;
+ break;
+ }
+
+ case PARAM_STRVAL: {
+ GtkWidget *vscrollbar = 0;
+ GtkWidget *text_winsize = gtk_text_new (0,0);
+ gtk_widget_show (text_winsize);
+ gtk_table_attach (GTK_TABLE (table), text_winsize, 1, 2, n, n+1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+ gtk_text_insert (GTK_TEXT(text_winsize), 0, 0, 0, p->param.sval.value, strlen(p->param.sval.value));
+ gtk_text_set_editable(GTK_TEXT(text_winsize), p->rw);
+ /* Add a vertical scrollbar to the GtkText widget */
+ vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text_winsize)->vadj);
+ gtk_table_attach (GTK_TABLE (table), vscrollbar, 2, 3, n, n+1,
+ GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
+ gtk_widget_show (vscrollbar);
+
+/* combo_entry_winsize = GTK_COMBO (combo_winsize)->entry;
+ gtk_widget_show (combo_entry_winsize);
+ gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE);
+ gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p));
+ p->change_listener = my_list_listener;*/
+ p->user_data = text_winsize;
+ gtk_object_set_data (GTK_OBJECT(text_winsize),"param",(void*)p);
+ gtk_signal_connect (GTK_OBJECT (text_winsize), "changed",
+ GTK_SIGNAL_FUNC (on_text_changed),
+ NULL);
+ break;
+ }
+
+ case PARAM_LISTVAL: {
+ int i;
+ GList *combo_winsize_items = NULL;
+ GtkWidget *combo_entry_winsize = NULL;
+ GtkWidget *combo_winsize = gtk_combo_new ();
+ gtk_widget_show (combo_winsize);
+ gtk_table_attach (GTK_TABLE (table), combo_winsize, 1, 2, n, n+1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_combo_set_value_in_list (GTK_COMBO (combo_winsize), TRUE, TRUE);
+ for (i=0;i<p->param.slist.nbChoices;++i)
+ combo_winsize_items = g_list_append (combo_winsize_items,
+ p->param.slist.choices[i]);
+ gtk_combo_set_popdown_strings (GTK_COMBO (combo_winsize), combo_winsize_items);
+ g_list_free (combo_winsize_items);
+
+ combo_entry_winsize = GTK_COMBO (combo_winsize)->entry;
+ gtk_widget_show (combo_entry_winsize);
+ gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE);
+ gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p));
+ p->change_listener = my_list_listener;
+ p->user_data = combo_entry_winsize;
+ gtk_object_set_data (GTK_OBJECT(combo_entry_winsize),"param",(void*)p);
+ gtk_signal_connect (GTK_OBJECT (combo_entry_winsize), "changed",
+ GTK_SIGNAL_FUNC (on_list_changed),
+ NULL);
+ break;
+ }
+
+ case PARAM_BOOLVAL: {
+ GtkWidget *checkbutton_double =
+ gtk_check_button_new_with_label (p->name);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_double),BVAL(*p));
+ gtk_widget_show (checkbutton_double);
+ gtk_table_attach (GTK_TABLE (table), checkbutton_double, 1, 2, n, n+1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_signal_connect (GTK_OBJECT (checkbutton_double), "toggled",
+ GTK_SIGNAL_FUNC (on_bool_toggled),
+ NULL);
+ gtk_object_set_data (GTK_OBJECT(checkbutton_double),"param",(void*)p);
+ p->user_data = checkbutton_double;
+ p->change_listener = my_bool_listener;
+ break;
+ }
+ }
+ }
+ }
+
+ gtk_widget_show_all(GTK_WIDGET(table));
+ gtk_container_add(GTK_CONTAINER(notebook),table);
+ gtk_notebook_set_tab_label_text(notebook,GTK_WIDGET(table),params->name);
+}
+
+void gtk_data_init(SdlGoom *sg) {
+
+ sdlGoom = sg;
+ if (sdlGoom->config_win) {
+ int i;
+ GtkNotebook *notebook;
+ GdkColormap *cmap;
+
+ cmap = gdk_colormap_get_system();
+ color_blue.red = 0;
+ color_blue.blue = 0xffff;
+ color_blue.green = 0;
+ color_red.red = 0xffff;
+ color_red.blue = 0;
+ color_red.green = 0;
+ if ((!gdk_color_alloc(cmap, &color_blue))||(!gdk_color_alloc(cmap, &color_red))) {
+ g_error("couldn't allocate color");
+ }
+
+ owin = GTK_OBJECT(sdlGoom->config_win);
+ notebook = GTK_NOTEBOOK(gtk_object_get_data (owin, "notebook1"));
+ addParams (notebook, &sdlGoom->screen);
+ for (i = 0; i < sdlGoom->plugin->nbParams; ++i) {
+ addParams (notebook, &sdlGoom->plugin->params[i]);
+ }
+ }
+
+}
+
+gboolean
+on_config_window_destroy_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ sdlGoom->config_win = 0;
+ owin = 0;
+ return FALSE;
+}
+
+
+gboolean
+on_config_window_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ sdlGoom->config_win = 0;
+ owin = 0;
+ return FALSE;
+}
+
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.h
new file mode 100644
index 0000000000..15749d22db
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.h
@@ -0,0 +1,24 @@
+#include <gtk/gtk.h>
+
+
+void
+on_checkbutton_double_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_spinbutton_fps_changed (GtkEditable *editable,
+ gpointer user_data);
+
+void
+on_combo_entry_winsize_changed (GtkEditable *editable,
+ gpointer user_data);
+
+gboolean
+on_config_window_destroy_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+gboolean
+on_config_window_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.c
new file mode 100644
index 0000000000..8adc7942a8
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.c
@@ -0,0 +1,138 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include "gtk-callbacks.h"
+#include "gtk-interface.h"
+#include "gtk-support.h"
+
+GtkWidget*
+create_config_window (void)
+{
+ GtkWidget *config_window;
+ GtkWidget *vbox1;
+ GtkWidget *toolbar1;
+ GtkWidget *b_open_config;
+ GtkWidget *b_save_config;
+ GtkWidget *notebook1;
+ GtkWidget *scrolledwindow1;
+ GtkWidget *text1;
+ GtkWidget *goom_control;
+ GtkWidget *statusbar1;
+
+ config_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_widget_set_name (config_window, "config_window");
+ gtk_object_set_data (GTK_OBJECT (config_window), "config_window", config_window);
+ gtk_window_set_title (GTK_WINDOW (config_window), _("Goom Control Center"));
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_set_name (vbox1, "vbox1");
+ gtk_widget_ref (vbox1);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "vbox1", vbox1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (config_window), vbox1);
+
+ toolbar1 = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT);
+ gtk_widget_set_name (toolbar1, "toolbar1");
+ gtk_widget_ref (toolbar1);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "toolbar1", toolbar1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (toolbar1);
+ gtk_box_pack_start (GTK_BOX (vbox1), toolbar1, FALSE, FALSE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (toolbar1), 3);
+ gtk_toolbar_set_space_size (GTK_TOOLBAR (toolbar1), 8);
+ gtk_toolbar_set_space_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_SPACE_LINE);
+
+ b_open_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1),
+ GTK_TOOLBAR_CHILD_BUTTON,
+ NULL,
+ _("Open..."),
+ NULL, NULL,
+ NULL, NULL, NULL);
+ gtk_widget_set_name (b_open_config, "b_open_config");
+ gtk_widget_ref (b_open_config);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "b_open_config", b_open_config,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (b_open_config);
+
+ b_save_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1),
+ GTK_TOOLBAR_CHILD_BUTTON,
+ NULL,
+ _("Save..."),
+ NULL, NULL,
+ NULL, NULL, NULL);
+ gtk_widget_set_name (b_save_config, "b_save_config");
+ gtk_widget_ref (b_save_config);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "b_save_config", b_save_config,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (b_save_config);
+
+ notebook1 = gtk_notebook_new ();
+ gtk_widget_set_name (notebook1, "notebook1");
+ gtk_widget_ref (notebook1);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "notebook1", notebook1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (notebook1);
+ gtk_box_pack_start (GTK_BOX (vbox1), notebook1, TRUE, TRUE, 0);
+ gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook1), GTK_POS_LEFT);
+
+ scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_set_name (scrolledwindow1, "scrolledwindow1");
+ gtk_widget_ref (scrolledwindow1);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "scrolledwindow1", scrolledwindow1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (scrolledwindow1);
+ gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow1);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+
+ text1 = gtk_text_new (NULL, NULL);
+ gtk_widget_set_name (text1, "text1");
+ gtk_widget_ref (text1);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "text1", text1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (text1);
+ gtk_container_add (GTK_CONTAINER (scrolledwindow1), text1);
+ gtk_widget_set_usize (text1, 400, 300);
+ { char *str = _("What a GOOM!!\n\nCopyright (c)2000-2004, by Jean-Christophe Hoelt <jeko@ios-software.com>\n\nThis is my first visual plugins for XMMS, and I\nthink that it's the best I have ever done!\nYou can grab our last version and help us with a donation at\nhttp://www.ios-software.com/\nThanks and enjoy!\n\n\tJeko");
+ gtk_text_insert (GTK_TEXT (text1), NULL, NULL, NULL, str, strlen(str));
+ }
+
+ goom_control = gtk_label_new (_("About goom..."));
+ gtk_widget_set_name (goom_control, "goom_control");
+ gtk_widget_ref (goom_control);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "goom_control", goom_control,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (goom_control);
+ gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), goom_control);
+
+ statusbar1 = gtk_statusbar_new ();
+ gtk_widget_set_name (statusbar1, "statusbar1");
+ gtk_widget_ref (statusbar1);
+ gtk_object_set_data_full (GTK_OBJECT (config_window), "statusbar1", statusbar1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (statusbar1);
+ gtk_box_pack_start (GTK_BOX (vbox1), statusbar1, FALSE, FALSE, 0);
+
+ gtk_signal_connect (GTK_OBJECT (config_window), "destroy_event",
+ GTK_SIGNAL_FUNC (on_config_window_destroy_event),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (config_window), "delete_event",
+ GTK_SIGNAL_FUNC (on_config_window_delete_event),
+ NULL);
+
+ return config_window;
+}
+
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.h
new file mode 100644
index 0000000000..95b003d030
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.h
@@ -0,0 +1,5 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+GtkWidget* create_config_window (void);
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.c
new file mode 100644
index 0000000000..732554c1cb
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.c
@@ -0,0 +1,162 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include "gtk-support.h"
+
+/* This is an internally used function to check if a pixmap file exists. */
+static gchar* check_file_exists (const gchar *directory,
+ const gchar *filename);
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget* create_dummy_pixmap (GtkWidget *widget);
+
+GtkWidget*
+lookup_widget (GtkWidget *widget,
+ const gchar *widget_name)
+{
+ GtkWidget *parent, *found_widget;
+
+ for (;;)
+ {
+ if (GTK_IS_MENU (widget))
+ parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+ else
+ parent = widget->parent;
+ if (parent == NULL)
+ break;
+ widget = parent;
+ }
+
+ found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget),
+ widget_name);
+ if (!found_widget)
+ g_warning ("Widget not found: %s", widget_name);
+ return found_widget;
+}
+
+/* This is a dummy pixmap we use when a pixmap can't be found. */
+static char *dummy_pixmap_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"1 1 1 1",
+" c None",
+/* pixels */
+" "
+};
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget*
+create_dummy_pixmap (GtkWidget *widget)
+{
+ GdkColormap *colormap;
+ GdkPixmap *gdkpixmap;
+ GdkBitmap *mask;
+ GtkWidget *pixmap;
+
+ colormap = gtk_widget_get_colormap (widget);
+ gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask,
+ NULL, dummy_pixmap_xpm);
+ if (gdkpixmap == NULL)
+ g_error ("Couldn't create replacement pixmap.");
+ pixmap = gtk_pixmap_new (gdkpixmap, mask);
+ gdk_pixmap_unref (gdkpixmap);
+ gdk_bitmap_unref (mask);
+ return pixmap;
+}
+
+static GList *pixmaps_directories = NULL;
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory (const gchar *directory)
+{
+ pixmaps_directories = g_list_prepend (pixmaps_directories,
+ g_strdup (directory));
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap (GtkWidget *widget,
+ const gchar *filename)
+{
+ gchar *found_filename = NULL;
+ GdkColormap *colormap;
+ GdkPixmap *gdkpixmap;
+ GdkBitmap *mask;
+ GtkWidget *pixmap;
+ GList *elem;
+
+ if (!filename || !filename[0])
+ return create_dummy_pixmap (widget);
+
+ /* We first try any pixmaps directories set by the application. */
+ elem = pixmaps_directories;
+ while (elem)
+ {
+ found_filename = check_file_exists ((gchar*)elem->data, filename);
+ if (found_filename)
+ break;
+ elem = elem->next;
+ }
+
+ /* If we haven't found the pixmap, try the source directory. */
+ if (!found_filename)
+ {
+ found_filename = check_file_exists ("../pixmaps", filename);
+ }
+
+ if (!found_filename)
+ {
+ g_warning (_("Couldn't find pixmap file: %s"), filename);
+ return create_dummy_pixmap (widget);
+ }
+
+ colormap = gtk_widget_get_colormap (widget);
+ gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask,
+ NULL, found_filename);
+ if (gdkpixmap == NULL)
+ {
+ g_warning (_("Error loading pixmap file: %s"), found_filename);
+ g_free (found_filename);
+ return create_dummy_pixmap (widget);
+ }
+ g_free (found_filename);
+ pixmap = gtk_pixmap_new (gdkpixmap, mask);
+ gdk_pixmap_unref (gdkpixmap);
+ gdk_bitmap_unref (mask);
+ return pixmap;
+}
+
+/* This is an internally used function to check if a pixmap file exists. */
+gchar*
+check_file_exists (const gchar *directory,
+ const gchar *filename)
+{
+ gchar *full_filename;
+ struct stat s;
+ gint status;
+
+ full_filename = (gchar*) g_malloc (strlen (directory) + 1
+ + strlen (filename) + 1);
+ strcpy (full_filename, directory);
+ strcat (full_filename, G_DIR_SEPARATOR_S);
+ strcat (full_filename, filename);
+
+ status = stat (full_filename, &s);
+ if (status == 0 && S_ISREG (s.st_mode))
+ return full_filename;
+ g_free (full_filename);
+ return NULL;
+}
+
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.h
new file mode 100644
index 0000000000..931bc5ad04
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.h
@@ -0,0 +1,61 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+/*
+ * Standard gettext macros.
+ */
+#ifdef ENABLE_NLS
+# include <libintl.h>
+# undef _
+# define _(String) dgettext (PACKAGE, String)
+# ifdef gettext_noop
+# define N_(String) gettext_noop (String)
+# else
+# define N_(String) (String)
+# endif
+#else
+# define textdomain(String) (String)
+# define gettext(String) (String)
+# define dgettext(Domain,Message) (Message)
+# define dcgettext(Domain,Message,Type) (Message)
+# define bindtextdomain(Domain,Directory) (Domain)
+# define _(String) (String)
+# define N_(String) (String)
+#endif
+
+
+/*
+ * Public Functions.
+ */
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget* lookup_widget (GtkWidget *widget,
+ const gchar *widget_name);
+
+/* get_widget() is deprecated. Use lookup_widget instead. */
+#define get_widget lookup_widget
+
+/* Use this function to set the directory containing installed pixmaps. */
+void add_pixmap_directory (const gchar *directory);
+
+
+/*
+ * Private Functions.
+ */
+
+/* This is used to create the pixmaps in the interface. */
+GtkWidget* create_pixmap (GtkWidget *widget,
+ const gchar *filename);
+
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.c
new file mode 100644
index 0000000000..04a6827088
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.c
@@ -0,0 +1,44 @@
+#include "pixeldoubler.h"
+#include <stdlib.h>
+#include <string.h>
+
+void pixel_doubler (Surface *src, Surface *dest) {
+ register int *d; // pointeur sur le pixel courant a marquer
+ register int *s; // pointeur sur le pixel coutant en cours de lecture
+ int sw; // nombre d'octet de largeur de ligne de la surface source
+ int sw2;
+ int fd; // adresse de la fin du buffer destination
+ int fin; // adresse de fin d'une ligne du buffer source
+
+ d = dest->buf;
+ s = src->buf;
+
+ sw = src->width << 2;
+ sw2 = sw << 1;
+
+ fin = (int)s;
+ fd = (int)d + (dest->size<<2);
+
+ // tant que tout le buffer source n'est pas remplit
+ while ((int)d < fd) {
+
+ // passer a la ligne suivante du buffer source
+ fin += sw;
+
+ // l'afficher sur une ligne du buffer destination
+ while ((int)s < fin) {
+ register int col = *(s++);
+ // 2 affichage par point du buffer source (doubling horizontal)
+ *(d++) = col; *(d++) = col;
+ }
+
+ // puis l'afficher sur une autre ligne (doubling vertical)
+ memcpy (d, ((char*)d) - sw2, sw2);
+/* s = (int*)((int)s - sw); // retour au debut de la ligne src
+ while ((int)s < fin) {
+ register int col = *(s++);
+ *(d++) = col; *(d++) = col; // idem (cf plus haut)
+ } */
+ d = (int*)((char*)d + sw2);
+ }
+}
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.h
new file mode 100644
index 0000000000..a1b6d9f303
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.h
@@ -0,0 +1,58 @@
+#ifndef _PIXELDOUBLER_H
+#define _PIXELDOUBLER_H
+
+#include "surface.h"
+
+/*
+ * copie la surface src dans la surface dest en doublant la taille des pixels.
+ *
+ * la surface dest doit faire exactement 2 fois la taille de la surface src.
+ * (segfault sinon).
+ *
+ * auteur : JeKo <jeko@free.fr>
+ *
+ * bench : <2001-11-28|20h00> 9 cycles par pixel marqué (cpm) sur un PII 266.
+ * (surement limité par le debit de la memoire vive..
+ * je fonce chez moi verifier)
+ * <chez moi|1h10> 11 cpm sur un Duron 800. (i.e. pas loin de 300fps)
+ * surement que les acces memoires sont assez penalisant.
+ * je tente d'aligner les données des surfaces pour voir.
+ * => pas mieux : le systeme doit deja faire ca comme il faut.
+ * mais pour l'alignement 64bits ca va etre utile : je passe a l'ASM
+ * <3h00> l'optimisation asm a permi de gagner vraiment pas grand
+ * chose (0.1 ms sur mon Duron).. le code en C semble suffisant.
+ * et je persiste a croire ke la vitesse est plafonné par la vitesse
+ * d'acces a la memoire.. ceci expliquerait aussi cela.
+ *
+ * <2001-12-08|1h20> Travail sur le code assembleur :
+ * pour reduire les temps d'acces memoire, utilisation de
+ * l'instruction 3Dnow! PREFETCH/W pour le prechargement des
+ * page de cache. pour pousser cette optimisation jusque au bout :
+ * j'ai déroulé la boucle pour qu'elle traite a chaque passage
+ * une page de cache complete en lecture et 2 en ecriture.
+ * (optimisé sur un Duron=Athlon, page de cache = 64 octets)
+ * preformances sur mon Duron 800 : 9 CPM.
+ * (ce qui fait 18% de mieux que la version en C)
+ * ATTENTION : CETTE VERSION NE SUPPORTE DONC QUE DES TAILLES DE
+ * SURFACE AYANT UNE LARGEUR MULTIPLE DE 32 POUR DEST,
+ * DONC 16 POUR SRC. (ce qui n'est pas tres genant puisque ce sont
+ * des resolutions standard, mais il faut le savoir)
+ * explication : alignement des données sur la taille des pages de
+ * cache.
+ *
+ * <2001-12-08|14h20> Apres intense potassage de la doc de l'Athlon,
+ * decouverte certaines subtilités de ce FABULEUX processeur :)
+ * entrelacement de la copie de 2 pixel, plus utilisation de
+ * l'instruction de transfert rapide 3Dnow! MOVNTQ... attention les
+ * chiffres -> sur mon Duron 800 : 4 CPM !!!!!
+ *
+ * note : ne fonctionne que sur un systeme 32bits.. mais le faire fonctionner
+ * sur une machine autre ne posera aucun probleme.
+ * (le seul truc c'est ke j'ai considéré mes pointeurs comme des entiers
+ * 32bits <- je sais je suis vaxiste, et alors???:)
+ *
+ * copyright (c)2001, JC Hoelt for iOS software.
+ */
+void pixel_doubler (Surface *src, Surface *dest) ;
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler_athlon.s b/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler_athlon.s
new file mode 100644
index 0000000000..efc790171c
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler_athlon.s
@@ -0,0 +1,118 @@
+bits 32
+global pixel_doubler
+
+%macro twopixproc 0
+%rep 2
+ movq mm0,[esi] ; -> P1P2
+ movq mm2,[esi+8] ; -> P3P4
+
+ movq mm1,mm0
+ movq mm3,mm2
+
+ punpckldq mm1,mm1 ; P1P2 | P1P2 -> P1P1
+ punpckhdq mm0,mm0 ; P1P2 | P1P2 -> P2P2
+
+ movntq [edi],mm1
+ punpckldq mm3,mm3 ; P3P4 | P3P4 -> P3P3
+
+ movntq [edi+8],mm0
+ punpckhdq mm2,mm2 ; P3P4 | P3P4 -> P4P4
+
+ movntq [edi+16],mm3
+ movq mm4,[esi+16]
+
+ movntq [edi+24],mm2
+ movq mm6,[esi+24]
+
+ movq mm5,mm4
+ movq mm7,mm6
+
+ punpckldq mm5,mm5 ; P1P2 | P1P2 -> P1P1
+ punpckhdq mm4,mm4 ; P1P2 | P1P2 -> P2P2
+
+ movntq [edi+32],mm5
+ punpckldq mm7,mm7 ; P3P4 | P3P4 -> P3P3
+
+ movntq [edi+40],mm4
+ punpckhdq mm6,mm6 ; P3P4 | P3P4 -> P4P4
+
+ movntq [edi+48],mm7
+ add esi,32
+
+ movntq [edi+56],mm6
+ add edi,64
+%endrep
+%endmacro
+
+%macro prefetcher 0
+ prefetch [esi+128]
+%endmacro
+
+
+align 16
+pixel_doubler:
+ push ebp
+ mov ebp,esp
+ push edi
+ push esi
+ push ebx
+ push ecx
+ push edx
+
+ mov ecx,[ebp+8] ; ecx <- src
+ mov edx,[ebp+12] ; edx <- dest
+
+ mov esi,[ecx] ; esi <- src->buf
+ mov edi,[edx] ; edi <- dest->buf
+
+ mov ebx,[ecx+4] ; ebx <- src->width
+ mov eax,[ecx+8] ; eax <- src->height
+
+ shl ebx,2 ; width *= 4 (in byte)
+ mov edx,ebx ; edx <- width in byte
+ shr ebx,6 ; width in cache page
+
+align 16
+while_1:
+ prefetch [esi] ; prefetch the first cache line
+ prefetch [esi+64]
+
+ mov ecx,ebx
+
+while_2:
+ prefetcher
+ twopixproc
+
+ dec ecx
+ jnz while_2
+; end_while_2
+
+ sub esi,edx
+ mov ecx,ebx
+
+ prefetch [esi] ; prefetch the first cache line
+ prefetch [esi+64]
+
+while_3:
+ prefetcher
+ twopixproc
+
+ dec ecx
+ jnz while_3
+; end_while_3
+
+ dec eax ; decremente le nombre de ligne testee
+ jnz while_1 ; on continue si c'etait pas la derniere
+
+; end_while_1:
+
+ sfence
+ femms
+
+ pop edx
+ pop ecx
+ pop ebx
+ pop esi
+ pop edi
+ leave
+ ret
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/readme.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/readme.c
new file mode 100644
index 0000000000..23df8ea872
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/readme.c
@@ -0,0 +1,49 @@
+#ifndef _GOOM_README_H
+#define _GOOM_README_H
+
+/* Automatically generated from README, via Makefile.am */
+static char goom_readme[] =
+"TAB - Enter/Leave Fullscreen\n"
+"Numpad +/- - Change resolution\n"
+"F1-F8 - Set Background FX\n"
+"\n"
+"F - Display Frame Rate\n"
+"Q - Quit\n";
+
+static char goom_big_readme[] =
+"****************************\n"
+"* What a GOOM! version 2k4 *\n"
+"****************************\n"
+"by Jean-Christophe 'Jeko' Hoelt\n"
+"\n"
+"\n"
+"The incredible trippy visualization plugin!!\n"
+"\n"
+"\n"
+"\n"
+"...... freely offered by iOS-Software\n"
+"Wanna find the last version of goom or support\n"
+"us with a donation? There you go:\n"
+"\n"
+"http://www.ios-software.com/\n"
+"\n"
+"\n"
+"\n"
+"...... many thanks to:\n"
+"\n"
+"Skal for the code of IFS\n"
+"\n"
+"Gyom for the iTunes version\n"
+" and some of the main work\n"
+"\n"
+"Fred for the Windows version and a lot of\n"
+" other Goom Stuff\n"
+"\n"
+"Dennis and guys of libvisual for their\n"
+" help on the unix package\n"
+"\n"
+"\n"
+"\n"
+"Enjoy!";
+
+#endif /* _GOOM_README_H */
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.c
new file mode 100644
index 0000000000..3ae99fc4c9
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.c
@@ -0,0 +1,746 @@
+#include <glib.h>
+#include <gtk/gtk.h>
+#include "goom_config.h"
+
+#include <SDL.h>
+#include <SDL_thread.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#include "goom_tools.h"
+#include "goom.h"
+
+#include "frame_rate_tester.h"
+#include "gmtimer.h"
+
+#include "pixeldoubler.h"
+#include "sdl_pixeldoubler.h"
+
+#include "readme.c"
+
+#include "gtk-support.h"
+#include "gtk-interface.h"
+
+#include "sdl_goom.h"
+
+static SdlGoom sdlGoom;
+
+//#define BENCHMARK_X86
+#ifdef BENCHMARK_X86
+#include <stdint.h>
+static uint64_t GetTick()
+{
+ uint64_t x;
+ /* __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));*/
+ asm volatile ("RDTSC" : "=A" (x));
+ return x;
+}
+#endif
+
+/**
+ * Callback des parametres
+ */
+static void screen_size_changed (PluginParam *);
+static void fps_limit_changed (PluginParam *);
+static void pix_double_changed (PluginParam *);
+static void hide_cursor_changed (PluginParam *);
+
+/**
+ * Initialise les parametres de la version SDL
+ */
+static void init_parameters() {
+
+ static char *resolutions[4] = {"320x240","400x300","640x480","800x600"};
+ static struct ListVal reslist = {
+ value:0,
+ nbChoices:4,
+ choices:resolutions
+ };
+
+ sdlGoom.screen_size = secure_param ();
+ sdlGoom.screen_size.name = "Window's Size:";
+ sdlGoom.screen_size.desc = "";
+ sdlGoom.screen_size.type = PARAM_LISTVAL;
+ sdlGoom.screen_size.param.slist = reslist;
+ sdlGoom.screen_size.changed = screen_size_changed;
+ set_list_param_value(&sdlGoom.screen_size, "400x300");
+
+ sdlGoom.fps_limit = secure_param ();
+ sdlGoom.fps_limit.name = "Frame Rate:";
+ sdlGoom.fps_limit.desc = "";
+ sdlGoom.fps_limit.type = PARAM_INTVAL;
+ sdlGoom.fps_limit.param.ival.min = 1;
+ sdlGoom.fps_limit.param.ival.max = 35;
+ sdlGoom.fps_limit.param.ival.value = 30;
+ sdlGoom.fps_limit.param.ival.step = 1;
+ sdlGoom.fps_limit.changed = fps_limit_changed;
+
+ sdlGoom.pix_double = secure_param ();
+ sdlGoom.pix_double.name = "Double Pixel";
+ sdlGoom.pix_double.type = PARAM_BOOLVAL;
+ sdlGoom.pix_double.changed = pix_double_changed;
+ BVAL(sdlGoom.pix_double) = 0;
+
+ sdlGoom.hide_cursor = secure_param ();
+ sdlGoom.hide_cursor.name = "Hide Cursor";
+ sdlGoom.hide_cursor.type = PARAM_BOOLVAL;
+ sdlGoom.hide_cursor.changed = hide_cursor_changed;
+ BVAL(sdlGoom.hide_cursor) = 1;
+
+ sdlGoom.display_fps = secure_param ();
+ sdlGoom.display_fps.name = "Display FPS";
+ sdlGoom.display_fps.type = PARAM_BOOLVAL;
+ BVAL(sdlGoom.display_fps) = 0;
+
+ sdlGoom.screen = plugin_parameters("Display", 7);
+ sdlGoom.screen.params[0]=&sdlGoom.screen_size;
+ sdlGoom.screen.params[1]=&sdlGoom.pix_double;
+ sdlGoom.screen.params[2]=0;
+ sdlGoom.screen.params[3]=&sdlGoom.fps_limit;
+ sdlGoom.screen.params[4]=&sdlGoom.display_fps;
+ sdlGoom.screen.params[5]=0;
+ sdlGoom.screen.params[6]=&sdlGoom.hide_cursor;
+
+ sdlGoom.config_win = 0;
+ sdlGoom.screen_height = 300;
+ sdlGoom.screen_width = 400;
+ sdlGoom.doublepix = 0;
+ sdlGoom.active = 1;
+}
+
+/*
+ * Methodes utilitaires
+ */
+char *sdl_goom_set_doublepix (int dp);
+static void apply_double ();
+
+
+static int resx = 400;
+static int resy = 300;
+static int doublepix = 0;
+static int doubledec = 0;
+
+static int MAX_FRAMERATE = 32;
+static double INTERPIX = 1000.0f / 32;
+
+static SDL_Surface *surface = NULL;
+static int is_fs = 0;
+
+/* static void thread_func (); */
+
+static void sdl_goom_init (int argc, char **argv);
+static void sdl_goom_cleanup ();
+static void sdl_goom_loop ();
+static void sdl_goom_render_pcm (gint16 data[2][512], gchar *title);
+
+static Surface *gsurf2 = NULL;
+static Surface gsurf;
+static char *main_script = NULL;
+static char *init_script = NULL;
+
+static int fini = 0;
+static int disable = 0;
+static gint16 snd_data[2][512];
+
+#include <signal.h>
+
+void on_kill(int i) {
+ fini = 1;
+ disable = 1;
+}
+
+int main (int argc, char **argv) {
+
+ gtk_set_locale ();
+ gtk_init (&argc, &argv);
+
+ sdl_goom_init(argc, argv);
+ signal(SIGQUIT, on_kill);
+ sdl_goom_loop();
+ sdl_goom_cleanup();
+ return 0;
+}
+
+static char *load_file(const char *fname)
+{
+ FILE *f = fopen(fname, "rt");
+ long size;
+ char *sc;
+
+ if (!f) {
+ fprintf(stderr, "Could not load file %s\n", fname);
+ return "";
+ }
+
+ fseek(f, 0L, SEEK_END);
+ size = ftell(f);
+ rewind(f);
+ sc = (char*)malloc(size+1);
+ fread(sc,1,size,f);
+ sc[size] = 0;
+ fclose(f);
+ printf("%s loaded\n", fname);
+ return sc;
+}
+
+static void display_help()
+{
+ printf("usage: goom2 <init_script> <main_script>\n");
+}
+
+static void check_arg(int argc, char *argv)
+{
+ static int has_init = 0;
+ static int has_main = 0;
+
+ if (argv[0] == '-') {
+ if ((!strcmp(argv,"-h"))||(!strcmp(argv,"--help"))) {
+ display_help();
+ exit(0);
+ }
+ }
+ else if (!has_init) {
+ init_script = load_file(argv);
+ has_init = 1;
+ }
+ else if (!has_main) {
+ main_script = load_file(argv);
+ has_main = 1;
+ }
+}
+
+void sdl_goom_init (int argc, char **argv)
+{
+ gint16 data[2][512];
+ int i;
+ int init_flags = SDL_INIT_VIDEO;
+
+ for (i=1; i<argc; ++i) {
+ check_arg(i,argv[i]);
+ }
+
+ init_parameters();
+
+#ifdef VERBOSE
+ printf ("--> INITIALIZING GOOM\n");
+#endif
+
+ fini = FALSE;
+#ifdef THIS_MAKES_ATI_CARDS_TO_CRASH__linux__
+ /* This Hack Allows Hardware Surface on Linux */
+ setenv("SDL_VIDEODRIVER","dga",0);
+
+ if (SDL_Init(init_flags) < 0) {
+ printf(":-( Could not use DGA. Try using goom2 as root.\n");
+ setenv("SDL_VIDEODRIVER","x11",1);
+ if (SDL_Init(init_flags) < 0) {
+ fprintf(stderr, "SDL initialisation error: %s\n", SDL_GetError());
+ exit(1);
+ }
+ }
+ else {
+ printf(":-) DGA Available !\n");
+ SDL_WM_GrabInput(SDL_GRAB_ON);
+ }
+#else
+ if ( SDL_Init(init_flags) < 0 ) {
+ fprintf(stderr, "SDL initialisation error: %s\n", SDL_GetError());
+ exit(1);
+ }
+#endif
+ surface = SDL_SetVideoMode (resx, resy, 32,
+ SDL_RESIZABLE|SDL_SWSURFACE);
+ SDL_WM_SetCaption ("What A Goom!!", NULL);
+ SDL_ShowCursor (0);
+ SDL_EnableKeyRepeat (0, 0);
+ atexit(SDL_Quit);
+
+ apply_double ();
+ sdlGoom.plugin = goom_init (resx, resy);
+
+ /*if (init_script != NULL) {
+ gsl_ex(sdlGoom.plugin, init_script);
+ }
+
+ if (main_script != NULL) {
+ goom_set_main_script(sdlGoom.plugin, main_script);
+ }*/
+
+ for (i = 0; i < 512; i++) {
+ data[0][i] = 0;
+ data[1][i] = 0;
+ }
+
+ framerate_tester_init ();
+}
+
+/* retourne x>>s , en testant le signe de x */
+#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s))
+
+static void
+sdl_goom_loop()
+{
+ static double tnext = 0;
+ static gint16 prev0 = 0;
+ static int i, j;
+ gchar *ptitle = NULL;
+ static char title[2048];
+
+ if (tnext < 0.01)
+ tnext = INTERPIX + SDL_GetTicks();
+
+ while (!fini) {
+ double t;
+ sdl_goom_render_pcm (snd_data, ptitle);
+ ptitle = NULL;
+
+ /* load the sound data */
+ {
+ fd_set rfds;
+ struct timeval tv;
+ int retval;
+
+ tv.tv_sec = 0;
+ tv.tv_usec = 10;
+
+ FD_ZERO(&rfds);
+ FD_SET(0, &rfds);
+ retval = select(1, &rfds, NULL, NULL, &tv);
+
+ if (retval) {
+ int type;
+ read (0, &type, sizeof(int));
+ switch (type) {
+ case 0:
+ read (0, snd_data, 512*2*2);
+ break;
+ case 1:
+ read (0, title, 2048);
+ ptitle = &title[0];
+ break;
+ case 2:
+ fini = 1;
+ disable = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (prev0 == snd_data[0][0]) {
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < 512; j++)
+ snd_data[i][j] = ShiftRight((snd_data[i][j] * 31),5);
+ }
+ prev0 = snd_data[0][0];
+
+ t = SDL_GetTicks();
+ if (t < tnext) {
+ float t2s = (tnext-t);
+ while (t2s>20) {
+ usleep(20*1000);
+ gtk_main_iteration_do(FALSE);
+ t = SDL_GetTicks();
+ t2s = tnext-t;
+ }
+ tnext += INTERPIX;
+ }
+ else {
+ tnext = t+INTERPIX;
+ }
+ i = 0;
+ while (gtk_main_iteration_do(FALSE) == TRUE) {
+ if (i++ > 10)
+ break;
+ }
+ }
+ /* else {
+ * gtk_main_quit();
+ * }
+ */
+}
+
+static void
+sdl_goom_cleanup (void)
+{
+#ifdef VERBOSE
+ printf ("--> CLEANUP GOOM\n");
+#endif
+
+ if (is_fs) {
+ SDL_WM_ToggleFullScreen (surface);
+ }
+ SDL_Quit ();
+
+ goom_close (sdlGoom.plugin);
+ framerate_tester_close ();
+}
+
+
+/*===============================*/
+
+static void apply_double () {
+
+ if (gsurf2) surface_delete (&gsurf2);
+ if (!doublepix)
+ return;
+
+ if (surface->format->BytesPerPixel == 4)
+ doublepix = 2;
+ else
+ doublepix = 1;
+
+ if (doublepix==2) {
+ resx /= 2;
+ resy /= 2;
+ doubledec = 0;
+ }
+ else if (doublepix == 1) {
+ doubledec = resx % 32;
+ resx = resx - doubledec;
+ resx /= 2;
+ resy /= 2;
+ doubledec /= 2;
+ gsurf2 = surface_new (resx*2,resy*2);
+ }
+
+ gsurf.width = resx;
+ gsurf.height = resy;
+ gsurf.size = resx*resy;
+}
+
+
+static char * resize_win (int w, int h, int force) {
+ static char s[256];
+ if ((w != sdlGoom.screen_width)||(h != sdlGoom.screen_height)||force) {
+ static SDL_Event e;
+ e.resize.type = SDL_VIDEORESIZE;
+ e.resize.w = w;
+ e.resize.h = h;
+ SDL_PushEvent (&e);
+ }
+ sprintf (s,"%dx%d",w,h);
+ return s;
+}
+
+static void
+sdl_goom_render_pcm (gint16 data[2][512], gchar *title)
+{
+#ifdef BENCHMARK_X86
+ uint64_t t0,t1,t2;
+#endif
+ static char *msg_tab[] = {
+ "What a GOOM! version " VERSION
+ "\n\n\n\n\n\n\n\n"
+ "an iOS sotfware production.\n"
+ "\n\n\n"
+ "http://www.ios-software.com/",
+ goom_readme,
+ goom_big_readme,
+ "Copyright (c)2000-2004, by Jeko"
+ };
+ static int msg_pos = 0;
+#define ENCORE_NUL_LOCK (32*200)
+ static int encore_nul = 0;
+
+ guint32 *buf;
+ SDL_Surface *tmpsurf = NULL;
+
+ /* static int spos = -1; */
+
+ gchar *message = NULL;
+
+ /* TODO : Utiliser une commande dans le pipe *
+ * int pos = xmms_remote_get_playlist_pos (jeko_vp.xmms_session);
+ */
+
+ int forceMode = 0;
+
+#define NBresoli 11
+ static int resoli = 7;
+ static int resolx[] = {320,320,400,400,512,512,640,640,640,800,800};
+ static int resoly[] = {180,240,200,300,280,384,320,400,480,400,600};
+
+ int i;
+ SDL_Event event;
+
+ /* Check for events */
+ while (SDL_PollEvent (&event)) { /* Loop until there are no events left on
+ * the queue */
+ switch (event.type) { /* Process the appropiate event type */
+ case SDL_QUIT:
+ {
+ fini = 1;
+ disable = TRUE;
+ }
+ break;
+
+ case SDL_ACTIVEEVENT:
+ if (event.active.state & SDL_APPACTIVE)
+ sdlGoom.active = event.active.gain;
+ break;
+
+ case SDL_KEYDOWN: /* Handle a KEYDOWN event */
+ if (event.key.keysym.sym == SDLK_TAB) {
+ SDL_WM_ToggleFullScreen (surface);
+ is_fs = !is_fs;
+ }
+
+ if (event.key.keysym.sym == SDLK_q) {
+ fini = 1;
+ }
+ /*
+ * TODO : GERER TOUT CA AVEC XMMS REMOTE CTRL ? ou le pipe *
+ if (event.key.keysym.sym == SDLK_q) {
+ xmms_remote_quit (jeko_vp.xmms_session);
+ }
+
+ if (event.key.keysym.sym == SDLK_x)
+ xmms_remote_play (jeko_vp.xmms_session);
+ if (event.key.keysym.sym == SDLK_c)
+ xmms_remote_pause (jeko_vp.xmms_session);
+ if (event.key.keysym.sym == SDLK_v)
+ xmms_remote_stop (jeko_vp.xmms_session);
+ if (event.key.keysym.sym == SDLK_b)
+ xmms_remote_playlist_next (jeko_vp.xmms_session);
+ if (event.key.keysym.sym == SDLK_z)
+ xmms_remote_playlist_prev (jeko_vp.xmms_session);
+ */
+
+ if (event.key.keysym.sym == SDLK_f) {
+ BVAL(sdlGoom.display_fps) = !BVAL(sdlGoom.display_fps);
+ sdlGoom.display_fps.change_listener(&sdlGoom.display_fps);
+ }
+
+ if ((event.key.keysym.sym == SDLK_KP_PLUS) && (resoli+1<NBresoli)) {
+ resoli = resoli+1;
+ resize_win (resolx[resoli],resoly[resoli],FALSE);
+ }
+ if ((event.key.keysym.sym == SDLK_KP_MINUS) && (resoli>0)) {
+ resoli = resoli-1;
+ resize_win (resolx[resoli],resoly[resoli],FALSE);
+ }
+
+ if (event.key.keysym.sym == SDLK_KP_MULTIPLY) {
+ title = sdl_goom_set_doublepix (!doublepix);
+ }
+ if (event.key.keysym.sym == SDLK_ESCAPE) {
+ if (is_fs) {
+ SDL_WM_ToggleFullScreen (surface);
+ is_fs = !is_fs;
+ }
+ else if (sdlGoom.config_win == 0) {
+ sdlGoom.config_win = create_config_window ();
+ gtk_data_init (&sdlGoom);
+ gtk_widget_show (sdlGoom.config_win);
+ message = "";
+ }
+ else {
+ message = "Configuration Window is Already Open";
+ }
+ }
+ if (event.key.keysym.sym == SDLK_SPACE) {
+ encore_nul = ENCORE_NUL_LOCK;
+ }
+
+ if (event.key.keysym.sym == SDLK_F1)
+ forceMode = 1;
+ if (event.key.keysym.sym == SDLK_F2)
+ forceMode = 2;
+ if (event.key.keysym.sym == SDLK_F3)
+ forceMode = 3;
+ if (event.key.keysym.sym == SDLK_F4)
+ forceMode = 4;
+ if (event.key.keysym.sym == SDLK_F5)
+ forceMode = 5;
+ if (event.key.keysym.sym == SDLK_F6)
+ forceMode = 6;
+ if (event.key.keysym.sym == SDLK_F7)
+ forceMode = 7;
+ if (event.key.keysym.sym == SDLK_F8)
+ forceMode = 8;
+ if (event.key.keysym.sym == SDLK_F9)
+ forceMode = 9;
+ if (event.key.keysym.sym == SDLK_F10)
+ forceMode = 10;
+
+ break;
+ case SDL_VIDEORESIZE:
+ resx = sdlGoom.screen_width = event.resize.w;
+ resy = sdlGoom.screen_height = event.resize.h;
+ sdlGoom.doublepix = doublepix;
+ {
+ static char s[512];
+ sprintf (s,"%dx%d",resx,resy);
+ title = s;
+ set_list_param_value(&sdlGoom.screen_size, s);
+ sdlGoom.screen_size.change_listener (&sdlGoom.screen_size);
+ }
+ surface = SDL_SetVideoMode (resx, resy, 32,
+ SDL_RESIZABLE|SDL_SWSURFACE);
+ apply_double();
+ goom_set_resolution (sdlGoom.plugin,resx, resy);
+ if (is_fs)
+ SDL_WM_ToggleFullScreen (surface);
+ break;
+ /* default: * Report an unhandled event */
+ /* printf("I don't know what this event is!\n"); */
+ }
+ }
+
+ for (i=0;i<512;i++)
+ if (data[0][i]>2) {
+ if (encore_nul > ENCORE_NUL_LOCK)
+ encore_nul = 0;
+ break;
+ }
+
+ if ((i == 512) && (!encore_nul))
+ encore_nul = ENCORE_NUL_LOCK + 100;
+
+ if (encore_nul == ENCORE_NUL_LOCK) {
+ message = msg_tab[msg_pos];
+ msg_pos ++;
+ msg_pos %= 4;
+ }
+
+ if (encore_nul)
+ encore_nul --;
+
+ if (!sdlGoom.active) {
+ return;
+ }
+
+ /*
+ * TODO:
+ * if (pos != spos) {
+ * title = xmms_remote_get_playlist_title (jeko_vp.xmms_session, pos);
+ * spos = pos;
+ * }
+ */
+
+#ifdef BENCHMARK_X86
+ t0 = GetTick();
+#endif
+ if (doublepix == 0)
+ goom_set_screenbuffer(sdlGoom.plugin, surface->pixels);
+
+ buf = goom_update (sdlGoom.plugin, data, forceMode,
+ BVAL(sdlGoom.display_fps)?framerate_tester_getvalue ():-1,
+ title, message);
+
+#ifdef BENCHMARK_X86
+ t1 = GetTick();
+#endif
+
+ if (doublepix == 2) {
+ gsurf.buf = buf;
+ sdl_pixel_doubler (&gsurf,surface);
+ } else if (doublepix == 1) {
+ SDL_Rect rect;
+ gsurf.buf = buf;
+ pixel_doubler (&gsurf,gsurf2);
+ tmpsurf =
+ SDL_CreateRGBSurfaceFrom (gsurf2->buf, resx*2, resy*2,
+ 32, resx*8,
+ 0x00ff0000, 0x0000ff00, 0x000000ff,
+ 0x00000000);
+ rect.x = doubledec;
+ rect.y = 0;
+ rect.w = resx * 2;
+ rect.h = resy * 2;
+ SDL_BlitSurface (tmpsurf, NULL, surface, &rect);
+ SDL_FreeSurface (tmpsurf);
+ }
+ else {
+/* tmpsurf =
+ SDL_CreateRGBSurfaceFrom (buf, resx, resy, 32, resx * 4,
+ 0x00ff0000, 0x0000ff00, 0x000000ff,
+ 0x00000000);
+ SDL_BlitSurface (tmpsurf, NULL, surface, NULL);
+ SDL_FreeSurface (tmpsurf);
+ SDL_LockSurface(surface);
+ memcpy(surface->pixels, buf, resx * resy * 4);
+ SDL_UnlockSurface(surface);
+*/
+ }
+ SDL_Flip (surface);
+#ifdef BENCHMARK_X86
+ t2 = GetTick();
+
+ t2 -= t1;
+ t1 -= t0;
+ {
+ double ft1, ft2;
+ static double min_t1 = 1000.0,
+ min_t2 = 1000.0;
+ static double moy_t1 = 150.0;
+ static double moy_t2 = 40.0;
+
+ ft1 = (double)(t1 / sdlGoom.plugin->screen.size);
+ ft2 = (double)(t2 / sdlGoom.plugin->screen.size);
+
+ if (ft1 < min_t1)
+ min_t1 = ft1;
+ if (ft2 < min_t2)
+ min_t2 = ft2;
+
+ moy_t1 = ((moy_t1 * 15.0) + ft1) / 16.0;
+ moy_t2 = ((moy_t2 * 15.0) + ft2) / 16.0;
+ printf("UPDATE = %4.0f/%3.0f CPP ", moy_t1, min_t1);
+ printf("DISPLAY = %4.0f/%3.0f CPP\n", moy_t2, min_t2);
+ }
+#endif
+
+ framerate_tester_newframe ();
+}
+
+
+char *sdl_goom_set_doublepix (int dp) {
+ if (doublepix && dp) return " ";
+ if (!doublepix && !dp) return " ";
+
+ doublepix = dp;
+ BVAL(sdlGoom.pix_double) = dp;
+ sdlGoom.pix_double.change_listener(&sdlGoom.pix_double);
+ if (doublepix)
+ return resize_win (resx,resy,TRUE);
+ else
+ return resize_win (resx*2,resy*2,TRUE);
+}
+
+void sdl_goom_set_fps (int fps) {
+ MAX_FRAMERATE = fps;
+ INTERPIX = 1000.0 / MAX_FRAMERATE;
+}
+
+void pix_double_changed (PluginParam *p) {
+ sdl_goom_set_doublepix (BVAL(*p));
+}
+
+void screen_size_changed (PluginParam *p) {
+ int i;
+ static struct Resol { char*name; int x; int y; } res[4] = {
+ {"320x240", 320, 240},
+ {"400x300", 400, 300},
+ {"640x480", 640, 480},
+ {"800x600", 800, 600}};
+
+ for (i=4;i--;) {
+ if (!strcmp(LVAL(*p),res[i].name))
+ resize_win (res[i].x,res[i].y,FALSE);
+ }
+}
+
+void fps_limit_changed (PluginParam *p) {
+ MAX_FRAMERATE = IVAL(*p);
+ INTERPIX = 1000.0 / MAX_FRAMERATE;
+}
+
+void hide_cursor_changed (PluginParam *p) {
+ SDL_ShowCursor(!BVAL(*p));
+}
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.h
new file mode 100644
index 0000000000..6bb1b9d811
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.h
@@ -0,0 +1,30 @@
+#ifndef _SDL_GOOM_H
+#define _SDL_GOOM_H
+
+#include <gtk/gtk.h>
+#include "goom_config_param.h"
+#include "goom_plugin_info.h"
+
+typedef struct _SDL_GOOM {
+ GtkWidget *config_win;
+
+ int screen_width;
+ int screen_height;
+ int doublepix;
+ int active;
+
+ PluginInfo *plugin; /* infos about the plugin (see plugin_info.h) */
+
+ PluginParameters screen; /* contains screen_size, pix_double, fps_limit */
+
+ PluginParam screen_size;
+ PluginParam pix_double;
+ PluginParam fps_limit;
+ PluginParam display_fps;
+ PluginParam hide_cursor;
+
+} SdlGoom;
+
+void gtk_data_init(SdlGoom *sdlGoom);
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.c
new file mode 100644
index 0000000000..e3587ac957
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.c
@@ -0,0 +1,51 @@
+#include "pixeldoubler.h"
+#include <SDL/SDL.h>
+#include <stdlib.h>
+#include <string.h>
+
+void sdl_pixel_doubler (Surface *src, SDL_Surface *dest) {
+ register int *d; // pointeur sur le pixel courant a marquer
+ register int *s; // pointeur sur le pixel coutant en cours de lecture
+ int sw; // nombre d'octet de largeur de ligne de la surface source
+ int sw2,swd;
+ int fd; // adresse de la fin du buffer destination
+ int fin; // adresse de fin d'une ligne du buffer source
+
+ SDL_LockSurface (dest);
+
+ d = dest->pixels;
+ s = src->buf;
+
+ sw = src->width << 2;
+ sw2 = dest->pitch;
+ swd = sw2 - sw * 2;
+
+ fin = (int)s;
+ fd = (int)d + (sw2 * src->height * 2);
+
+ // tant que tout le buffer source n'est pas remplit
+ while ((int)d < fd) {
+
+ // passer a la ligne suivante du buffer source
+ fin += sw;
+
+ // l'afficher sur une ligne du buffer destination
+ while ((int)s < fin) {
+ register int col = *(s++);
+ // 2 affichage par point du buffer source (doubling horizontal)
+ *(d++) = col; *(d++) = col;
+ }
+ d = (int*)((char*)d + swd);
+
+ // puis l'afficher sur une autre ligne (doubling vertical)
+ memcpy (d, ((char*)d) - sw2, sw2);
+/* s = (int*)((int)s - sw); // retour au debut de la ligne src
+ while ((int)s < fin) {
+ register int col = *(s++);
+ *(d++) = col; *(d++) = col; // idem (cf plus haut)
+ } */
+ d = (int*)((char*)d + sw2);
+ }
+
+ SDL_UnlockSurface (dest);
+}
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.h
new file mode 100644
index 0000000000..24a60398cb
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.h
@@ -0,0 +1,2 @@
+#include <SDL/SDL.h>
+void sdl_pixel_doubler (Surface *src, SDL_Surface *dest);
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/surface.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/surface.c
new file mode 100644
index 0000000000..2a452564b0
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/surface.c
@@ -0,0 +1,18 @@
+#include "surface.h"
+#include <stdlib.h>
+
+Surface * surface_new (int w, int h) {
+ Surface * s = (Surface*)malloc(sizeof(Surface));
+ s->realstart = (int*)malloc(w*h*4 + 128);
+ s->buf = (int*)((int)s->realstart + 128 - (((int)s->realstart) % 128));
+ s->size = w*h;
+ s->width = w;
+ s->height = h;
+ return s;
+}
+
+void surface_delete (Surface **s) {
+ free ((*s)->realstart);
+ free (*s);
+ *s = NULL;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/surface.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/surface.h
new file mode 100644
index 0000000000..61c73d19a4
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/surface.h
@@ -0,0 +1,16 @@
+#ifndef _SURFACE_H
+#define _SURFACE_H
+
+typedef struct {
+ int * buf;
+ int width;
+ int height;
+ int size;
+
+ int * realstart;
+} Surface;
+
+Surface * surface_new (int w, int h) ;
+void surface_delete (Surface **s) ;
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/DOCODE.TXT b/src/visualizations/Goom/goom2k4-0/src/DOCODE.TXT
new file mode 100644
index 0000000000..76c820af6c
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/DOCODE.TXT
@@ -0,0 +1,55 @@
+Les différentes données..
+-----
+
+typedef struct {
+ int32 * buf;
+ int32 width;
+ int32 height;
+ int32 size;
+
+ int32 * realstart;
+} Surface;
+-----
+
+>> taille du buffer de zoom
+guint32 mmx_zoom_size;
+-----
+
+>> les buffers bruts contiennent les px et py de chaque point
+>> => brutS[0] = px0, brutS[1] = py0, brutS[2] = px1, [...]
+
+signed int *brutS = 0, *freebrutS = 0; // source
+signed int *brutD = 0, *freebrutD = 0; // dest
+signed int *brutT = 0, *freebrutT = 0; // temp (en cours de génération)
+
+>> pointeur vers p1
+guint32 *expix1 = 0;
+>> pointeur vers p2
+guint32 *expix2 = 0;
+
+>> largeur d'une ligne = prevX
+guint32 zoom_width;
+
+>> largeur et hauteur des differents buffers.
+int prevX=0,prevY=0;
+-----
+
+>> buffratio est un fixpoint : 16,16
+>> valeur normalement comprise entre 0 et 1,
+>> soit 0<=buffratio<=BUFFPOINTMASK
+
+int buffratio = 0;
+
+#define BUFFPOINTNB 16
+#define BUFFPOINTMASK 0xffff
+#define BUFFINCR 0xff
+-----
+
+#define sqrtperte 16
+>> faire : a % sqrtperte <=> a & pertemask
+#define PERTEMASK 0xf
+>> faire : a / sqrtperte <=> a >> PERTEDEC
+#define PERTEDEC 4
+-----
+
+int precalCoef[16][16];
diff --git a/src/visualizations/Goom/goom2k4-0/src/Makefile.am b/src/visualizations/Goom/goom2k4-0/src/Makefile.am
new file mode 100644
index 0000000000..c03dc51d2c
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/Makefile.am
@@ -0,0 +1,34 @@
+# libgoom2
+
+if HAVE_MMX
+MMX_FILES=mmx.c xmmx.c
+else
+MMX_FILES=
+endif
+
+if HAVE_PPC
+PPC_FILES=ppc_zoom_ultimate.s ppc_drawings.s
+else
+PPC_FILES=
+endif
+
+goom2_lib_LTLIBRARIES = libgoom2.la
+goom2_libdir = $(libdir)
+
+goom2_library_includedir=$(includedir)/goom
+goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h
+libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*"
+libgoom2_la_SOURCES = \
+ goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \
+ goom_tools.c $(MMX_FILES) $(PPC_FILES) \
+ config_param.c convolve_fx.c filters.c \
+ flying_stars_fx.c gfontlib.c gfontrle.c \
+ goom_core.c graphic.c ifs.c lines.c \
+ mathtools.c sound_tester.c surf3d.c \
+ tentacle3d.c plugin_info.c \
+ v3d.c drawmethods.c \
+ cpu_info.c
+
+AM_YFLAGS=-d
+
+noinst_HEADERS = mmx.h
diff --git a/src/visualizations/Goom/goom2k4-0/src/TODO b/src/visualizations/Goom/goom2k4-0/src/TODO
new file mode 100644
index 0000000000..63a13f5775
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/TODO
@@ -0,0 +1,32 @@
+Idees:
+
+- Flash lights (Phosphor)
+ --> --> -->
+ <-- <-- <--
+
+- Re-remplir RAND regulierement (1/tour)
+
+- Un effect qui affecte la displacement map:
+
+- Enregistrer l'etat de la config, s'en servir pour definir un etat de goom.
+
+- PluginParam de type Button, avec juste un listener en donnee.
+
+- PluginParam de type TextField.
+
+- Liste des modes possibles pour l'effet de BG.
+
+- Goom lui-meme : liste des effets actifs.
+ mode automatique / manuel (plus de changement aleatoires)
+
+- Possibilite d'envoyer des commandes format text au Core. exemples :
+" BRIGHT_FLASH.SCREEN_BRIGHTNESS=200.0
+ if SOUND.GOOM_DETECTION > 0
+ 3D_TENTACLES.ENABLED = 1
+ endif
+ CORE.MAIN_SCRIPT="..."
+"
+ void goom_execute_script(const char *cmds);
+ void goom_set_main_script(const char *script); /// peut retourner un message d'erreur ?
+ char *goom_create_state_script(); /* retourne un script permettant de remettre goom dans l'etat actuel */
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/config_param.c b/src/visualizations/Goom/goom2k4-0/src/config_param.c
new file mode 100644
index 0000000000..c6402834ad
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/config_param.c
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------------*/
+/*
+** config_param.c
+** Goom Project
+**
+** Created by Jean-Christophe Hoelt on Sat Jul 19 2003
+** Copyright (c) 2003 iOS. All rights reserved.
+*/
+/*---------------------------------------------------------------------------*/
+
+#include "goom_config_param.h"
+#include <string.h>
+
+/* TODO: Ajouter goom_ devant ces fonctions */
+
+static void empty_fct(PluginParam *dummy) {
+}
+
+PluginParam goom_secure_param() {
+ PluginParam p;
+ p.changed = empty_fct;
+ p.change_listener = empty_fct;
+ p.user_data = 0;
+ p.name = p.desc = 0;
+ p.rw = 1;
+ return p;
+}
+
+PluginParam goom_secure_f_param(char *name) {
+ PluginParam p = secure_param();
+ p.name = name;
+ p.type = PARAM_FLOATVAL;
+ FVAL(p) = 0.5f;
+ FMIN(p) = 0.0f;
+ FMAX(p) = 1.0f;
+ FSTEP(p) = 0.01f;
+ return p;
+}
+
+PluginParam goom_secure_f_feedback(char *name) {
+ PluginParam p = secure_f_param(name);
+ p.rw = 0;
+ return p;
+}
+
+PluginParam goom_secure_s_param(char *name) {
+ PluginParam p = secure_param();
+ p.name = name;
+ p.type = PARAM_STRVAL;
+ SVAL(p) = 0;
+ return p;
+}
+
+PluginParam goom_secure_b_param(char *name, int value) {
+ PluginParam p = secure_param();
+ p.name = name;
+ p.type = PARAM_BOOLVAL;
+ BVAL(p) = value;
+ return p;
+}
+
+PluginParam goom_secure_i_param(char *name) {
+ PluginParam p = secure_param();
+ p.name = name;
+ p.type = PARAM_INTVAL;
+ IVAL(p) = 50;
+ IMIN(p) = 0;
+ IMAX(p) = 100;
+ ISTEP(p) = 1;
+ return p;
+}
+
+PluginParam goom_secure_i_feedback(char *name) {
+ PluginParam p = secure_i_param(name);
+ p.rw = 0;
+ return p;
+}
+
+PluginParameters goom_plugin_parameters(const char *name, int nb) {
+ PluginParameters p;
+ p.name = (char *)name;
+ p.desc = "";
+ p.nbParams = nb;
+ p.params = (PluginParam**)malloc(nb*sizeof(PluginParam*));
+ return p;
+}
+
+/*---------------------------------------------------------------------------*/
+
+void goom_set_str_param_value(PluginParam *p, const char *str) {
+ int len = strlen(str);
+ if (SVAL(*p))
+ SVAL(*p) = (char*)realloc(SVAL(*p), len+1);
+ else
+ SVAL(*p) = (char*)malloc(len+1);
+ memcpy(SVAL(*p), str, len+1);
+}
+
+void goom_set_list_param_value(PluginParam *p, const char *str) {
+ int len = strlen(str);
+#ifdef VERBOSE
+ printf("%s: %d\n", str, len);
+#endif
+ if (LVAL(*p))
+ LVAL(*p) = (char*)realloc(LVAL(*p), len+1);
+ else
+ LVAL(*p) = (char*)malloc(len+1);
+ memcpy(LVAL(*p), str, len+1);
+}
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/convolve_fx.c b/src/visualizations/Goom/goom2k4-0/src/convolve_fx.c
new file mode 100644
index 0000000000..ce11382a64
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/convolve_fx.c
@@ -0,0 +1,336 @@
+#include "goom_fx.h"
+#include "goom_plugin_info.h"
+#include "goomsl.h"
+#include "goom_config.h"
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+//#define CONV_MOTIF_W 32
+//#define CONV_MOTIF_WMASK 0x1f
+
+#define CONV_MOTIF_W 128
+#define CONV_MOTIF_WMASK 0x7f
+
+typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W];
+
+#include "motif_goom1.h"
+#include "motif_goom2.h"
+
+#define NB_THETA 512
+
+#define MAX 2.0f
+
+typedef struct _CONV_DATA{
+ PluginParam light;
+ PluginParam factor_adj_p;
+ PluginParam factor_p;
+ PluginParameters params;
+
+ GoomSL *script;
+
+ /* rotozoom */
+ int theta;
+ float ftheta;
+ int h_sin[NB_THETA];
+ int h_cos[NB_THETA];
+ int h_height;
+ float visibility;
+ Motif conv_motif;
+ int inverse_motif;
+
+} ConvData;
+
+/* init rotozoom tables */
+static void compute_tables(VisualFX *_this, PluginInfo *info)
+{
+ ConvData *data = (ConvData*)_this->fx_data;
+ double screen_coef;
+ int i;
+ double h;
+ double radian;
+
+ if (data->h_height == info->screen.height) return;
+
+ screen_coef = 2.0 * 300.0 / (double)info->screen.height;
+ data->h_height = info->screen.height;
+
+ for ( i=0 ; i<NB_THETA ; i++ ) {
+ radian = 2*i*M_PI/NB_THETA;
+ h = (0.2 + cos (radian) / 15.0 * sin(radian * 2.0 + 12.123)) * screen_coef;
+ data->h_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian));
+ data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian));
+ }
+}
+
+static void set_motif(ConvData *data, Motif motif)
+{
+ int i,j;
+ for (i=0;i<CONV_MOTIF_W;++i) for (j=0;j<CONV_MOTIF_W;++j)
+ data->conv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1];
+}
+
+static void convolve_init(VisualFX *_this, PluginInfo *info) {
+ ConvData *data;
+ data = (ConvData*)malloc(sizeof(ConvData));
+ _this->fx_data = (void*)data;
+
+ data->light = secure_f_param("Screen Brightness");
+ data->light.param.fval.max = 300.0f;
+ data->light.param.fval.step = 1.0f;
+ data->light.param.fval.value = 100.0f;
+
+ data->factor_adj_p = secure_f_param("Flash Intensity");
+ data->factor_adj_p.param.fval.max = 200.0f;
+ data->factor_adj_p.param.fval.step = 1.0f;
+ data->factor_adj_p.param.fval.value = 70.0f;
+
+ data->factor_p = secure_f_feedback("Factor");
+
+ data->params = plugin_parameters ("Bright Flash", 5);
+ data->params.params[0] = &data->light;
+ data->params.params[1] = &data->factor_adj_p;
+ data->params.params[2] = 0;
+ data->params.params[3] = &data->factor_p;
+ data->params.params[4] = 0;
+
+ /* init rotozoom tables */
+ compute_tables(_this, info);
+ data->theta = 0;
+ data->ftheta = 0.0;
+ data->visibility = 1.0;
+ set_motif(data, CONV_MOTIF2);
+ data->inverse_motif = 0;
+
+ _this->params = &data->params;
+}
+
+static void convolve_free(VisualFX *_this) {
+ ConvData *data = _this->fx_data;
+ free (data->params.params);
+ free (data);
+}
+
+static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest,
+ PluginInfo *info, int iff)
+{
+ ConvData *data = (ConvData*)_this->fx_data;
+
+ int x,y;
+ int i = 0;//info->screen.height * info->screen.width - 1;
+
+ const int c = data->h_cos [data->theta];
+ const int s = data->h_sin [data->theta];
+
+ const int xi = -(info->screen.width/2) * c;
+ const int yi = (info->screen.width/2) * s;
+
+ const int xj = -(info->screen.height/2) * s;
+ const int yj = -(info->screen.height/2) * c;
+
+ int xprime = xj;
+ int yprime = yj;
+
+ int ifftab[16];
+ if (data->inverse_motif) {
+ int i;
+ for (i=0;i<16;++i)
+ ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0);
+ }
+ else {
+ int i;
+ for (i=0;i<16;++i)
+ ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0);
+ }
+
+ for (y=info->screen.height;y--;) {
+ int xtex,ytex;
+
+ xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2;
+ xprime += s;
+
+ ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2;
+ yprime += c;
+
+#ifdef HAVE_MMX
+ __asm__ __volatile__
+ ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */
+ "\n\t movd %[xtex], %%mm2"
+ "\n\t movd %[ytex], %%mm3"
+ "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */
+ "\n\t movd %[c], %%mm4"
+ "\n\t movd %[s], %%mm6"
+ "\n\t pxor %%mm5, %%mm5"
+ "\n\t psubd %%mm6, %%mm5"
+ "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */
+ "\n\t movd %[motif], %%mm6" /* mm6 = motif */
+
+ ::[xtex]"g"(xtex) ,[ytex]"g"(ytex)
+ , [c]"g"(c), [s]"g"(s)
+ , [motif] "g"(&data->conv_motif[0][0]));
+
+ for (x=info->screen.width;x--;)
+ {
+ __asm__ __volatile__
+ (
+ "\n\t movd %[src], %%mm0" /* mm0 = src */
+ "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */
+ "\n\t movd %%esi, %%mm5" /* save esi into mm5 */
+ "\n\t movq %%mm2, %%mm3"
+ "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */
+ "\n\t movd %%mm3, %%eax" /* eax = xtex' */
+
+ "\n\t psrlq $25, %%mm3"
+ "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */
+
+ "\n\t andl $127, %%eax"
+ "\n\t andl $16256, %%ecx"
+
+ "\n\t addl %%ecx, %%eax"
+ "\n\t movd %%mm6, %%esi" /* esi = motif */
+ "\n\t xorl %%ecx, %%ecx"
+ "\n\t movb (%%eax,%%esi), %%cl"
+
+ "\n\t movl %[ifftab], %%eax"
+ "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */
+ "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */
+
+ "\n\t punpcklwd %%mm1, %%mm1"
+ "\n\t punpcklbw %%mm7, %%mm0"
+ "\n\t punpckldq %%mm1, %%mm1"
+ "\n\t psrlw $1, %%mm0"
+ "\n\t psrlw $2, %%mm1"
+ "\n\t pmullw %%mm1, %%mm0"
+ "\n\t psrlw $5, %%mm0"
+ "\n\t packuswb %%mm7, %%mm0"
+ "\n\t movd %%mm0, %[dest]"
+ : [dest] "=g" (dest[i].val)
+ : [src] "g" (src[i].val)
+ , [ifftab]"g"(&ifftab[0])
+ : "eax","ecx");
+
+ i++;
+ }
+#else
+ for (x=info->screen.width;x--;) {
+
+ int iff2;
+ unsigned int f0,f1,f2,f3;
+
+ xtex += c;
+ ytex -= s;
+
+ iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]];
+
+#define sat(a) ((a)>0xFF?0xFF:(a))
+ f0 = src[i].val;
+ f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8;
+ f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8;
+ f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8;
+ dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET);
+/*
+ f0 = (src[i].cop[0] * iff2) >> 8;
+ f1 = (src[i].cop[1] * iff2) >> 8;
+ f2 = (src[i].cop[2] * iff2) >> 8;
+ f3 = (src[i].cop[3] * iff2) >> 8;
+
+ dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0;
+ dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1;
+ dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2;
+ dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3;
+*/
+ i++;
+ }
+#endif
+ }
+#ifdef HAVE_MMX
+ __asm__ __volatile__ ("\n\t emms");
+#endif
+
+ compute_tables(_this, info);
+}
+
+
+/*#include <stdint.h>
+
+static uint64_t GetTick()
+{
+ uint64_t x;
+ asm volatile ("RDTSC" : "=A" (x));
+ return x;
+}*/
+
+
+static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) {
+
+ ConvData *data = (ConvData*)_this->fx_data;
+ float ff;
+ int iff;
+
+ ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f;
+ iff = (unsigned int)(ff * 256);
+
+ {
+ double fcycle = (double)info->cycle;
+ double rotate_param, rotate_coef;
+ float INCREASE_RATE = 1.5;
+ float DECAY_RATE = 0.955;
+ if (FVAL(info->sound.last_goom_p) > 0.8)
+ FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE;
+ FVAL(data->factor_p) *= DECAY_RATE;
+
+ rotate_param = FVAL(info->sound.last_goom_p);
+ if (rotate_param < 0.0)
+ rotate_param = 0.0;
+ rotate_param += FVAL(info->sound.goom_power_p);
+
+ rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0;
+ data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3));
+ data->theta = ((unsigned int)data->ftheta) % NB_THETA;
+ data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5;
+ if (data->visibility < 0.0) data->visibility = 0.0;
+ data->factor_p.change_listener(&data->factor_p);
+ }
+
+ if (data->visibility < 0.01) {
+ switch (goom_irand(info->gRandom, 300))
+ {
+ case 1:
+ set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break;
+ case 2:
+ set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break;
+ }
+ }
+
+ if ((ff > 0.98f) && (ff < 1.02f))
+ memcpy(dest, src, info->screen.size * sizeof(Pixel));
+ else
+ create_output_with_brightness(_this,src,dest,info,iff);
+/*
+// Benching suite...
+ {
+ uint64_t before, after;
+ double timed;
+ static double stimed = 10000.0;
+ before = GetTick();
+ data->visibility = 1.0;
+ create_output_with_brightness(_this,src,dest,info,iff);
+ after = GetTick();
+ timed = (double)((after-before) / info->screen.size);
+ if (timed < stimed) {
+ stimed = timed;
+ printf ("CLK = %3.0f CPP\n", stimed);
+ }
+ }
+*/
+}
+
+VisualFX convolve_create(void) {
+ VisualFX vfx;
+ vfx.init = convolve_init;
+ vfx.free = convolve_free;
+ vfx.apply = convolve_apply;
+ vfx.fx_data = 0;
+ return vfx;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/convolve_fx.c.jc b/src/visualizations/Goom/goom2k4-0/src/convolve_fx.c.jc
new file mode 100644
index 0000000000..bd4c3e0850
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/convolve_fx.c.jc
@@ -0,0 +1,333 @@
+#include "goom_fx.h"
+#include "goom_plugin_info.h"
+#include "goomsl.h"
+#include "goom_config.h"
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+//#define CONV_MOTIF_W 32
+//#define CONV_MOTIF_WMASK 0x1f
+
+#define CONV_MOTIF_W 128
+#define CONV_MOTIF_WMASK 0x7f
+
+typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W];
+
+#include "motif_goom1.h"
+#include "motif_goom2.h"
+
+#define NB_THETA 512
+
+#define MAX 2.0f
+
+typedef struct _CONV_DATA{
+ PluginParam light;
+ PluginParam factor_adj_p;
+ PluginParam factor_p;
+ PluginParameters params;
+
+ GoomSL *script;
+
+ /* rotozoom */
+ int theta;
+ float ftheta;
+ int h_sin[NB_THETA];
+ int h_cos[NB_THETA];
+ int h_height;
+ float visibility;
+ Motif conv_motif;
+ int inverse_motif;
+
+} ConvData;
+
+/* init rotozoom tables */
+static void compute_tables(VisualFX *_this, PluginInfo *info)
+{
+ ConvData *data = (ConvData*)_this->fx_data;
+ double screen_coef;
+ int i;
+ double h;
+ double radian;
+
+ if (data->h_height == info->screen.height) return;
+
+ screen_coef = 2.0 * 300.0 / (double)info->screen.height;
+ data->h_height = info->screen.height;
+
+ for ( i=0 ; i<NB_THETA ; i++ ) {
+ radian = 2*i*M_PI/NB_THETA;
+ h = (0.2 + cos (radian) / 15.0 * sin(radian * 2.0 + 12.123)) * screen_coef;
+ data->h_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian));
+ data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian));
+ }
+}
+
+static void set_motif(ConvData *data, Motif motif)
+{
+ int i,j;
+ for (i=0;i<CONV_MOTIF_W;++i) for (j=0;j<CONV_MOTIF_W;++j)
+ data->conv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1];
+}
+
+static void convolve_init(VisualFX *_this, PluginInfo *info) {
+ ConvData *data;
+ data = (ConvData*)malloc(sizeof(ConvData));
+ _this->fx_data = (void*)data;
+
+ data->light = secure_f_param("Screen Brightness");
+ data->light.param.fval.max = 300.0f;
+ data->light.param.fval.step = 1.0f;
+ data->light.param.fval.value = 100.0f;
+
+ data->factor_adj_p = secure_f_param("Flash Intensity");
+ data->factor_adj_p.param.fval.max = 200.0f;
+ data->factor_adj_p.param.fval.step = 1.0f;
+ data->factor_adj_p.param.fval.value = 70.0f;
+
+ data->factor_p = secure_f_feedback("Factor");
+
+ data->params = plugin_parameters ("Bright Flash", 5);
+ data->params.params[0] = &data->light;
+ data->params.params[1] = &data->factor_adj_p;
+ data->params.params[2] = 0;
+ data->params.params[3] = &data->factor_p;
+ data->params.params[4] = 0;
+
+ /* init rotozoom tables */
+ compute_tables(_this, info);
+ data->theta = 0;
+ data->ftheta = 0.0;
+ data->visibility = 1.0;
+ set_motif(data, CONV_MOTIF2);
+ data->inverse_motif = 0;
+
+ _this->params = &data->params;
+}
+
+static void convolve_free(VisualFX *_this) {
+ free (_this->fx_data);
+}
+
+static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest,
+ PluginInfo *info, int iff)
+{
+ ConvData *data = (ConvData*)_this->fx_data;
+
+ int x,y;
+ int i = 0;//info->screen.height * info->screen.width - 1;
+
+ const int c = data->h_cos [data->theta];
+ const int s = data->h_sin [data->theta];
+
+ const int xi = -(info->screen.width/2) * c;
+ const int yi = (info->screen.width/2) * s;
+
+ const int xj = -(info->screen.height/2) * s;
+ const int yj = -(info->screen.height/2) * c;
+
+ int xprime = xj;
+ int yprime = yj;
+
+ int ifftab[16];
+ if (data->inverse_motif) {
+ int i;
+ for (i=0;i<16;++i)
+ ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0);
+ }
+ else {
+ int i;
+ for (i=0;i<16;++i)
+ ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0);
+ }
+
+ for (y=info->screen.height;y--;) {
+ int xtex,ytex;
+
+ xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2;
+ xprime += s;
+
+ ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2;
+ yprime += c;
+
+#ifdef HAVE_MMX
+ __asm__ __volatile__
+ ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */
+ "\n\t movd %[xtex], %%mm2"
+ "\n\t movd %[ytex], %%mm3"
+ "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */
+ "\n\t movd %[c], %%mm4"
+ "\n\t movd %[s], %%mm6"
+ "\n\t pxor %%mm5, %%mm5"
+ "\n\t psubd %%mm6, %%mm5"
+ "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */
+ "\n\t movd %[motif], %%mm6" /* mm6 = motif */
+
+ ::[xtex]"g"(xtex) ,[ytex]"g"(ytex)
+ , [c]"g"(c), [s]"g"(s)
+ , [motif] "g"(&data->conv_motif[0][0]));
+
+ for (x=info->screen.width;x--;)
+ {
+ __asm__ __volatile__
+ (
+ "\n\t movd %[src], %%mm0" /* mm0 = src */
+ "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */
+ "\n\t movd %%esi, %%mm5" /* save esi into mm5 */
+ "\n\t movq %%mm2, %%mm3"
+ "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */
+ "\n\t movd %%mm3, %%eax" /* eax = xtex' */
+
+ "\n\t psrlq $25, %%mm3"
+ "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */
+
+ "\n\t andl $127, %%eax"
+ "\n\t andl $16256, %%ecx"
+
+ "\n\t addl %%ecx, %%eax"
+ "\n\t movd %%mm6, %%esi" /* esi = motif */
+ "\n\t xorl %%ecx, %%ecx"
+ "\n\t movb (%%eax,%%esi), %%cl"
+
+ "\n\t movl %[ifftab], %%eax"
+ "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */
+ "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */
+
+ "\n\t punpcklwd %%mm1, %%mm1"
+ "\n\t punpcklbw %%mm7, %%mm0"
+ "\n\t punpckldq %%mm1, %%mm1"
+ "\n\t psrlw $1, %%mm0"
+ "\n\t psrlw $1, %%mm1"
+ "\n\t pmullw %%mm1, %%mm0"
+ "\n\t psrlw $6, %%mm0"
+ "\n\t packuswb %%mm7, %%mm0"
+ "\n\t movd %%mm0, %[dest]"
+ : [dest] "=g" (dest[i].val)
+ : [src] "g" (src[i].val)
+ , [ifftab]"g"(&ifftab[0])
+ : "eax","ecx");
+
+ i++;
+ }
+#else
+ for (x=info->screen.width;x--;) {
+
+ int iff2;
+ unsigned int f0,f1,f2,f3;
+
+ xtex += c;
+ ytex -= s;
+
+ iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]];
+
+#define sat(a) ((a)>0xFF?0xFF:(a))
+ f0 = src[i].val;
+ f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8;
+ f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8;
+ f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8;
+ dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET);
+/*
+ f0 = (src[i].cop[0] * iff2) >> 8;
+ f1 = (src[i].cop[1] * iff2) >> 8;
+ f2 = (src[i].cop[2] * iff2) >> 8;
+ f3 = (src[i].cop[3] * iff2) >> 8;
+
+ dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0;
+ dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1;
+ dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2;
+ dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3;
+*/
+ i++;
+ }
+#endif
+ }
+ __asm__ __volatile__ ("\n\t emms");
+
+ compute_tables(_this, info);
+}
+
+/*
+#include <stdint.h>
+
+static uint64_t GetTick()
+{
+ uint64_t x;
+ asm volatile ("RDTSC" : "=A" (x));
+ return x;
+}
+*/
+
+static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) {
+
+ ConvData *data = (ConvData*)_this->fx_data;
+ float ff;
+ int iff;
+
+ ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f;
+ iff = (unsigned int)(ff * 256);
+
+ {
+ double fcycle = (double)info->cycle;
+ double rotate_param, rotate_coef;
+ float INCREASE_RATE = 1.5;
+ float DECAY_RATE = 0.955;
+ if (FVAL(info->sound.last_goom_p) > 0.8)
+ FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE;
+ FVAL(data->factor_p) *= DECAY_RATE;
+
+ rotate_param = FVAL(info->sound.last_goom_p);
+ if (rotate_param < 0.0)
+ rotate_param = 0.0;
+ rotate_param += FVAL(info->sound.goom_power_p);
+
+ rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0;
+ data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3));
+ data->theta = ((unsigned int)data->ftheta) % NB_THETA;
+ data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5;
+ if (data->visibility < 0.0) data->visibility = 0.0;
+ data->factor_p.change_listener(&data->factor_p);
+ }
+
+ if (data->visibility < 0.01) {
+ switch (goom_irand(info->gRandom, 300))
+ {
+ case 1:
+ set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break;
+ case 2:
+ set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break;
+ }
+ }
+
+ if ((ff > 0.96f) && (ff < 1.04f))
+ memcpy(dest, src, info->screen.size * sizeof(Pixel));
+ else
+ create_output_with_brightness(_this,src,dest,info,iff);
+/*
+ Benching suite...
+ {
+ uint64_t before, after;
+ double timed;
+ static double stimed = 10000.0;
+ before = GetTick();
+ data->visibility = 1.0;
+ create_output_with_brightness(_this,src,dest,info,iff);
+ after = GetTick();
+ timed = (double)((after-before) / info->screen.size);
+ if (timed < stimed) {
+ stimed = timed;
+ printf ("CLK = %3.0f CPP\n", stimed);
+ }
+ }
+*/
+}
+
+VisualFX convolve_create(void) {
+ VisualFX vfx = {
+ init: convolve_init,
+ free: convolve_free,
+ apply: convolve_apply,
+ fx_data: 0
+ };
+ return vfx;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/cpu_info.c b/src/visualizations/Goom/goom2k4-0/src/cpu_info.c
new file mode 100644
index 0000000000..14e150e159
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/cpu_info.c
@@ -0,0 +1,71 @@
+/*
+ * cpu_info.c
+ * Goom
+ *
+ * Created by Guillaume Borios on Sun Dec 28 2003.
+ * Copyright (c) 2003 iOS. All rights reserved.
+ *
+ */
+
+#include "cpu_info.h"
+
+#ifdef CPU_X86
+#include "mmx.h"
+#endif
+
+#ifdef CPU_POWERPC
+#include <sys/types.h>
+#include <stdlib.h>
+#endif
+
+static unsigned int CPU_FLAVOUR = 0;
+static unsigned int CPU_NUMBER = 1;
+static unsigned int CPU_DETECTED = 0;
+
+static void autoset_cpu_info (void)
+{
+ CPU_DETECTED = 1;
+
+#ifdef CPU_POWERPC
+ int result;
+ size_t size;
+
+ result = 0;
+ size = 4;
+ if (sysctlbyname("hw.optional.altivec",&result,&size,NULL,NULL) == 0)
+ {
+ if (result != 0) CPU_FLAVOUR |= CPU_OPTION_ALTIVEC;
+ }
+
+ result = 0;
+ size = 4;
+ if (sysctlbyname("hw.optional.64bitops",&result,&size,NULL,NULL) == 0)
+ {
+ if (result != 0) CPU_FLAVOUR |= CPU_OPTION_64_BITS;
+ }
+
+ result = 0;
+ size = 4;
+ if (sysctlbyname("hw.ncpu",&result,&size,NULL,NULL) == 0)
+ {
+ if (result != 0) CPU_NUMBER = result;
+ }
+#endif /* CPU_POWERPC */
+
+#ifdef CPU_X86
+ if (mmx_supported()) CPU_FLAVOUR |= CPU_OPTION_MMX;
+ if (xmmx_supported()) CPU_FLAVOUR |= CPU_OPTION_XMMX;
+#endif /* CPU_X86 */
+}
+
+unsigned int cpu_flavour (void)
+{
+ if (CPU_DETECTED == 0) autoset_cpu_info();
+ return CPU_FLAVOUR;
+}
+
+unsigned int cpu_number (void)
+{
+ if (CPU_DETECTED == 0) autoset_cpu_info();
+ return CPU_NUMBER;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/cpu_info.h b/src/visualizations/Goom/goom2k4-0/src/cpu_info.h
new file mode 100644
index 0000000000..81e66b5f1a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/cpu_info.h
@@ -0,0 +1,34 @@
+#ifndef CPU_INFO_H
+#define CPU_INFO_H
+
+/*
+ * cpu_info.h
+ * Goom
+ *
+ * Created by Guillaume Borios on Sun Dec 28 2003.
+ * Copyright (c) 2003 iOS. All rights reserved.
+ *
+ */
+
+#ifdef HAVE_MMX
+#ifndef CPU_X86
+#define CPU_X86
+#endif
+#endif
+
+/* Returns the CPU flavour described with the constants below */
+unsigned int cpu_flavour (void);
+
+#define CPU_OPTION_ALTIVEC 0x1
+#define CPU_OPTION_64_BITS 0x2
+#define CPU_OPTION_MMX 0x4
+#define CPU_OPTION_XMMX 0x8
+#define CPU_OPTION_SSE 0x10
+#define CPU_OPTION_SSE2 0x20
+#define CPU_OPTION_3DNOW 0x40
+
+
+/* Returns the CPU number */
+unsigned int cpu_number (void);
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/default_script.goom b/src/visualizations/Goom/goom2k4-0/src/default_script.goom
new file mode 100644
index 0000000000..be64141a71
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/default_script.goom
@@ -0,0 +1,34 @@
+/*
+ * specify here high-level properties of a flash.
+ */
+
+flash_occurs when (Sound.Goom_Detection > 50%) and (Sound.Sound_Speed > 14%);
+
+max_flash = 200%;
+slow_down_coef = 96%;
+
+/*
+ * Here you have the fx's state machin behaviour.
+ */
+
+(locked) ? locked--;
+
+(not locked) and (flash_occurs) ?
+{
+ cur_power = Sound_Speed.Goom_Detection;
+ start flashing_up;
+}
+
+(not locked) and (flashing_up) ?
+{
+ factor += cur_power * 2 * (speedvar / 4 + 0.95);
+ if (factor > max_flash) factor = max_flash;
+
+ (not flash_occurs) ?
+ {
+ locked = 200;
+ stop flashing_up;
+ }
+}
+
+factor *= slow_down_coef;
diff --git a/src/visualizations/Goom/goom2k4-0/src/default_scripts.h b/src/visualizations/Goom/goom2k4-0/src/default_scripts.h
new file mode 100644
index 0000000000..5984d7055c
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/default_scripts.h
@@ -0,0 +1,6 @@
+#ifndef _DEFAULT_SCRIPTS_H
+#define _DEFAULT_SCRIPTS_H
+
+#define GOOM_MAIN_SCRIPT ""
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/drawmethods.c b/src/visualizations/Goom/goom2k4-0/src/drawmethods.c
new file mode 100644
index 0000000000..f5cdec4fd3
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/drawmethods.c
@@ -0,0 +1,203 @@
+#include "drawmethods.h"
+
+#define DRAWMETHOD_PLUS(_out,_backbuf,_col) \
+{\
+ int tra=0,i=0;\
+ unsigned char *bra = (unsigned char*)&(_backbuf);\
+ unsigned char *dra = (unsigned char*)&(_out);\
+ unsigned char *cra = (unsigned char*)&(_col);\
+ for (;i<4;i++) {\
+ tra = *cra;\
+ tra += *bra;\
+ if (tra>255) tra=255;\
+ *dra = tra;\
+ ++dra;++cra;++bra;\
+ }\
+}
+
+#define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col)
+
+void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny)
+{
+ int x, y, dx, dy, yy, xx;
+ Pixel *p;
+
+ if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) return;
+
+ /* clip to top edge
+ if ((y1 < 0) && (y2 < 0))
+ return;
+
+ if (y1 < 0) {
+ x1 += (y1 * (x1 - x2)) / (y2 - y1);
+ y1 = 0;
+ }
+ if (y2 < 0) {
+ x2 += (y2 * (x1 - x2)) / (y2 - y1);
+ y2 = 0;
+ }
+
+ clip to bottom edge
+ if ((y1 >= screeny) && (y2 >= screeny))
+ return;
+ if (y1 >= screeny) {
+ x1 -= ((screeny - y1) * (x1 - x2)) / (y2 - y1);
+ y1 = screeny - 1;
+ }
+ if (y2 >= screeny) {
+ x2 -= ((screeny - y2) * (x1 - x2)) / (y2 - y1);
+ y2 = screeny - 1;
+ }
+ clip to left edge
+ if ((x1 < 0) && (x2 < 0))
+ return;
+ if (x1 < 0) {
+ y1 += (x1 * (y1 - y2)) / (x2 - x1);
+ x1 = 0;
+ }
+ if (x2 < 0) {
+ y2 += (x2 * (y1 - y2)) / (x2 - x1);
+ x2 = 0;
+ }
+ clip to right edge
+ if ((x1 >= screenx) && (x2 >= screenx))
+ return;
+ if (x1 >= screenx) {
+ y1 -= ((screenx - x1) * (y1 - y2)) / (x2 - x1);
+ x1 = screenx - 1;
+ }
+ if (x2 >= screenx) {
+ y2 -= ((screenx - x2) * (y1 - y2)) / (x2 - x1);
+ x2 = screenx - 1;
+ }
+ */
+
+ dx = x2 - x1;
+ dy = y2 - y1;
+ if (x1 > x2) {
+ int tmp;
+
+ tmp = x1;
+ x1 = x2;
+ x2 = tmp;
+ tmp = y1;
+ y1 = y2;
+ y2 = tmp;
+ dx = x2 - x1;
+ dy = y2 - y1;
+ }
+
+ /* vertical line */
+ if (dx == 0) {
+ if (y1 < y2) {
+ p = &(data[(screenx * y1) + x1]);
+ for (y = y1; y <= y2; y++) {
+ DRAWMETHOD;
+ p += screenx;
+ }
+ }
+ else {
+ p = &(data[(screenx * y2) + x1]);
+ for (y = y2; y <= y1; y++) {
+ DRAWMETHOD;
+ p += screenx;
+ }
+ }
+ return;
+ }
+ /* horizontal line */
+ if (dy == 0) {
+ if (x1 < x2) {
+ p = &(data[(screenx * y1) + x1]);
+ for (x = x1; x <= x2; x++) {
+ DRAWMETHOD;
+ p++;
+ }
+ return;
+ }
+ else {
+ p = &(data[(screenx * y1) + x2]);
+ for (x = x2; x <= x1; x++) {
+ DRAWMETHOD;
+ p++;
+ }
+ return;
+ }
+ }
+ /* 1 */
+ /* \ */
+ /* \ */
+ /* 2 */
+ if (y2 > y1) {
+ /* steep */
+ if (dy > dx) {
+ dx = ((dx << 16) / dy);
+ x = x1 << 16;
+ for (y = y1; y <= y2; y++) {
+ xx = x >> 16;
+ p = &(data[(screenx * y) + xx]);
+ DRAWMETHOD;
+ if (xx < (screenx - 1)) {
+ p++;
+ /* DRAWMETHOD; */
+ }
+ x += dx;
+ }
+ return;
+ }
+ /* shallow */
+ else {
+ dy = ((dy << 16) / dx);
+ y = y1 << 16;
+ for (x = x1; x <= x2; x++) {
+ yy = y >> 16;
+ p = &(data[(screenx * yy) + x]);
+ DRAWMETHOD;
+ if (yy < (screeny - 1)) {
+ p += screeny;
+ /* DRAWMETHOD; */
+ }
+ y += dy;
+ }
+ }
+ }
+ /* 2 */
+ /* / */
+ /* / */
+ /* 1 */
+ else {
+ /* steep */
+ if (-dy > dx) {
+ dx = ((dx << 16) / -dy);
+ x = (x1 + 1) << 16;
+ for (y = y1; y >= y2; y--) {
+ xx = x >> 16;
+ p = &(data[(screenx * y) + xx]);
+ DRAWMETHOD;
+ if (xx < (screenx - 1)) {
+ p--;
+ /* DRAWMETHOD; */
+ }
+ x += dx;
+ }
+ return;
+ }
+ /* shallow */
+ else {
+ dy = ((dy << 16) / dx);
+ y = y1 << 16;
+ for (x = x1; x <= x2; x++) {
+ yy = y >> 16;
+ p = &(data[(screenx * yy) + x]);
+ DRAWMETHOD;
+ if (yy < (screeny - 1)) {
+ p += screeny;
+ /* DRAWMETHOD; */
+ }
+ y += dy;
+ }
+ return;
+ }
+ }
+}
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/drawmethods.h b/src/visualizations/Goom/goom2k4-0/src/drawmethods.h
new file mode 100644
index 0000000000..76ad6ca09a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/drawmethods.h
@@ -0,0 +1,9 @@
+#ifndef _DRAWMETHODS_H
+#define _DRAWMETHODS_H
+
+#include "goom_config.h"
+#include "goom_graphic.h"
+
+void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny);
+
+#endif /* _DRAWMETHODS_H */
diff --git a/src/visualizations/Goom/goom2k4-0/src/empty_script.goom b/src/visualizations/Goom/goom2k4-0/src/empty_script.goom
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/empty_script.goom
diff --git a/src/visualizations/Goom/goom2k4-0/src/filter_test/mmx.h b/src/visualizations/Goom/goom2k4-0/src/filter_test/mmx.h
new file mode 100644
index 0000000000..7067bf347d
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/filter_test/mmx.h
@@ -0,0 +1,705 @@
+/* mmx.h
+
+ MultiMedia eXtensions GCC interface library for IA32.
+
+ To use this library, simply include this header file
+ and compile with GCC. You MUST have inlining enabled
+ in order for mmx_ok() to work; this can be done by
+ simply using -O on the GCC command line.
+
+ Compiling with -DMMX_TRACE will cause detailed trace
+ output to be sent to stderr for each mmx operation.
+ This adds lots of code, and obviously slows execution to
+ a crawl, but can be very useful for debugging.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
+ LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR ANY PARTICULAR PURPOSE.
+
+ 1997-99 by H. Dietz and R. Fisher
+
+ Notes:
+ It appears that the latest gas has the pand problem fixed, therefore
+ I'll undefine BROKEN_PAND by default.
+*/
+
+#ifndef _MMX_H
+#define _MMX_H
+
+/* Warning: at this writing, the version of GAS packaged
+ with most Linux distributions does not handle the
+ parallel AND operation mnemonic correctly. If the
+ symbol BROKEN_PAND is defined, a slower alternative
+ coding will be used. If execution of mmxtest results
+ in an illegal instruction fault, define this symbol.
+*/
+#undef BROKEN_PAND
+
+
+/* The type of an value that fits in an MMX register
+ (note that long long constant values MUST be suffixed
+ by LL and unsigned long long values by ULL, lest
+ they be truncated by the compiler)
+*/
+typedef union {
+ long long q; /* Quadword (64-bit) value */
+ unsigned long long uq; /* Unsigned Quadword */
+ int d[2]; /* 2 Doubleword (32-bit) values */
+ unsigned int ud[2]; /* 2 Unsigned Doubleword */
+ short w[4]; /* 4 Word (16-bit) values */
+ unsigned short uw[4]; /* 4 Unsigned Word */
+ char b[8]; /* 8 Byte (8-bit) values */
+ unsigned char ub[8]; /* 8 Unsigned Byte */
+ float s[2]; /* Single-precision (32-bit) value */
+} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */
+
+
+
+/* Function to test if multimedia instructions are supported...
+*/
+inline extern int
+mm_support(void)
+{
+ /* Returns 1 if MMX instructions are supported,
+ 3 if Cyrix MMX and Extended MMX instructions are supported
+ 5 if AMD MMX and 3DNow! instructions are supported
+ 0 if hardware does not support any of these
+ */
+ register int rval = 0;
+
+ __asm__ __volatile__ (
+ /* See if CPUID instruction is supported ... */
+ /* ... Get copies of EFLAGS into eax and ecx */
+ "pushf\n\t"
+ "popl %%eax\n\t"
+ "movl %%eax, %%ecx\n\t"
+
+ /* ... Toggle the ID bit in one copy and store */
+ /* to the EFLAGS reg */
+ "xorl $0x200000, %%eax\n\t"
+ "push %%eax\n\t"
+ "popf\n\t"
+
+ /* ... Get the (hopefully modified) EFLAGS */
+ "pushf\n\t"
+ "popl %%eax\n\t"
+
+ /* ... Compare and test result */
+ "xorl %%eax, %%ecx\n\t"
+ "testl $0x200000, %%ecx\n\t"
+ "jz NotSupported1\n\t" /* CPUID not supported */
+
+
+ /* Get standard CPUID information, and
+ go to a specific vendor section */
+ "movl $0, %%eax\n\t"
+ "cpuid\n\t"
+
+ /* Check for Intel */
+ "cmpl $0x756e6547, %%ebx\n\t"
+ "jne TryAMD\n\t"
+ "cmpl $0x49656e69, %%edx\n\t"
+ "jne TryAMD\n\t"
+ "cmpl $0x6c65746e, %%ecx\n"
+ "jne TryAMD\n\t"
+ "jmp Intel\n\t"
+
+ /* Check for AMD */
+ "\nTryAMD:\n\t"
+ "cmpl $0x68747541, %%ebx\n\t"
+ "jne TryCyrix\n\t"
+ "cmpl $0x69746e65, %%edx\n\t"
+ "jne TryCyrix\n\t"
+ "cmpl $0x444d4163, %%ecx\n"
+ "jne TryCyrix\n\t"
+ "jmp AMD\n\t"
+
+ /* Check for Cyrix */
+ "\nTryCyrix:\n\t"
+ "cmpl $0x69727943, %%ebx\n\t"
+ "jne NotSupported2\n\t"
+ "cmpl $0x736e4978, %%edx\n\t"
+ "jne NotSupported3\n\t"
+ "cmpl $0x64616574, %%ecx\n\t"
+ "jne NotSupported4\n\t"
+ /* Drop through to Cyrix... */
+
+
+ /* Cyrix Section */
+ /* See if extended CPUID level 80000001 is supported */
+ /* The value of CPUID/80000001 for the 6x86MX is undefined
+ according to the Cyrix CPU Detection Guide (Preliminary
+ Rev. 1.01 table 1), so we'll check the value of eax for
+ CPUID/0 to see if standard CPUID level 2 is supported.
+ According to the table, the only CPU which supports level
+ 2 is also the only one which supports extended CPUID levels.
+ */
+ "cmpl $0x2, %%eax\n\t"
+ "jne MMXtest\n\t" /* Use standard CPUID instead */
+
+ /* Extended CPUID supported (in theory), so get extended
+ features */
+ "movl $0x80000001, %%eax\n\t"
+ "cpuid\n\t"
+ "testl $0x00800000, %%eax\n\t" /* Test for MMX */
+ "jz NotSupported5\n\t" /* MMX not supported */
+ "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */
+ "jnz EMMXSupported\n\t"
+ "movl $1, %0:\n\n\t" /* MMX Supported */
+ "jmp Return\n\n"
+ "EMMXSupported:\n\t"
+ "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */
+ "jmp Return\n\t"
+
+
+ /* AMD Section */
+ "AMD:\n\t"
+
+ /* See if extended CPUID is supported */
+ "movl $0x80000000, %%eax\n\t"
+ "cpuid\n\t"
+ "cmpl $0x80000000, %%eax\n\t"
+ "jl MMXtest\n\t" /* Use standard CPUID instead */
+
+ /* Extended CPUID supported, so get extended features */
+ "movl $0x80000001, %%eax\n\t"
+ "cpuid\n\t"
+ "testl $0x00800000, %%edx\n\t" /* Test for MMX */
+ "jz NotSupported6\n\t" /* MMX not supported */
+ "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */
+ "jnz ThreeDNowSupported\n\t"
+ "movl $1, %0:\n\n\t" /* MMX Supported */
+ "jmp Return\n\n"
+ "ThreeDNowSupported:\n\t"
+ "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */
+ "jmp Return\n\t"
+
+
+ /* Intel Section */
+ "Intel:\n\t"
+
+ /* Check for MMX */
+ "MMXtest:\n\t"
+ "movl $1, %%eax\n\t"
+ "cpuid\n\t"
+ "testl $0x00800000, %%edx\n\t" /* Test for MMX */
+ "jz NotSupported7\n\t" /* MMX Not supported */
+ "movl $1, %0:\n\n\t" /* MMX Supported */
+ "jmp Return\n\t"
+
+ /* Nothing supported */
+ "\nNotSupported1:\n\t"
+ "#movl $101, %0:\n\n\t"
+ "\nNotSupported2:\n\t"
+ "#movl $102, %0:\n\n\t"
+ "\nNotSupported3:\n\t"
+ "#movl $103, %0:\n\n\t"
+ "\nNotSupported4:\n\t"
+ "#movl $104, %0:\n\n\t"
+ "\nNotSupported5:\n\t"
+ "#movl $105, %0:\n\n\t"
+ "\nNotSupported6:\n\t"
+ "#movl $106, %0:\n\n\t"
+ "\nNotSupported7:\n\t"
+ "#movl $107, %0:\n\n\t"
+ "movl $0, %0:\n\n\t"
+
+ "Return:\n\t"
+ : "=a" (rval)
+ : /* no input */
+ : "eax", "ebx", "ecx", "edx"
+ );
+
+ /* Return */
+ return(rval);
+}
+
+/* Function to test if mmx instructions are supported...
+*/
+inline extern int
+mmx_ok(void)
+{
+ /* Returns 1 if MMX instructions are supported, 0 otherwise */
+ return ( mm_support() & 0x1 );
+}
+
+
+/* Helper functions for the instruction macros that follow...
+ (note that memory-to-register, m2r, instructions are nearly
+ as efficient as register-to-register, r2r, instructions;
+ however, memory-to-memory instructions are really simulated
+ as a convenience, and are only 1/3 as efficient)
+*/
+#ifdef MMX_TRACE
+
+/* Include the stuff for printing a trace to stderr...
+*/
+
+#include <stdio.h>
+
+#define mmx_i2r(op, imm, reg) \
+ { \
+ mmx_t mmx_trace; \
+ mmx_trace.uq = (imm); \
+ printf(#op "_i2r(" #imm "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#reg "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ (#op " %0, %%" #reg \
+ : /* nothing */ \
+ : "X" (imm)); \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#reg "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#define mmx_m2r(op, mem, reg) \
+ { \
+ mmx_t mmx_trace; \
+ mmx_trace = (mem); \
+ printf(#op "_m2r(" #mem "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#reg "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ (#op " %0, %%" #reg \
+ : /* nothing */ \
+ : "X" (mem)); \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#reg "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#define mmx_r2m(op, reg, mem) \
+ { \
+ mmx_t mmx_trace; \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#op "_r2m(" #reg "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ mmx_trace = (mem); \
+ printf(#mem "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ (#op " %%" #reg ", %0" \
+ : "=X" (mem) \
+ : /* nothing */ ); \
+ mmx_trace = (mem); \
+ printf(#mem "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#define mmx_r2r(op, regs, regd) \
+ { \
+ mmx_t mmx_trace; \
+ __asm__ __volatile__ ("movq %%" #regs ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#op "_r2r(" #regs "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ ("movq %%" #regd ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#regd "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ (#op " %" #regs ", %" #regd); \
+ __asm__ __volatile__ ("movq %%" #regd ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#regd "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#define mmx_m2m(op, mems, memd) \
+ { \
+ mmx_t mmx_trace; \
+ mmx_trace = (mems); \
+ printf(#op "_m2m(" #mems "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ mmx_trace = (memd); \
+ printf(#memd "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+ #op " %1, %%mm0\n\t" \
+ "movq %%mm0, %0" \
+ : "=X" (memd) \
+ : "X" (mems)); \
+ mmx_trace = (memd); \
+ printf(#memd "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#else
+
+/* These macros are a lot simpler without the tracing...
+*/
+
+#define mmx_i2r(op, imm, reg) \
+ __asm__ __volatile__ (#op " %0, %%" #reg \
+ : /* nothing */ \
+ : "X" (imm) )
+
+#define mmx_m2r(op, mem, reg) \
+ __asm__ __volatile__ (#op " %0, %%" #reg \
+ : /* nothing */ \
+ : "X" (mem))
+
+#define mmx_r2m(op, reg, mem) \
+ __asm__ __volatile__ (#op " %%" #reg ", %0" \
+ : "=X" (mem) \
+ : /* nothing */ )
+
+#define mmx_r2r(op, regs, regd) \
+ __asm__ __volatile__ (#op " %" #regs ", %" #regd)
+
+#define mmx_m2m(op, mems, memd) \
+ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+ #op " %1, %%mm0\n\t" \
+ "movq %%mm0, %0" \
+ : "=X" (memd) \
+ : "X" (mems))
+
+#endif
+
+
+/* 1x64 MOVe Quadword
+ (this is both a load and a store...
+ in fact, it is the only way to store)
+*/
+#define movq_m2r(var, reg) mmx_m2r(movq, var, reg)
+#define movq_r2m(reg, var) mmx_r2m(movq, reg, var)
+#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd)
+#define movq(vars, vard) \
+ __asm__ __volatile__ ("movq %1, %%mm0\n\t" \
+ "movq %%mm0, %0" \
+ : "=X" (vard) \
+ : "X" (vars))
+
+
+/* 1x32 MOVe Doubleword
+ (like movq, this is both load and store...
+ but is most useful for moving things between
+ mmx registers and ordinary registers)
+*/
+#define movd_m2r(var, reg) mmx_m2r(movd, var, reg)
+#define movd_r2m(reg, var) mmx_r2m(movd, reg, var)
+#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd)
+#define movd(vars, vard) \
+ __asm__ __volatile__ ("movd %1, %%mm0\n\t" \
+ "movd %%mm0, %0" \
+ : "=X" (vard) \
+ : "X" (vars))
+
+
+/* 2x32, 4x16, and 8x8 Parallel ADDs
+*/
+#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg)
+#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd)
+#define paddd(vars, vard) mmx_m2m(paddd, vars, vard)
+
+#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg)
+#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd)
+#define paddw(vars, vard) mmx_m2m(paddw, vars, vard)
+
+#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg)
+#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd)
+#define paddb(vars, vard) mmx_m2m(paddb, vars, vard)
+
+
+/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic
+*/
+#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg)
+#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd)
+#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard)
+
+#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg)
+#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd)
+#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard)
+
+
+/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic
+*/
+#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg)
+#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd)
+#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard)
+
+#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg)
+#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd)
+#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard)
+
+
+/* 2x32, 4x16, and 8x8 Parallel SUBs
+*/
+#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg)
+#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd)
+#define psubd(vars, vard) mmx_m2m(psubd, vars, vard)
+
+#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg)
+#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd)
+#define psubw(vars, vard) mmx_m2m(psubw, vars, vard)
+
+#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg)
+#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd)
+#define psubb(vars, vard) mmx_m2m(psubb, vars, vard)
+
+
+/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic
+*/
+#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg)
+#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd)
+#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard)
+
+#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg)
+#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd)
+#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard)
+
+
+/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic
+*/
+#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg)
+#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd)
+#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard)
+
+#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg)
+#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd)
+#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard)
+
+
+/* 4x16 Parallel MULs giving Low 4x16 portions of results
+*/
+#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg)
+#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd)
+#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard)
+
+
+/* 4x16 Parallel MULs giving High 4x16 portions of results
+*/
+#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg)
+#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd)
+#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard)
+
+
+/* 4x16->2x32 Parallel Mul-ADD
+ (muls like pmullw, then adds adjacent 16-bit fields
+ in the multiply result to make the final 2x32 result)
+*/
+#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg)
+#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd)
+#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard)
+
+
+/* 1x64 bitwise AND
+*/
+#ifdef BROKEN_PAND
+#define pand_m2r(var, reg) \
+ { \
+ mmx_m2r(pandn, (mmx_t) -1LL, reg); \
+ mmx_m2r(pandn, var, reg); \
+ }
+#define pand_r2r(regs, regd) \
+ { \
+ mmx_m2r(pandn, (mmx_t) -1LL, regd); \
+ mmx_r2r(pandn, regs, regd) \
+ }
+#define pand(vars, vard) \
+ { \
+ movq_m2r(vard, mm0); \
+ mmx_m2r(pandn, (mmx_t) -1LL, mm0); \
+ mmx_m2r(pandn, vars, mm0); \
+ movq_r2m(mm0, vard); \
+ }
+#else
+#define pand_m2r(var, reg) mmx_m2r(pand, var, reg)
+#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd)
+#define pand(vars, vard) mmx_m2m(pand, vars, vard)
+#endif
+
+
+/* 1x64 bitwise AND with Not the destination
+*/
+#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg)
+#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd)
+#define pandn(vars, vard) mmx_m2m(pandn, vars, vard)
+
+
+/* 1x64 bitwise OR
+*/
+#define por_m2r(var, reg) mmx_m2r(por, var, reg)
+#define por_r2r(regs, regd) mmx_r2r(por, regs, regd)
+#define por(vars, vard) mmx_m2m(por, vars, vard)
+
+
+/* 1x64 bitwise eXclusive OR
+*/
+#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg)
+#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd)
+#define pxor(vars, vard) mmx_m2m(pxor, vars, vard)
+
+
+/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality
+ (resulting fields are either 0 or -1)
+*/
+#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg)
+#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd)
+#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard)
+
+#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg)
+#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd)
+#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard)
+
+#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg)
+#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd)
+#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard)
+
+
+/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than
+ (resulting fields are either 0 or -1)
+*/
+#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg)
+#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd)
+#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard)
+
+#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg)
+#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd)
+#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard)
+
+#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg)
+#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd)
+#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard)
+
+
+/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical
+*/
+#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg)
+#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg)
+#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd)
+#define psllq(vars, vard) mmx_m2m(psllq, vars, vard)
+
+#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg)
+#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg)
+#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd)
+#define pslld(vars, vard) mmx_m2m(pslld, vars, vard)
+
+#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg)
+#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg)
+#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd)
+#define psllw(vars, vard) mmx_m2m(psllw, vars, vard)
+
+
+/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical
+*/
+#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg)
+#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg)
+#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd)
+#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard)
+
+#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg)
+#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg)
+#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd)
+#define psrld(vars, vard) mmx_m2m(psrld, vars, vard)
+
+#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg)
+#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg)
+#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd)
+#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard)
+
+
+/* 2x32 and 4x16 Parallel Shift Right Arithmetic
+*/
+#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg)
+#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg)
+#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd)
+#define psrad(vars, vard) mmx_m2m(psrad, vars, vard)
+
+#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg)
+#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg)
+#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd)
+#define psraw(vars, vard) mmx_m2m(psraw, vars, vard)
+
+
+/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate
+ (packs source and dest fields into dest in that order)
+*/
+#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg)
+#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd)
+#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard)
+
+#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg)
+#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd)
+#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard)
+
+
+/* 4x16->8x8 PACK and Unsigned Saturate
+ (packs source and dest fields into dest in that order)
+*/
+#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg)
+#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd)
+#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard)
+
+
+/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low
+ (interleaves low half of dest with low half of source
+ as padding in each result field)
+*/
+#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg)
+#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd)
+#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard)
+
+#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg)
+#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd)
+#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard)
+
+#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg)
+#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd)
+#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard)
+
+
+/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High
+ (interleaves high half of dest with high half of source
+ as padding in each result field)
+*/
+#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg)
+#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd)
+#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard)
+
+#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg)
+#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd)
+#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard)
+
+#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg)
+#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd)
+#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard)
+
+
+/* Empty MMx State
+ (used to clean-up when going from mmx to float use
+ of the registers that are shared by both; note that
+ there is no float-to-mmx operation needed, because
+ only the float tag word info is corruptible)
+*/
+#ifdef MMX_TRACE
+
+#define emms() \
+ { \
+ printf("emms()\n"); \
+ __asm__ __volatile__ ("emms"); \
+ }
+
+#else
+
+#define emms() __asm__ __volatile__ ("emms")
+
+#endif
+
+#endif
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/filter_test/px_py_calc.c b/src/visualizations/Goom/goom2k4-0/src/filter_test/px_py_calc.c
new file mode 100644
index 0000000000..b2cf2d5c16
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/filter_test/px_py_calc.c
@@ -0,0 +1,94 @@
+#include "mmx.h"
+
+int testD [] = {0x1200, 0x2011, 0, 0x12, 0x5331, 0x8000};
+int testS [] = {0x1205, 0x11, 0x4210, 0x412, 0x121, 0x1211};
+
+int ratios [] = {0x8000, 0x4000, 0x1234, 0x6141, 0xffff, 0};
+
+int main () {
+ int nbERROR = 0;
+ int i,j;
+ volatile mmx_t ratiox;
+
+ volatile mmx_t sortie;
+
+ /* creation des variables de test */
+ volatile int buffratio = 0x8000;
+ volatile int loop = 0;
+ volatile int *buffS;
+ volatile int *buffD;
+ buffS = malloc (256);
+ buffD = malloc (256);
+
+ buffS = buffS + (unsigned)buffS % 64;
+ buffD = buffD + (unsigned)buffD % 64;
+
+ for (j=0;j<6;j++)
+ for (i=0;i<3;i++) {
+
+ buffratio = ratios[j];
+
+ buffS[0] = testS[i<<1];
+ buffS[1] = testS[(i<<1)+1];
+
+ buffD[0] = testD[i*2];
+ buffD[1] = testD[i*2+1];
+
+ /* code */
+
+ ratiox.d[0] = buffratio;
+ ratiox.d[1] = buffratio;
+ movq_m2r (ratiox, mm6);
+ pslld_i2r (16,mm6);
+
+ /* |0hhhhhhh|llllvvvv|
+ x |00000000|bbbbbbbb|
+ =================
+ |.bl.high|..bl.low|
+ + |..bh.low|00000000|
+ =================
+ result1
+ */
+
+ /*
+ * pre : mm6 = [buffratio<<16|buffratio<<16]
+ */
+
+ movq_m2r (buffS[loop],mm0); /* mm0 = S */
+ movq_m2r (buffD[loop],mm1); /* mm1 = D */
+ psubd_r2r (mm0,mm1); /* mm1 = D - S */
+ movq_r2r (mm1, mm2); /* mm2 = D - S */
+
+ pslld_i2r (16,mm1);
+ mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */
+ pmullw_r2r (mm6, mm2);
+
+ paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */
+ pslld_i2r (16,mm0);
+
+ paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */
+ psrld_i2r (16, mm0);
+ movq_r2m (mm0, sortie);
+
+ /*
+ * post : mm0 = S + ((D-S)*buffratio)>>16
+ * modified = mm0,mm1,mm2
+ */
+
+ if (
+ (buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16) != sortie.d[0])
+ | (buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16) != sortie.d[1]))
+ {
+ nbERROR++;
+ printf ("\ns : (0x%08x,0x%08x)\n", buffS[0], buffS[1]);
+ printf ("d : (0x%08x,0x%08x)\n", buffD[0], buffD[1]);
+ printf ("ratio : (0x%08x,0x%08x)\n", buffratio, buffratio);
+
+ printf ("en mmx : (0x%08x,0x%08x)\n", sortie.d[0], sortie.d[1]);
+ printf ("en c : (0x%08x,0x%08x)\n",
+ buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16),
+ buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16));
+ }
+ }
+ printf ("%d errors\n",nbERROR);
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c b/src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c
new file mode 100644
index 0000000000..41c5bc5b25
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c
@@ -0,0 +1,202 @@
+
+#define BUFFPOINTNB 16
+#define BUFFPOINTMASK 0xffff
+#define BUFFINCR 0xff
+
+#define sqrtperte 16
+// faire : a % sqrtperte <=> a & pertemask
+#define PERTEMASK 0xf
+// faire : a / sqrtperte <=> a >> PERTEDEC
+#define PERTEDEC 4
+
+//#define MMX_TRACE
+#include "mmx.h"
+
+void zoom_filter_mmx (int prevX, int prevY,
+ unsigned int *expix1, unsigned int *expix2,
+ int *lbruS, int *lbruD, int buffratio,
+ int precalCoef[16][16])
+{
+ int bufsize = prevX * prevY; /* taille du buffer */
+ volatile int loop; /* variable de boucle */
+
+ mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */
+ mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */
+
+ volatile mmx_t prevXY;
+ volatile mmx_t ratiox;
+ volatile mmx_t interpix;
+
+ volatile mmx_t mask; /* masque des nombres a virgules */
+ mask.ud[0] = BUFFPOINTMASK;
+ mask.ud[1] = BUFFPOINTMASK;
+
+ prevXY.ud[0] = (prevX-1)<<PERTEDEC;
+ prevXY.ud[1] = (prevY-1)<<PERTEDEC;
+
+ pxor_r2r (mm7,mm7);
+
+ ratiox.d[0] = buffratio;
+ ratiox.d[1] = buffratio;
+ movq_m2r (ratiox, mm6);
+ pslld_i2r (16,mm6);
+
+ loop=0;
+ while (loop<bufsize)
+ {
+ movq_m2r (ratiox, mm6);
+ pslld_i2r (16,mm6);
+
+ /*
+ * pre : mm6 = [buffratio<<16|buffratio<<16]
+ * post : mm0 = S + ((D-S)*buffratio)>>16 format [X|Y]
+ * modified = mm0,mm1,mm2
+ */
+
+ __asm__ __volatile__ (
+ "movq %0,%%mm0\n"
+ "movq %1,%%mm1\n"
+ : :"X"(brutS[loop]),"X"(brutD[loop])
+ ); /* mm0 = S */
+
+ psubd_r2r (mm0,mm1); /* mm1 = D - S */
+ movq_r2r (mm1, mm2); /* mm2 = D - S */
+
+ pslld_i2r (16,mm1);
+ mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */
+ pmullw_r2r (mm6, mm2);
+
+ paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */
+ pslld_i2r (16,mm0);
+
+ paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */
+ psrld_i2r (16, mm0);
+
+ /*
+ * pre : mm0 : position vector on screen
+ * prevXY : coordinate of the lower-right point on screen
+ * post : clipped mm0
+ * modified : mm0,mm1,mm2
+ */
+ movq_m2r (prevXY,mm1);
+ pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient :
+ 1111 si prevXY > px
+ 0000 si prevXY <= px
+ (idem pour y) */
+ movq_r2r (mm1,mm2);
+ punpckldq_r2r (mm1,mm1);
+ punpckhdq_r2r (mm2,mm2);
+ pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */
+ pand_r2r (mm2, mm0); /* on met a zero la partie qui deborde */
+
+ /*
+ * pre : mm0 : clipped position on screen
+ * post : mm6 : coefs for this position
+ * mm1 : X vector [0|X]
+ * modif : eax,ebx
+ */
+ __asm__ __volatile__ (
+ "movq %%mm0,%%mm1\n"
+ "movd %%mm0,%%ebx\n"
+ "psrlq $32,%%mm1\n"
+ "movd %%mm1,%%eax\n"
+ "andl $15,%%eax\n"
+ "andl $15,%%ebx\n"
+
+ "shll $2,%%eax\n"
+ "shll $3,%%ebx\n"
+
+ "addl %0,%%eax\n"
+
+ "movd (%%eax,%%ebx,8),%%mm6\n"
+ ::"X"(precalCoef):"eax","ebx");
+
+ /*
+ * pre : mm0 : Y pos [*|Y]
+ * mm1 : X pos [*|X]
+ * post : eax : absolute position of the source pixel.
+ * modif : ebx
+ */
+ psrld_i2r (PERTEDEC,mm0);
+ psrld_i2r (PERTEDEC,mm1);
+ __asm__ __volatile__ (
+ "movd %%mm1,%%eax\n"
+ "mull %1\n"
+ "movd %%mm0,%%ebx\n"
+ "addl %%ebx,%%eax\n"
+ "movl %0,%%ebx\n"
+ "movq (%%ebx,%%eax,4),%%mm0\n"
+ "addl %1,%%eax\n"
+ "movq (%%ebx,%%eax,4),%%mm2\n"
+
+ : : "X"(expix1), "X"(prevX):"eax","ebx"
+ );
+
+ /*
+ * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK];
+ * coef en modulo 15 *
+ * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK));
+ */
+
+ /* recuperation des deux premiers pixels dans mm0 et mm1 */
+// movq_m2r (expix1[pos], mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */
+ movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */
+
+ /* recuperation des 2 derniers pixels */
+// movq_m2r (expix1[pos+prevX], mm2);
+
+ /* depackage du premier pixel */
+ punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */
+
+ movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */
+ /* depackage du 2ieme pixel */
+ punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */
+
+ /* extraction des coefficients... */
+ punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */
+ movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */
+ movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */
+
+ punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */
+ punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */
+
+ movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */
+ punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */
+ punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */
+
+ /* multiplication des pixels par les coefficients */
+ pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */
+ pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */
+ paddw_r2r (mm1, mm0);
+
+ /* ...extraction des 2 derniers coefficients */
+ movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */
+ punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */
+ punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */
+
+ /* recuperation des 2 derniers pixels */
+ movq_r2r (mm2, mm1);
+
+ /* depackage des pixels */
+ punpcklbw_r2r (mm7, mm1);
+ punpckhbw_r2r (mm7, mm2);
+
+ /* multiplication pas les coeffs */
+ pmullw_r2r (mm4, mm1);
+ pmullw_r2r (mm5, mm2);
+
+ /* ajout des valeurs obtenues à la valeur finale */
+ paddw_r2r (mm1, mm0);
+ paddw_r2r (mm2, mm0);
+
+ /* division par 256 = 16+16+16+16, puis repackage du pixel final */
+ psrlw_i2r (8, mm0);
+ packuswb_r2r (mm7, mm0);
+
+ movd_r2m (mm0,expix2[loop]);
+
+ // expix2[loop] = couleur;
+ ++loop;
+ }
+ emms(); /* __asm__ __volatile__ ("emms"); */
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx.c b/src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx.c
new file mode 100644
index 0000000000..dd2d022afd
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx.c
@@ -0,0 +1,186 @@
+
+#define BUFFPOINTNB 16
+#define BUFFPOINTMASK 0xffff
+#define BUFFINCR 0xff
+
+#define sqrtperte 16
+// faire : a % sqrtperte <=> a & pertemask
+#define PERTEMASK 0xf
+// faire : a / sqrtperte <=> a >> PERTEDEC
+#define PERTEDEC 4
+
+//#define MMX_TRACE
+#include "mmx.h"
+
+void zoom_filter_mmx (int prevX, int prevY,
+ unsigned int *expix1, unsigned int *expix2,
+ int *lbruS, int *lbruD, int buffratio,
+ int precalCoef[16][16])
+{
+ int bufsize = prevX * prevY; /* taille du buffer */
+ volatile int loop; /* variable de boucle */
+
+ mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */
+ mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */
+
+ int pos;
+
+ volatile mmx_t prevXY;
+ volatile mmx_t ratiox;
+ volatile mmx_t interpix;
+
+ volatile mmx_t mask; /* masque des nombres a virgules */
+ mask.ud[0] = BUFFPOINTMASK;
+ mask.ud[1] = BUFFPOINTMASK;
+
+ prevXY.ud[0] = (prevX-1)<<PERTEDEC;
+ prevXY.ud[1] = (prevY-1)<<PERTEDEC;
+
+ pxor_r2r (mm7,mm7);
+
+ ratiox.d[0] = buffratio;
+ ratiox.d[1] = buffratio;
+ movq_m2r (ratiox, mm6);
+ pslld_i2r (16,mm6);
+
+ for (loop=0; loop<bufsize; loop++)
+ {
+ /*
+ * pre : mm6 = [buffratio<<16|buffratio<<16]
+ * post : mm0 = S + ((D-S)*buffratio)>>16 format [X|Y]
+ * modified = mm0,mm1,mm2
+ */
+
+ movq_m2r (brutS[loop],mm0); /* mm0 = S */
+ movq_m2r (brutD[loop],mm1); /* mm1 = D */
+ psubd_r2r (mm0,mm1); /* mm1 = D - S */
+ movq_r2r (mm1, mm2); /* mm2 = D - S */
+
+ pslld_i2r (16,mm1);
+ mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */
+ pmullw_r2r (mm6, mm2);
+
+ paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */
+ pslld_i2r (16,mm0);
+
+ paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */
+ psrld_i2r (16, mm0);
+
+ /*
+ * pre : mm0 : position vector on screen
+ * prevXY : coordinate of the lower-right point on screen
+ * post : clipped mm0
+ * modified : mm0,mm1
+ */
+ movq_m2r (prevXY,mm1);
+ pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient :
+ 1111 si prevXY > px
+ 0000 si prevXY <= px
+ (idem pour y) */
+ pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */
+
+
+ /*
+ * pre : mm0 : clipped position on screen
+ * post : mm6 : coefs for this position
+ * mm1 : X vector [0|X]
+ * modif : eax,ebx
+ */
+ __asm__ __volatile__ (
+ "movq %%mm0,%%mm1\n"
+ "movd %%mm0,%%eax\n"
+ "psrlq $32,%%mm1\n"
+ "movd %%mm1,%%ebx\n"
+ "and $15,%%eax\n"
+ "and $15,%%ebx\n"
+ "add %0,%%eax\n"
+ "movd (%%eax,%%ebx,$16),%%mm6\n"
+ ::"X"(precalCoef):"eax","ebx");
+
+ /*
+ * pre : mm0 : Y pos [*|Y]
+ * mm1 : X pos [*|X]
+ * post : eax : absolute position of the source pixel.
+ * modif : ebx
+ */
+ psrld_i2r (PERTEDEC,mm0);
+ psrld_i2r (PERTEDEC,mm1);
+ __asm__ __volatile__ (
+ "movd %%mm1,%%eax\n"
+// "movl %1,%%ebx\n"
+ "mull %1\n"
+ "movd %%mm0,%%ebx\n"
+ "addl %%ebx,%%eax\n"
+ "movl %%eax,%0\n"
+ :"=X"(pos):"X"(prevX):"eax","ebx"
+ );
+
+ expix2[loop] = expix1[pos];
+ /*
+ * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK];
+ * coef en modulo 15 *
+ * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK));
+ */
+// precal + eax + ebx * 16
+
+// movd_m2r (precalCoef[interpix.d[0]][interpix.d[1]],mm6);
+
+ /* recuperation des deux premiers pixels dans mm0 et mm1 */
+// movq_m2r (/*expix1[pos]*/a, mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */
+// movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */
+
+ /* depackage du premier pixel */
+// punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */
+
+// movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */
+ /* depackage du 2ieme pixel */
+// punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */
+
+ /* extraction des coefficients... */
+// punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */
+// movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */
+// movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */
+
+// punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */
+// punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */
+
+// movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */
+// punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */
+// punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */
+
+ /* multiplication des pixels par les coefficients */
+// pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */
+// pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */
+// paddw_r2r (mm1, mm0);
+
+ /* ...extraction des 2 derniers coefficients */
+// movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */
+// punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */
+// punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */
+
+ /* recuperation des 2 derniers pixels */
+// movq_m2r (a/*expix1[pos+largeur]*/, mm1);
+// movq_r2r (mm1, mm2);
+
+ /* depackage des pixels */
+// punpcklbw_r2r (mm7, mm1);
+// punpckhbw_r2r (mm7, mm2);
+
+ /* multiplication pas les coeffs */
+// pmullw_r2r (mm4, mm1);
+// pmullw_r2r (mm5, mm2);
+
+ /* ajout des valeurs obtenues à la valeur finale */
+// paddw_r2r (mm1, mm0);
+// paddw_r2r (mm2, mm0);
+
+ /* division par 256 = 16+16+16+16, puis repackage du pixel final */
+// psrlw_i2r (8, mm0);
+// packuswb_r2r (mm7, mm0);
+
+// movd_r2m (mm0,expix2[loop]);
+
+ // expix2[loop] = couleur;
+ }
+ emms(); /* __asm__ __volatile__ ("emms"); */
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/filters.c b/src/visualizations/Goom/goom2k4-0/src/filters.c
new file mode 100644
index 0000000000..b6de4de5cd
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/filters.c
@@ -0,0 +1,773 @@
+// --- CHUI EN TRAIN DE SUPPRIMER LES EXTERN RESOLX ET C_RESOLY ---
+
+/* filter.c version 0.7
+* contient les filtres applicable a un buffer
+* creation : 01/10/2000
+* -ajout de sinFilter()
+* -ajout de zoomFilter()
+* -copie de zoomFilter() en zoomFilterRGB(), gerant les 3 couleurs
+* -optimisation de sinFilter (utilisant une table de sin)
+* -asm
+* -optimisation de la procedure de generation du buffer de transformation
+* la vitesse est maintenant comprise dans [0..128] au lieu de [0..100]
+*/
+
+/* #define _DEBUG_PIXEL */
+
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <stdio.h>
+#include <inttypes.h>
+
+#include "goom_filters.h"
+#include "goom_graphic.h"
+#include "goom_tools.h"
+#include "goom_plugin_info.h"
+#include "goom_fx.h"
+#include "v3d.h"
+
+/* TODO : MOVE THIS AWAY !!! */
+/* jeko: j'ai essayer de le virer, mais si on veut les laisser inline c'est un peu lourdo... */
+static inline void setPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color c)
+{
+ Pixel i;
+
+ i.channels.b = c.b;
+ i.channels.g = c.v;
+ i.channels.r = c.r;
+ *(buffer + (x + y * goomInfo->screen.width)) = i;
+}
+
+static inline void setPixelRGB_ (Pixel *buffer, Uint x, Color c)
+{
+ buffer[x].channels.r = c.r;
+ buffer[x].channels.g = c.v;
+ buffer[x].channels.b = c.b;
+}
+
+static inline void getPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color * c)
+{
+ Pixel i = *(buffer + (x + y * goomInfo->screen.width));
+ c->b = i.channels.b;
+ c->v = i.channels.g;
+ c->r = i.channels.r;
+}
+
+static inline void getPixelRGB_ (Pixel *buffer, Uint x, Color * c)
+{
+ Pixel i = *(buffer + x);
+ c->b = i.channels.b;
+ c->v = i.channels.g;
+ c->r = i.channels.r;
+}
+/* END TODO */
+
+
+/* DEPRECATED */
+// retourne x>>s , en testant le signe de x
+//#define ShiftRight(_x,_s) (((_x)<0) ? -(-(_x)>>(_s)) : ((_x)>>(_s)))
+//#define EFFECT_DISTORS 4
+//#define EFFECT_DISTORS_SL 2
+//#define INTERLACE_ADD 9
+//#define INTERLACE_AND 0xf
+/* END DEPRECATED */
+
+#define BUFFPOINTNB 16
+#define BUFFPOINTNBF 16.0f
+#define BUFFPOINTMASK 0xffff
+
+#define sqrtperte 16
+/* faire : a % sqrtperte <=> a & pertemask */
+#define PERTEMASK 0xf
+/* faire : a / sqrtperte <=> a >> PERTEDEC */
+#define PERTEDEC 4
+
+/* pure c version of the zoom filter */
+static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, int buffratio, int precalCoef[BUFFPOINTNB][BUFFPOINTNB]);
+
+/* simple wrapper to give it the same proto than the others */
+void zoom_filter_c (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]) {
+ c_zoom(src, dest, sizeX, sizeY, brutS, brutD, buffratio, precalCoef);
+}
+
+static void generatePrecalCoef (int precalCoef[BUFFPOINTNB][BUFFPOINTNB]);
+
+
+typedef struct _ZOOM_FILTER_FX_WRAPPER_DATA {
+
+ PluginParam enabled_bp;
+ PluginParameters params;
+
+ unsigned int *coeffs, *freecoeffs;
+
+ signed int *brutS, *freebrutS; /* source */
+ signed int *brutD, *freebrutD; /* dest */
+ signed int *brutT, *freebrutT; /* temp (en cours de generation) */
+
+ guint32 zoom_width;
+
+ unsigned int prevX, prevY;
+
+ float general_speed;
+ int reverse; /* reverse the speed */
+ char theMode;
+ int waveEffect;
+ int hypercosEffect;
+ int vPlaneEffect;
+ int hPlaneEffect;
+ char noisify;
+ int middleX, middleY;
+
+ int mustInitBuffers;
+ int interlace_start;
+
+ /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */
+ int buffratio;
+ int *firedec;
+
+ /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */
+ int precalCoef[BUFFPOINTNB][BUFFPOINTNB];
+
+ /** calculatePXandPY statics */
+ int wave;
+ int wavesp;
+
+} ZoomFilterFXWrapperData;
+
+
+
+
+static inline v2g zoomVector(ZoomFilterFXWrapperData *data, float X, float Y)
+{
+ v2g vecteur;
+ float vx, vy;
+ float sq_dist = X*X + Y*Y;
+
+ /* sx = (X < 0.0f) ? -1.0f : 1.0f;
+ sy = (Y < 0.0f) ? -1.0f : 1.0f;
+ */
+ float coefVitesse = (1.0f+ data->general_speed) / 50.0f;
+
+ // Effects
+
+ /* Centralized FX */
+
+ switch (data->theMode) {
+ case CRYSTAL_BALL_MODE:
+ coefVitesse -= (sq_dist-0.3f)/15.0f;
+ break;
+ case AMULETTE_MODE:
+ coefVitesse += sq_dist * 3.5f;
+ break;
+ case WAVE_MODE:
+ coefVitesse += sin(sq_dist*20.0f) / 100.0f;
+ break;
+ case SCRUNCH_MODE:
+ coefVitesse += sq_dist / 10.0f;
+ break;
+ //case HYPERCOS1_MODE:
+ break;
+ //case HYPERCOS2_MODE:
+ break;
+ //case YONLY_MODE:
+ break;
+ case SPEEDWAY_MODE:
+ coefVitesse *= 4.0f * Y;
+ break;
+ default:
+ break;
+ }
+
+ if (coefVitesse < -2.01f)
+ coefVitesse = -2.01f;
+ if (coefVitesse > 2.01f)
+ coefVitesse = 2.01f;
+
+ vx = coefVitesse * X;
+ vy = coefVitesse * Y;
+
+ /* Amulette 2 */
+ // vx = X * tan(dist);
+ // vy = Y * tan(dist);
+
+ /* Rotate */
+ //vx = (X+Y)*0.1;
+ //vy = (Y-X)*0.1;
+
+
+ // Effects adds-on
+
+ /* Noise */
+ if (data->noisify)
+ {
+ vx += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f;
+ vy += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f;
+ }
+
+ /* Hypercos */
+ if (data->hypercosEffect)
+ {
+ vx += sin(Y*10.0f)/120.0f;
+ vy += sin(X*10.0f)/120.0f;
+ }
+
+ /* H Plane */
+ if (data->hPlaneEffect) vx += Y * 0.0025f * data->hPlaneEffect;
+
+ /* V Plane */
+ if (data->vPlaneEffect) vy += X * 0.0025f * data->vPlaneEffect;
+
+ /* TODO : Water Mode */
+ // if (data->waveEffect)
+
+ vecteur.x = vx;
+ vecteur.y = vy;
+
+ return vecteur;
+}
+
+
+/*
+ * Makes a stripe of a transform buffer (brutT)
+ *
+ * The transform is (in order) :
+ * Translation (-data->middleX, -data->middleY)
+ * Homothetie (Center : 0,0 Coeff : 2/data->prevX)
+ */
+static void makeZoomBufferStripe(ZoomFilterFXWrapperData * data, int INTERLACE_INCR)
+{
+ // Position of the pixel to compute in pixmap coordinates
+ Uint x, y;
+ // Where (verticaly) to stop generating the buffer stripe
+ int maxEnd = (data->interlace_start + INTERLACE_INCR);
+ // Ratio from pixmap to normalized coordinates
+ float ratio = 2.0f/((float)data->prevX);
+ // Ratio from normalized to virtual pixmap coordinates
+ float inv_ratio = BUFFPOINTNBF/ratio;
+ float min = ratio/BUFFPOINTNBF;
+ // Y position of the pixel to compute in normalized coordinates
+ float Y = ((float)(data->interlace_start - data->middleY)) * ratio;
+
+ maxEnd = data->prevY;
+ if (maxEnd > (data->interlace_start + INTERLACE_INCR))
+ maxEnd = (data->interlace_start + INTERLACE_INCR);
+
+ for (y = data->interlace_start; (y < data->prevY) && ((signed int)y<maxEnd); y++) {
+ Uint premul_y_prevX = y * data->prevX * 2;
+ float X = - ((float)data->middleX) * ratio;
+ for (x = 0; x < data->prevX; x++)
+ {
+ v2g vector = zoomVector (data, X, Y);
+
+ /* Finish and avoid null displacement */
+ if (fabs(vector.x) < min) vector.x = (vector.x < 0.0f) ? -min : min;
+ if (fabs(vector.y) < min) vector.y = (vector.y < 0.0f) ? -min : min;
+
+ data->brutT[premul_y_prevX] = ((int)((X-vector.x)*inv_ratio)+((int)(data->middleX*BUFFPOINTNB)));
+ data->brutT[premul_y_prevX+1] = ((int)((Y-vector.y)*inv_ratio)+((int)(data->middleY*BUFFPOINTNB)));
+ premul_y_prevX += 2;
+ X += ratio;
+ }
+ Y += ratio;
+ }
+ data->interlace_start += INTERLACE_INCR;
+ if (y >= data->prevY-1) data->interlace_start = -1;
+}
+
+
+/*
+ * calculer px et py en fonction de x,y,middleX,middleY et theMode
+ * px et py indique la nouvelle position (en sqrtperte ieme de pixel)
+ * (valeur * 16)
+
+ inline void calculatePXandPY (PluginInfo *goomInfo, ZoomFilterFXWrapperData *data, int x, int y, int *px, int *py)
+ {
+ if (data->theMode == WATER_MODE) {
+ int yy;
+
+ yy = y + goom_irand(goomInfo->gRandom, 4) - goom_irand(goomInfo->gRandom, 4) + data->wave / 10;
+ if (yy < 0)
+ yy = 0;
+ if (yy >= (signed int)goomInfo->screen.height)
+ yy = goomInfo->screen.height - 1;
+
+ *px = (x << 4) + data->firedec[yy] + (data->wave / 10);
+ *py = (y << 4) + 132 - ((data->vitesse < 131) ? data->vitesse : 130);
+
+ data->wavesp += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3);
+ if (data->wave < -10)
+ data->wavesp += 2;
+ if (data->wave > 10)
+ data->wavesp -= 2;
+ data->wave += (data->wavesp / 10) + goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3);
+ if (data->wavesp > 100)
+ data->wavesp = (data->wavesp * 9) / 10;
+ }
+ else {
+ int dist = 0, vx9, vy9;
+ int vx, vy;
+ int ppx, ppy;
+ int fvitesse = data->vitesse << 4;
+
+ if (data->noisify) {
+ x += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify);
+ y += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify);
+ }
+ vx = (x - data->middleX) << 9;
+ vy = (y - data->middleY) << 9;
+
+ if (data->hPlaneEffect)
+ vx += data->hPlaneEffect * (y - data->middleY);
+
+ if (data->vPlaneEffect)
+ vy += data->vPlaneEffect * (x - data->middleX);
+
+ if (data->waveEffect) {
+ fvitesse *=
+ 1024 +
+ ShiftRight (goomInfo->sintable
+ [(unsigned short) (dist * 0xffff + EFFECT_DISTORS)], 6);
+ fvitesse /= 1024;
+ }
+
+ if (data->hypercosEffect) {
+ vx += ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1);
+ vy += ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1);
+ }
+
+ vx9 = ShiftRight (vx, 9);
+ vy9 = ShiftRight (vy, 9);
+ dist = vx9 * vx9 + vy9 * vy9;
+
+ switch (data->theMode) {
+ case WAVE_MODE:
+ fvitesse *=
+ 1024 +
+ ShiftRight (goomInfo->sintable
+ [(unsigned short) (dist * 0xffff * EFFECT_DISTORS)], 6);
+ fvitesse>>=10;
+ break;
+ case CRYSTAL_BALL_MODE:
+ fvitesse += (dist >> (10-EFFECT_DISTORS_SL));
+ break;
+ case AMULETTE_MODE:
+ fvitesse -= (dist >> (4 - EFFECT_DISTORS_SL));
+ break;
+ case SCRUNCH_MODE:
+ fvitesse -= (dist >> (10 - EFFECT_DISTORS_SL));
+ break;
+ case HYPERCOS1_MODE:
+ vx = vx + ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1);
+ vy = vy + ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1);
+ break;
+ case HYPERCOS2_MODE:
+ vx =
+ vx + ShiftRight (goomInfo->sintable[(-ShiftRight (vy, 1) + dist) & 0xffff], 0);
+ vy =
+ vy + ShiftRight (goomInfo->sintable[(ShiftRight (vx, 1) + dist) & 0xffff], 0);
+ fvitesse = 128 << 4;
+ break;
+ case YONLY_MODE:
+ fvitesse *= 1024 + ShiftRight (goomInfo->sintable[vy & 0xffff], 6);
+ fvitesse >>= 10;
+ break;
+ case SPEEDWAY_MODE:
+ fvitesse -= (ShiftRight(vy,10-EFFECT_DISTORS_SL));
+ break;
+ }
+
+ if (fvitesse < -3024)
+ fvitesse = -3024;
+
+ if (vx < 0) // pb avec decalage sur nb negatif
+ ppx = -(-(vx * fvitesse) >> 16);
+ // 16 = 9 + 7 (7 = nb chiffre virgule de vitesse * (v = 128 => immobile)
+ // * * * * * 9 = nb chiffre virgule de vx)
+ else
+ ppx = ((vx * fvitesse) >> 16);
+
+ if (vy < 0)
+ ppy = -(-(vy * fvitesse) >> 16);
+ else
+ ppy = ((vy * fvitesse) >> 16);
+
+ *px = (data->middleX << 4) + ppx;
+ *py = (data->middleY << 4) + ppy;
+ }
+ }
+ */
+
+
+
+static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD,
+ int buffratio, int precalCoef[16][16])
+{
+ int myPos, myPos2;
+ Color couleur;
+
+ unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC;
+
+ int bufsize = prevX * prevY * 2;
+ int bufwidth = prevX;
+
+ expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0;
+
+ for (myPos = 0; myPos < bufsize; myPos += 2) {
+ Color col1, col2, col3, col4;
+ int c1, c2, c3, c4, px, py;
+ int pos;
+ int coeffs;
+
+ int brutSmypos = brutS[myPos];
+
+ myPos2 = myPos + 1;
+
+ px = brutSmypos + (((brutD[myPos] - brutSmypos) * buffratio) >> BUFFPOINTNB);
+ brutSmypos = brutS[myPos2];
+ py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB);
+
+ if ((py >= ay) || (px >= ax)) {
+ pos = coeffs = 0;
+ } else {
+ pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC));
+ /* coef en modulo 15 */
+ coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK];
+ }
+ getPixelRGB_ (expix1, pos, &col1);
+ getPixelRGB_ (expix1, pos + 1, &col2);
+ getPixelRGB_ (expix1, pos + bufwidth, &col3);
+ getPixelRGB_ (expix1, pos + bufwidth + 1, &col4);
+
+ c1 = coeffs;
+ c2 = (c1 >> 8) & 0xFF;
+ c3 = (c1 >> 16) & 0xFF;
+ c4 = (c1 >> 24) & 0xFF;
+ c1 = c1 & 0xff;
+
+ couleur.r = col1.r * c1 + col2.r * c2 + col3.r * c3 + col4.r * c4;
+ if (couleur.r > 5)
+ couleur.r -= 5;
+ couleur.r >>= 8;
+
+ couleur.v = col1.v * c1 + col2.v * c2 + col3.v * c3 + col4.v * c4;
+ if (couleur.v > 5)
+ couleur.v -= 5;
+ couleur.v >>= 8;
+
+ couleur.b = col1.b * c1 + col2.b * c2 + col3.b * c3 + col4.b * c4;
+ if (couleur.b > 5)
+ couleur.b -= 5;
+ couleur.b >>= 8;
+
+ setPixelRGB_ (expix2, myPos >> 1, couleur);
+ }
+}
+
+/** generate the water fx horizontal direction buffer */
+static void generateTheWaterFXHorizontalDirectionBuffer(PluginInfo *goomInfo, ZoomFilterFXWrapperData *data) {
+
+ int loopv;
+ int decc = goom_irand(goomInfo->gRandom, 8) - 4;
+ int spdc = goom_irand(goomInfo->gRandom, 8) - 4;
+ int accel = goom_irand(goomInfo->gRandom, 8) - 4;
+
+ for (loopv = data->prevY; loopv != 0;) {
+
+ loopv--;
+ data->firedec[loopv] = decc;
+ decc += spdc / 10;
+ spdc += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3);
+
+ if (decc > 4)
+ spdc -= 1;
+ if (decc < -4)
+ spdc += 1;
+
+ if (spdc > 30)
+ spdc = spdc - goom_irand(goomInfo->gRandom, 3) + accel / 10;
+ if (spdc < -30)
+ spdc = spdc + goom_irand(goomInfo->gRandom, 3) + accel / 10;
+
+ if (decc > 8 && spdc > 1)
+ spdc -= goom_irand(goomInfo->gRandom, 3) - 2;
+
+ if (decc < -8 && spdc < -1)
+ spdc += goom_irand(goomInfo->gRandom, 3) + 2;
+
+ if (decc > 8 || decc < -8)
+ decc = decc * 8 / 9;
+
+ accel += goom_irand(goomInfo->gRandom, 2) - goom_irand(goomInfo->gRandom, 2);
+ if (accel > 20)
+ accel -= 2;
+ if (accel < -20)
+ accel += 2;
+ }
+}
+
+
+
+/**
+* Main work for the dynamic displacement map.
+ *
+ * Reads data from pix1, write to pix2.
+ *
+ * Useful datas for this FX are stored in ZoomFilterData.
+ *
+ * If you think that this is a strange function name, let me say that a long time ago,
+ * there has been a slow version and a gray-level only one. Then came these function,
+ * fast and workin in RGB colorspace ! nice but it only was applying a zoom to the image.
+ * So that is why you have this name, for the nostalgy of the first days of goom
+ * when it was just a tiny program writen in Turbo Pascal on my i486...
+ */
+void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, Uint resx, Uint resy, int switchIncr, float switchMult)
+{
+ Uint x, y;
+
+ ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)goomInfo->zoomFilter_fx.fx_data;
+
+ if (!BVAL(data->enabled_bp)) return;
+
+ /** changement de taille **/
+ if ((data->prevX != resx) || (data->prevY != resy)) {
+ data->prevX = resx;
+ data->prevY = resy;
+
+ if (data->brutS) free (data->freebrutS);
+ data->brutS = 0;
+ if (data->brutD) free (data->freebrutD);
+ data->brutD = 0;
+ if (data->brutT) free (data->freebrutT);
+ data->brutT = 0;
+
+ data->middleX = resx / 2;
+ data->middleY = resy / 2;
+ data->mustInitBuffers = 1;
+ if (data->firedec) free (data->firedec);
+ data->firedec = 0;
+ }
+
+ if (data->interlace_start != -2)
+ zf = NULL;
+
+ /** changement de config **/
+ if (zf) {
+ data->reverse = zf->reverse;
+ data->general_speed = (float)(zf->vitesse-128)/128.0f;
+ if (data->reverse) data->general_speed = -data->general_speed;
+ data->middleX = zf->middleX;
+ data->middleY = zf->middleY;
+ data->theMode = zf->mode;
+ data->hPlaneEffect = zf->hPlaneEffect;
+ data->vPlaneEffect = zf->vPlaneEffect;
+ data->waveEffect = zf->waveEffect;
+ data->hypercosEffect = zf->hypercosEffect;
+ data->noisify = zf->noisify;
+ data->interlace_start = 0;
+ }
+
+
+ if (data->mustInitBuffers) {
+
+ data->mustInitBuffers = 0;
+ data->freebrutS = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int));
+ data->brutS = (gint32 *) ((1 + ((uintptr_t) (data->freebrutS)) / 128) * 128);
+
+ data->freebrutD = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int));
+ data->brutD = (gint32 *) ((1 + ((uintptr_t) (data->freebrutD)) / 128) * 128);
+
+ data->freebrutT = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int));
+ data->brutT = (gint32 *) ((1 + ((uintptr_t) (data->freebrutT)) / 128) * 128);
+
+ data->buffratio = 0;
+
+ data->firedec = (int *) malloc (data->prevY * sizeof (int));
+ generateTheWaterFXHorizontalDirectionBuffer(goomInfo, data);
+
+ data->interlace_start = 0;
+ makeZoomBufferStripe(data,resy);
+
+ /* Copy the data from temp to dest and source */
+ memcpy(data->brutS,data->brutT,resx * resy * 2 * sizeof(int));
+ memcpy(data->brutD,data->brutT,resx * resy * 2 * sizeof(int));
+ }
+
+ /* generation du buffer de trans */
+ if (data->interlace_start == -1) {
+
+ /* sauvegarde de l'etat actuel dans la nouvelle source
+ * TODO: write that in MMX (has been done in previous version, but did not follow some new fonctionnalities) */
+ y = data->prevX * data->prevY * 2;
+ for (x = 0; x < y; x += 2) {
+ int brutSmypos = data->brutS[x];
+ int x2 = x + 1;
+
+ data->brutS[x] = brutSmypos + (((data->brutD[x] - brutSmypos) * data->buffratio) >> BUFFPOINTNB);
+ brutSmypos = data->brutS[x2];
+ data->brutS[x2] = brutSmypos + (((data->brutD[x2] - brutSmypos) * data->buffratio) >> BUFFPOINTNB);
+ }
+ data->buffratio = 0;
+ }
+
+ if (data->interlace_start == -1) {
+ signed int * tmp;
+ tmp = data->brutD;
+ data->brutD=data->brutT;
+ data->brutT=tmp;
+ tmp = data->freebrutD;
+ data->freebrutD=data->freebrutT;
+ data->freebrutT=tmp;
+ data->interlace_start = -2;
+ }
+
+ if (data->interlace_start>=0)
+ {
+ /* creation de la nouvelle destination */
+ makeZoomBufferStripe(data,resy/16);
+ }
+
+ if (switchIncr != 0) {
+ data->buffratio += switchIncr;
+ if (data->buffratio > BUFFPOINTMASK)
+ data->buffratio = BUFFPOINTMASK;
+ }
+
+ if (switchMult != 1.0f) {
+ data->buffratio = (int) ((float) BUFFPOINTMASK * (1.0f - switchMult) +
+ (float) data->buffratio * switchMult);
+ }
+
+ data->zoom_width = data->prevX;
+
+ goomInfo->methods.zoom_filter (data->prevX, data->prevY, pix1, pix2,
+ data->brutS, data->brutD, data->buffratio, data->precalCoef);
+}
+
+static void generatePrecalCoef (int precalCoef[16][16])
+{
+ int coefh, coefv;
+
+ for (coefh = 0; coefh < 16; coefh++) {
+ for (coefv = 0; coefv < 16; coefv++) {
+
+ int i;
+ int diffcoeffh;
+ int diffcoeffv;
+
+ diffcoeffh = sqrtperte - coefh;
+ diffcoeffv = sqrtperte - coefv;
+
+ if (!(coefh || coefv)) {
+ i = 255;
+ }
+ else {
+ int i1, i2, i3, i4;
+
+ i1 = diffcoeffh * diffcoeffv;
+ i2 = coefh * diffcoeffv;
+ i3 = diffcoeffh * coefv;
+ i4 = coefh * coefv;
+
+ // TODO: faire mieux...
+ if (i1) i1--;
+ if (i2) i2--;
+ if (i3) i3--;
+ if (i4) i4--;
+
+ i = (i1) | (i2 << 8) | (i3 << 16) | (i4 << 24);
+ }
+ precalCoef[coefh][coefv] = i;
+ }
+ }
+}
+
+/* VisualFX Wrapper */
+
+static void zoomFilterVisualFXWrapper_init (struct _VISUAL_FX *_this, PluginInfo *info)
+{
+ ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)malloc(sizeof(ZoomFilterFXWrapperData));
+
+ data->coeffs = 0;
+ data->freecoeffs = 0;
+ data->brutS = 0;
+ data->freebrutS = 0;
+ data->brutD = 0;
+ data->freebrutD = 0;
+ data->brutT = 0;
+ data->freebrutT = 0;
+ data->prevX = 0;
+ data->prevY = 0;
+
+ data->mustInitBuffers = 1;
+ data->interlace_start = -2;
+
+ data->general_speed = 0.0f;
+ data->reverse = 0;
+ data->theMode = AMULETTE_MODE;
+ data->waveEffect = 0;
+ data->hypercosEffect = 0;
+ data->vPlaneEffect = 0;
+ data->hPlaneEffect = 0;
+ data->noisify = 2;
+
+ /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */
+ data->buffratio = 0;
+ data->firedec = 0;
+
+ data->wave = data->wavesp = 0;
+
+ data->enabled_bp = secure_b_param("Enabled", 1);
+
+ data->params = plugin_parameters ("Zoom Filter", 1);
+ data->params.params[0] = &data->enabled_bp;
+
+ _this->params = &data->params;
+ _this->fx_data = (void*)data;
+
+ /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */
+ generatePrecalCoef(data->precalCoef);
+}
+
+static void zoomFilterVisualFXWrapper_free (struct _VISUAL_FX *_this)
+{
+ ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)_this->fx_data;
+ free (data->freebrutS);
+ free (data->freebrutD);
+ free (data->freebrutT);
+ free (data->firedec);
+ free (data->params.params);
+ free(_this->fx_data);
+}
+
+static void zoomFilterVisualFXWrapper_apply (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info)
+{
+}
+
+VisualFX zoomFilterVisualFXWrapper_create(void)
+{
+ VisualFX fx;
+ fx.init = zoomFilterVisualFXWrapper_init;
+ fx.free = zoomFilterVisualFXWrapper_free;
+ fx.apply = zoomFilterVisualFXWrapper_apply;
+ return fx;
+}
+
+
+/* TODO : MOVE THIS AWAY */
+
+void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, float t1, float t2, float t3, float t4, Uint cycle)
+{
+ Uint x = (Uint) ((int) (goomInfo->screen.width / 2)
+ + (int) (t1 * cos ((float) cycle / t3)));
+ Uint y = (Uint) ((int) (goomInfo->screen.height/2)
+ + (int) (t2 * sin ((float) cycle / t4)));
+
+ if ((x > 1) && (y > 1) && (x < goomInfo->screen.width - 2) && (y < goomInfo->screen.height - 2)) {
+ setPixelRGB (goomInfo, pix1, x + 1, y, c);
+ setPixelRGB (goomInfo, pix1, x, y + 1, c);
+ setPixelRGB (goomInfo, pix1, x + 1, y + 1, WHITE);
+ setPixelRGB (goomInfo, pix1, x + 2, y + 1, c);
+ setPixelRGB (goomInfo, pix1, x + 1, y + 2, c);
+ }
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/filters_mmx.s b/src/visualizations/Goom/goom2k4-0/src/filters_mmx.s
new file mode 100644
index 0000000000..765f1588e1
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/filters_mmx.s
@@ -0,0 +1,200 @@
+;// file : mmx_zoom.s
+;// author : JC Hoelt <jeko@free.fr>
+;//
+;// history
+;// 07/01/2001 : Changing FEMMS to EMMS : slower... but run on intel machines
+;// 03/01/2001 : WIDTH and HEIGHT are now variable
+;// 28/12/2000 : adding comments to the code, suppress some useless lines
+;// 27/12/2000 : reducing memory access... improving performance by 20%
+;// coefficients are now on 1 byte
+;// 22/12/2000 : Changing data structure
+;// 16/12/2000 : AT&T version
+;// 14/12/2000 : unrolling loop
+;// 12/12/2000 : 64 bits memory access
+
+
+.data
+
+chaine:
+ .string "pos = %d\n\0"
+ .long 0x0
+
+thezero:
+ .long 0x00000000
+ .long 0x00000000
+
+.text
+
+.globl mmx_zoom ;// name of the function to call by C program
+/* .extern coeffs ;// the transformation buffer */
+.extern expix1,expix2 ;// the source and destination buffer
+.extern mmx_zoom_size, zoom_width ;// size of the buffers
+
+.extern brutS,brutD,buffratio,precalCoef,prevX,prevY
+
+#define PERTEMASK 15
+/* faire : a / sqrtperte <=> a >> PERTEDEC*/
+#define PERTEDEC 4
+
+.align 16
+mmx_zoom:
+
+ pushl %ebp
+ movl %esp,%ebp
+ subl $12,%esp
+
+ movl prevX,%eax
+ decl %eax
+ sarl $4,%eax
+ movl %eax,-4(%ebp)
+
+ movl prevY,%eax
+ decl %eax
+ sarl $4,%eax
+ movl %eax,-8(%ebp)
+
+;// initialisation du mm7 à zero
+ movq (thezero), %mm7
+
+movl mmx_zoom_size, %ecx
+decl %ecx
+
+.while:
+ ;// esi <- nouvelle position
+ movl brutS, %eax
+ leal (%eax, %ecx, 8),%eax
+
+ movl (%eax),%edx /* = brutS.px (brutSmypos) */
+ movl 4(%eax),%eax /* = brutS.py */
+
+ movl brutD,%ebx
+ leal (%ebx, %ecx, 8),%ebx
+ movl (%ebx),%esi
+ subl %edx, %esi
+ imull buffratio,%esi
+ sarl $16,%esi
+ addl %edx,%esi /* esi = px */
+
+ /* eax contient deja brutS.py = le nouveau brutSmypos*/
+ /* ebx pointe sur brutD[myPos] */
+ movl 4(%ebx),%edi
+ subl %eax,%edi
+ imull buffratio,%edi
+ sarl $16,%edi
+ addl %eax,%edi /* edi = py */
+
+/* pushl %eax
+ pushl %ebx*/
+/* popl %ebx
+ popl %eax*/
+
+ movl %esi,%eax
+ andl $15,%eax /* eax = coefh */
+ movl %edi,%ebx
+ andl $15,%ebx /* ebx = coefv */
+
+ leal 0(,%ebx,4),%ebx
+ sall $6,%eax
+ addl %ebx,%eax
+ movl $precalCoef,%ebx
+/* movd (%eax,%ebx),%mm6*/ /* mm6 = coeffs */
+
+ cmpl -8(%ebp),%edi
+ jge .then1
+ cmpl -4(%ebp),%esi
+ jge .then1
+
+ sarl $4,%esi
+ sarl $4,%edi
+ imull zoom_width,%edi
+ leal (%esi,%edi),%esi
+ jmp .finsi1
+
+.then1:
+ movl $0,%esi
+.finsi1:
+
+ /** apres ce calcul, %esi = pos, %mm6 = coeffs **/
+/* pushl %esi
+ pushl $chaine
+ call printf
+ addl $8,%esp*/
+
+ movl expix1,%eax
+
+ ;// recuperation des deux premiers pixels dans mm0 et mm1
+/* movq (%eax,%esi,4), %mm0 /* b1-v1-r1-a1-b2-v2-r2-a2 */
+ movq %mm0, %mm1 /* b1-v1-r1-a1-b2-v2-r2-a2 */
+
+ ;// depackage du premier pixel
+ punpcklbw %mm7, %mm0 /* 00-b2-00-v2-00-r2-00-a2 */
+
+ movq %mm6, %mm5 /* ??-??-??-??-c4-c3-c2-c1 */
+ ;// depackage du 2ieme pixel
+ punpckhbw %mm7, %mm1 /* 00-b1-00-v1-00-r1-00-a1 */
+
+ ;// extraction des coefficients...
+ punpcklbw %mm5, %mm6 /* c4-c4-c3-c3-c2-c2-c1-c1 */
+ movq %mm6, %mm4 /* c4-c4-c3-c3-c2-c2-c1-c1 */
+ movq %mm6, %mm5 /* c4-c4-c3-c3-c2-c2-c1-c1 */
+
+ punpcklbw %mm5, %mm6 /* c2-c2-c2-c2-c1-c1-c1-c1 */
+ punpckhbw %mm5, %mm4 /* c4-c4-c4-c4-c3-c3-c3-c3 */
+
+ movq %mm6, %mm3 /* c2-c2-c2-c2-c1-c1-c1-c1 */
+ punpcklbw %mm7, %mm6 /* 00-c1-00-c1-00-c1-00-c1 */
+ punpckhbw %mm7, %mm3 /* 00-c2-00-c2-00-c2-00-c2 */
+
+ ;// multiplication des pixels par les coefficients
+ pmullw %mm6, %mm0 /* c1*b2-c1*v2-c1*r2-c1*a2 */
+ pmullw %mm3, %mm1 /* c2*b1-c2*v1-c2*r1-c2*a1 */
+ paddw %mm1, %mm0
+
+ ;// ...extraction des 2 derniers coefficients
+ movq %mm4, %mm5 /* c4-c4-c4-c4-c3-c3-c3-c3 */
+ punpcklbw %mm7, %mm4 /* 00-c3-00-c3-00-c3-00-c3 */
+ punpckhbw %mm7, %mm5 /* 00-c4-00-c4-00-c4-00-c4 */
+
+ /* ajouter la longueur de ligne a esi */
+ addl prevX,%esi
+
+ ;// recuperation des 2 derniers pixels
+/* movq (%eax,%esi,4), %mm1*/
+ movq %mm1, %mm2
+
+ ;// depackage des pixels
+ punpcklbw %mm7, %mm1
+ punpckhbw %mm7, %mm2
+
+ ;// multiplication pas les coeffs
+ pmullw %mm4, %mm1
+ pmullw %mm5, %mm2
+
+ ;// ajout des valeurs obtenues à la valeur finale
+ paddw %mm1, %mm0
+ paddw %mm2, %mm0
+
+ ;// division par 256 = 16+16+16+16, puis repackage du pixel final
+ psrlw $8, %mm0
+ packuswb %mm7, %mm0
+
+ ;// passage au suivant
+
+ ;// enregistrement du resultat
+ movl expix2,%eax
+/* movd %mm0,(%eax,%ecx,4)*/
+
+ decl %ecx
+ ;// test de fin du tantque
+ cmpl $0, %ecx ;// 400x300
+
+ jz .fin_while
+ jmp .while
+
+.fin_while:
+ emms
+
+ movl %ebp,%esp
+ popl %ebp
+
+ ret ;//The End
diff --git a/src/visualizations/Goom/goom2k4-0/src/flying_stars_fx.c b/src/visualizations/Goom/goom2k4-0/src/flying_stars_fx.c
new file mode 100644
index 0000000000..970ba9d48a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/flying_stars_fx.c
@@ -0,0 +1,316 @@
+#include "goom_fx.h"
+#include "goom_plugin_info.h"
+#include "goom_tools.h"
+
+#include "mathtools.h"
+
+/* TODO:-- FAIRE PROPREMENT... BOAH... */
+#define NCOL 15
+
+/*static const int colval[] = {
+0xfdf6f5,
+0xfae4e4,
+0xf7d1d1,
+0xf3b6b5,
+0xefa2a2,
+0xec9190,
+0xea8282,
+0xe87575,
+0xe46060,
+0xe14b4c,
+0xde3b3b,
+0xdc2d2f,
+0xd92726,
+0xd81619,
+0xd50c09,
+0
+};
+*/
+static const int colval[] = {
+ 0x1416181a,
+ 0x1419181a,
+ 0x141f181a,
+ 0x1426181a,
+ 0x142a181a,
+ 0x142f181a,
+ 0x1436181a,
+ 0x142f1819,
+ 0x14261615,
+ 0x13201411,
+ 0x111a100a,
+ 0x0c180508,
+ 0x08100304,
+ 0x00050101,
+ 0x0
+};
+
+
+/* The different modes of the visual FX.
+ * Put this values on fx_mode */
+#define FIREWORKS_FX 0
+#define RAIN_FX 1
+#define FOUNTAIN_FX 2
+#define LAST_FX 3
+
+typedef struct _FS_STAR {
+ float x,y;
+ float vx,vy;
+ float ax,ay;
+ float age,vage;
+} Star;
+
+typedef struct _FS_DATA{
+
+ int fx_mode;
+ int nbStars;
+
+ int maxStars;
+ Star *stars;
+
+ float min_age;
+ float max_age;
+
+ PluginParam min_age_p;
+ PluginParam max_age_p;
+ PluginParam nbStars_p;
+ PluginParam nbStars_limit_p;
+ PluginParam fx_mode_p;
+
+ PluginParameters params;
+} FSData;
+
+static void fs_init(VisualFX *_this, PluginInfo *info) {
+
+ FSData *data;
+ data = (FSData*)malloc(sizeof(FSData));
+
+ data->fx_mode = FIREWORKS_FX;
+ data->maxStars = 4096;
+ data->stars = (Star*)malloc(data->maxStars * sizeof(Star));
+ data->nbStars = 0;
+
+ data->max_age_p = secure_i_param ("Fireworks Smallest Bombs");
+ IVAL(data->max_age_p) = 80;
+ IMIN(data->max_age_p) = 0;
+ IMAX(data->max_age_p) = 100;
+ ISTEP(data->max_age_p) = 1;
+
+ data->min_age_p = secure_i_param ("Fireworks Largest Bombs");
+ IVAL(data->min_age_p) = 99;
+ IMIN(data->min_age_p) = 0;
+ IMAX(data->min_age_p) = 100;
+ ISTEP(data->min_age_p) = 1;
+
+ data->nbStars_limit_p = secure_i_param ("Max Number of Particules");
+ IVAL(data->nbStars_limit_p) = 512;
+ IMIN(data->nbStars_limit_p) = 0;
+ IMAX(data->nbStars_limit_p) = data->maxStars;
+ ISTEP(data->nbStars_limit_p) = 64;
+
+ data->fx_mode_p = secure_i_param ("FX Mode");
+ IVAL(data->fx_mode_p) = data->fx_mode;
+ IMIN(data->fx_mode_p) = 1;
+ IMAX(data->fx_mode_p) = 3;
+ ISTEP(data->fx_mode_p) = 1;
+
+ data->nbStars_p = secure_f_feedback ("Number of Particules (% of Max)");
+
+ data->params = plugin_parameters ("Particule System", 7);
+ data->params.params[0] = &data->fx_mode_p;
+ data->params.params[1] = &data->nbStars_limit_p;
+ data->params.params[2] = 0;
+ data->params.params[3] = &data->min_age_p;
+ data->params.params[4] = &data->max_age_p;
+ data->params.params[5] = 0;
+ data->params.params[6] = &data->nbStars_p;
+
+ _this->params = &data->params;
+ _this->fx_data = (void*)data;
+}
+
+static void fs_free(VisualFX *_this) {
+ FSData *data = (FSData*)_this->fx_data;
+ free (data->stars);
+ free (data->params.params);
+ free (data);
+}
+
+
+/**
+ * Cree une nouvelle 'bombe', c'est a dire une particule appartenant a une fusee d'artifice.
+ */
+static void addABomb (FSData *fs, int mx, int my, float radius, float vage, float gravity, PluginInfo *info) {
+
+ int i = fs->nbStars;
+ float ro;
+ int theta;
+
+ if (fs->nbStars >= fs->maxStars)
+ return;
+ fs->nbStars++;
+
+ fs->stars[i].x = mx;
+ fs->stars[i].y = my;
+
+ ro = radius * (float)goom_irand(info->gRandom,100) / 100.0f;
+ ro *= (float)goom_irand(info->gRandom,100)/100.0f + 1.0f;
+ theta = goom_irand(info->gRandom,256);
+
+ fs->stars[i].vx = ro * cos256[theta];
+ fs->stars[i].vy = -0.2f + ro * sin256[theta];
+
+ fs->stars[i].ax = 0;
+ fs->stars[i].ay = gravity;
+
+ fs->stars[i].age = 0;
+ if (vage < fs->min_age)
+ vage=fs->min_age;
+ fs->stars[i].vage = vage;
+}
+
+
+/**
+ * Met a jour la position et vitesse d'une particule.
+ */
+static void updateStar (Star *s) {
+ s->x+=s->vx;
+ s->y+=s->vy;
+ s->vx+=s->ax;
+ s->vy+=s->ay;
+ s->age+=s->vage;
+}
+
+
+/**
+ * Ajoute de nouvelles particules au moment d'un evenement sonore.
+ */
+static void fs_sound_event_occured(VisualFX *_this, PluginInfo *info) {
+
+ FSData *data = (FSData*)_this->fx_data;
+ int i;
+
+ int max = (int)((1.0f+info->sound.goomPower)*goom_irand(info->gRandom,150)) + 100;
+ float radius = (1.0f+info->sound.goomPower) * (float)(goom_irand(info->gRandom,150)+50)/300;
+ int mx;
+ int my;
+ float vage, gravity = 0.02f;
+
+ switch (data->fx_mode) {
+ case FIREWORKS_FX:
+ {
+ double dx,dy;
+ do {
+ mx = goom_irand(info->gRandom,info->screen.width);
+ my = goom_irand(info->gRandom,info->screen.height);
+ dx = (mx - info->screen.width/2);
+ dy = (my - info->screen.height/2);
+ } while (dx*dx + dy*dy < (info->screen.height/2)*(info->screen.height/2));
+ vage = data->max_age * (1.0f - info->sound.goomPower);
+ }
+ break;
+ case RAIN_FX:
+ mx = goom_irand(info->gRandom,info->screen.width);
+ if (mx > info->screen.width/2)
+ mx = info->screen.width;
+ else
+ mx = 0;
+ my = -(info->screen.height/3)-goom_irand(info->gRandom,info->screen.width/3);
+ radius *= 1.5;
+ vage = 0.002f;
+ break;
+ case FOUNTAIN_FX:
+ my = info->screen.height+2;
+ vage = 0.001f;
+ radius += 1.0f;
+ mx = info->screen.width / 2;
+ gravity = 0.04f;
+ break;
+ default:
+ return;
+ /* my = i R A N D (info->screen.height); vage = 0.01f; */
+ }
+
+ radius *= info->screen.height / 200.0f; /* why 200 ? because the FX was developped on 320x200 */
+ max *= info->screen.height / 200.0f;
+
+ if (info->sound.timeSinceLastBigGoom < 1) {
+ radius *= 1.5;
+ max *= 2;
+ }
+ for (i=0;i<max;++i)
+ addABomb (data,mx,my,radius,vage,gravity,info);
+}
+
+
+/**
+ * Main methode of the FX.
+ */
+static void fs_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) {
+
+ int i;
+ int col;
+ FSData *data = (FSData*)_this->fx_data;
+
+ /* Get the new parameters values */
+ data->min_age = 1.0f - (float)IVAL(data->min_age_p)/100.0f;
+ data->max_age = 1.0f - (float)IVAL(data->max_age_p)/100.0f;
+ FVAL(data->nbStars_p) = (float)data->nbStars / (float)data->maxStars;
+ data->nbStars_p.change_listener(&data->nbStars_p);
+ data->maxStars = IVAL(data->nbStars_limit_p);
+ data->fx_mode = IVAL(data->fx_mode_p);
+
+ /* look for events */
+ if (info->sound.timeSinceLastGoom < 1) {
+ fs_sound_event_occured(_this, info);
+ if (goom_irand(info->gRandom,20)==1) {
+ IVAL(data->fx_mode_p) = goom_irand(info->gRandom,(LAST_FX*3));
+ data->fx_mode_p.change_listener(&data->fx_mode_p);
+ }
+ }
+
+ /* update particules */
+ for (i=0;i<data->nbStars;++i) {
+ updateStar(&data->stars[i]);
+
+ /* dead particule */
+ if (data->stars[i].age>=NCOL)
+ continue;
+
+ /* choose the color of the particule */
+ col = colval[(int)data->stars[i].age];
+
+ /* draws the particule */
+ info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y,
+ (int)(data->stars[i].x-data->stars[i].vx*6),
+ (int)(data->stars[i].y-data->stars[i].vy*6),
+ col,
+ (int)info->screen.width, (int)info->screen.height);
+ info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y,
+ (int)(data->stars[i].x-data->stars[i].vx*2),
+ (int)(data->stars[i].y-data->stars[i].vy*2),
+ col,
+ (int)info->screen.width, (int)info->screen.height);
+ }
+
+ /* look for dead particules */
+ for (i=0;i<data->nbStars;) {
+
+ if ((data->stars[i].x > info->screen.width + 64)
+ ||((data->stars[i].vy>=0)&&(data->stars[i].y - 16*data->stars[i].vy > info->screen.height))
+ ||(data->stars[i].x < -64)
+ ||(data->stars[i].age>=NCOL)) {
+ data->stars[i] = data->stars[data->nbStars-1];
+ data->nbStars--;
+ }
+ else ++i;
+ }
+}
+
+VisualFX flying_star_create(void) {
+ VisualFX vfx;
+ vfx.init = fs_init;
+ vfx.free = fs_free;
+ vfx.apply = fs_apply;
+ vfx.fx_data = 0;
+ return vfx;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/gfontlib.c b/src/visualizations/Goom/goom2k4-0/src/gfontlib.c
new file mode 100644
index 0000000000..596981db44
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/gfontlib.c
@@ -0,0 +1,231 @@
+#include "goom_config.h"
+#include "gfontrle.h"
+#include "gfontlib.h"
+#include <string.h>
+#include <stdlib.h>
+
+static Pixel ***font_chars;
+static int *font_width;
+static int *font_height;
+static Pixel ***small_font_chars;
+static int *small_font_width;
+static int *small_font_height;
+
+void gfont_load (void) {
+ unsigned char *gfont;
+ unsigned int i = 0, j = 0;
+ unsigned int nba = 0;
+ unsigned int current = 32;
+ int *font_pos;
+ /* decompress le rle */
+
+
+
+ gfont = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel);
+ while (i<the_font.rle_size) {
+ unsigned char c = the_font.rle_pixel [i++];
+ if (c == 0) {
+ unsigned int nb = the_font.rle_pixel [i++];
+ while (nb--)
+ gfont[j++] = 0;
+ }
+ else
+ gfont [j++] = c;
+ }
+
+ /* determiner les positions de chaque lettre. */
+
+ font_height = calloc (256,sizeof(int));
+ small_font_height = calloc (256,sizeof(int));
+ font_width = calloc (256,sizeof(int));
+ small_font_width = calloc (256,sizeof(int));
+ font_chars = calloc (256,sizeof(int**));
+ small_font_chars = calloc (256,sizeof(int**));
+ font_pos = calloc (256,sizeof(int));
+
+ for (i=0;i<the_font.width;i++) {
+ unsigned char a = gfont [i*4 + 3];
+ if (a)
+ nba ++;
+ else
+ nba = 0;
+ if (nba == 2) {
+ font_width [current] = i - font_pos [current];
+ small_font_width [current] = font_width [current]/2;
+ font_pos [++current] = i;
+ font_height [current] = the_font.height - 2;
+ small_font_height [current] = font_height [current]/2;
+ }
+ }
+ font_pos [current] = 0;
+ font_height [current] = 0;
+ small_font_height [current] = 0;
+
+ /* charger les lettres et convertir au format de la machine */
+
+ for (i=33;i<current;i++) {
+ int x; int y;
+ font_chars [i] = malloc (font_height[i]*sizeof(int *));
+ small_font_chars [i] = malloc (font_height[i]*sizeof(int *)/2);
+ for (y = 0; y < font_height[i]; y++) {
+ font_chars [i][y] = malloc (font_width[i]*sizeof(int));
+ for (x = 0; x < font_width[i]; x++) {
+ unsigned int r,g,b,a;
+ r = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4)];
+ g = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+1)];
+ b = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+2)];
+ a = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+3)];
+ font_chars [i][y][x].val =
+ (r<<(ROUGE*8))|(g<<(VERT*8))|(b<<(BLEU*8))|(a<<(ALPHA*8));
+ }
+ }
+ for (y = 0; y < font_height[i]/2; y++) {
+ small_font_chars [i][y] = malloc (font_width[i]*sizeof(int)/2);
+ for (x = 0; x < font_width[i]/2; x++) {
+ unsigned int r1,g1,b1,a1,r2,g2,b2,a2,r3,g3,b3,a3,r4,g4,b4,a4;
+ r1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4)];
+ g1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+1)];
+ b1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+2)];
+ a1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+3)];
+ r2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+4)];
+ g2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+5)];
+ b2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+6)];
+ a2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+7)];
+ r3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4)];
+ g3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+1)];
+ b3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+2)];
+ a3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+3)];
+ r4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+4)];
+ g4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+5)];
+ b4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+6)];
+ a4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+7)];
+ small_font_chars [i][y][x].val =
+ (((r1 + r2 + r3 + r4)>>2)<<(ROUGE*8))|
+ (((g1 + g2 + g3 + g4)>>2)<<(VERT*8))|
+ (((b1 + b2 + b3 + b4)>>2)<<(BLEU*8))|
+ (((a1 + a2 + a3 + a4)>>2)<<(ALPHA*8));
+ }
+ }
+ }
+
+ /* definir les lettres restantes */
+
+ for (i=0;i<256;i++) {
+ if (font_chars[i]==0) {
+ font_chars[i]=font_chars[42];
+ small_font_chars[i]=small_font_chars[42];
+ font_width[i]=font_width[42];
+ font_pos[i]=font_pos[42];
+ font_height[i]=font_height[42];
+ small_font_width[i]=small_font_width[42];
+ small_font_height[i]=small_font_height[42];
+ }
+ }
+
+ font_width [32] = (the_font.height / 2) - 1;
+ small_font_width [32] = font_width [32]/2;
+ font_chars [32] = 0;
+ small_font_chars [32] = 0;
+ free( gfont );
+ free( font_pos );
+}
+
+void goom_draw_text (Pixel * buf,int resolx,int resoly,
+ int x, int y,
+ const char *str, float charspace, int center) {
+ float fx = (float) x;
+ int fin = 0;
+
+ Pixel ***cur_font_chars;
+ int *cur_font_width;
+ int *cur_font_height;
+
+ if (resolx>320)
+ {
+ /* printf("use big\n"); */
+ cur_font_chars = font_chars;
+ cur_font_width = font_width;
+ cur_font_height = font_height;
+ }
+ else
+ {
+ /* printf ("use small\n"); */
+ cur_font_chars = small_font_chars;
+ cur_font_width = small_font_width;
+ cur_font_height = small_font_height;
+ }
+
+ if (cur_font_chars == NULL)
+ return ;
+
+ if (center) {
+ unsigned char *tmp = (unsigned char*)str;
+ float lg = -charspace;
+
+ while (*tmp != '\0')
+ lg += cur_font_width[*(tmp++)] + charspace;
+
+ fx -= lg / 2;
+ }
+
+ while (!fin) {
+ unsigned char c = *str;
+
+ x = (int) fx;
+
+ if (c == '\0')
+ fin = 1;
+ else if (cur_font_chars[c]==0) {
+ fx += cur_font_width[c] + charspace;
+ }
+ else {
+ int xx, yy;
+ int xmin = x;
+ int xmax = x + cur_font_width[c];
+ int ymin = y - cur_font_height[c];
+ int ymax = y;
+
+ yy = ymin;
+
+ if (xmin < 0)
+ xmin = 0;
+
+ if (xmin >= resolx - 1)
+ return;
+
+ if (xmax >= (int) resolx)
+ xmax = resolx - 1;
+
+ if (yy < 0)
+ yy = 0;
+
+ if (yy <= (int) resoly - 1) {
+ if (ymax >= (int) resoly - 1)
+ ymax = resoly - 1;
+
+ for (; yy < ymax; yy++)
+ for (xx = xmin; xx < xmax; xx++)
+ {
+ Pixel color = cur_font_chars[c][yy - ymin][xx - x];
+ Pixel transparency;
+ transparency.val = color.val & A_CHANNEL;
+ if (transparency.val)
+ {
+ if (transparency.val==A_CHANNEL) buf[yy * resolx + xx] = color;
+ else
+ {
+ Pixel back = buf[yy * resolx + xx];
+ unsigned int a1 = color.channels.a;
+ unsigned int a2 = 255 - a1;
+ buf[yy * resolx + xx].channels.r = (unsigned char)((((unsigned int)color.channels.r * a1) + ((unsigned int)back.channels.r * a2)) >> 8);
+ buf[yy * resolx + xx].channels.g = (unsigned char)((((unsigned int)color.channels.g * a1) + ((unsigned int)back.channels.g * a2)) >> 8);
+ buf[yy * resolx + xx].channels.b = (unsigned char)((((unsigned int)color.channels.b * a1) + ((unsigned int)back.channels.b * a2)) >> 8);
+ }
+ }
+ }
+ }
+ fx += cur_font_width[c] + charspace;
+ }
+ str++;
+ }
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/gfontlib.h b/src/visualizations/Goom/goom2k4-0/src/gfontlib.h
new file mode 100644
index 0000000000..0520b7da9f
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/gfontlib.h
@@ -0,0 +1,10 @@
+#ifndef _GFONTLIB_H
+#define _GFONTLIB_H
+
+#include "goom_graphic.h"
+
+void gfont_load (void);
+void goom_draw_text (Pixel * buf,int resolx,int resoly, int x, int y,
+ const char *str, float chspace, int center);
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/gfontrle.c b/src/visualizations/Goom/goom2k4-0/src/gfontrle.c
new file mode 100644
index 0000000000..8a4b32cd0f
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/gfontrle.c
@@ -0,0 +1,2500 @@
+/* RGBA C-Source image dump (with zRLE compression) */
+
+const struct {
+ unsigned int width;
+ unsigned int height;
+ unsigned int bytes_per_pixel;
+ unsigned int rle_size;
+ unsigned char rle_pixel [49725];
+} the_font = {
+1277, 21, 4, 49725, {
+121,17,164,255,121,17,164,255,121,17,164,255,121,17,164,255,0,8,121,17,
+164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,
+0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,
+1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,
+121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,
+17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,
+164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,
+255,121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255,
+121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255,121,
+17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164,255,121,17,
+164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,
+255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,
+121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,
+17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,
+164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,
+255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,
+0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,
+44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,
+121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,
+17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,
+164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,
+0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,
+1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,
+121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,
+17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,
+164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,
+255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,
+121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,
+17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,
+164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,
+255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,
+121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,
+17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,
+164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,
+255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,
+0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,
+36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,
+121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,
+17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,
+164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,
+0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,
+1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,
+121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,
+17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,
+164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,
+255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,
+121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,
+17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,
+164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,
+255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,
+121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,
+17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,
+164,255,0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,
+255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,
+0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,
+44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20,
+121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,
+17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20,121,17,
+164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,
+0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,
+1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,
+121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,
+17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,
+164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,
+255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,
+121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,
+17,164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,
+164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,
+255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,
+121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,
+17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,
+164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,
+255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,
+0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,
+44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,
+121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,
+17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,
+164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,
+0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,
+1,121,17,164,255,121,17,164,255,121,17,164,255,0,28,121,17,164,0,1,
+121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,
+17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,
+164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164,
+255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,
+121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,
+17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,
+164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,
+255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,
+121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121,
+17,164,255,121,17,164,255,121,17,164,255,0,56,121,17,164,0,1,121,17,
+164,255,121,17,164,255,13,4,17,0,1,13,4,17,0,1,13,4,17,0,
+1,16,5,22,0,13,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,25,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,33,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,
+49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,33,16,5,22,0,
+1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,
+1,16,5,22,0,33,16,5,22,0,1,14,4,19,0,1,13,4,17,0,
+1,13,4,17,0,1,16,5,22,0,61,16,5,22,0,1,14,4,19,0,
+255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,
+255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,
+25,8,6,3,57,10,8,5,85,9,7,4,76,0,12,8,6,3,54,9,
+8,4,96,9,7,4,85,0,12,8,6,3,57,9,8,4,96,9,7,4,
+85,0,24,8,6,3,57,11,8,4,85,9,7,4,79,0,12,8,6,3,
+51,10,8,5,85,8,6,3,85,0,40,8,6,3,57,11,8,4,85,8,
+6,3,85,0,32,8,6,3,57,10,8,5,85,9,7,4,85,0,28,5,
+4,2,14,8,6,3,85,9,7,4,85,0,24,8,6,3,74,9,7,4,
+113,8,6,3,167,8,6,3,139,9,7,4,85,5,4,2,14,0,36,8,
+6,3,57,9,8,4,110,9,7,4,85,0,24,5,4,2,20,9,7,4,
+85,9,8,4,85,0,16,9,8,4,57,9,8,4,85,6,5,3,48,0,
+255,0,29,5,4,2,17,8,6,3,85,9,7,4,82,0,20,5,4,2,
+3,8,6,3,85,9,7,4,93,8,6,3,153,8,6,3,161,8,6,3,
+110,9,8,4,85,8,6,3,85,6,5,3,31,0,32,5,4,2,3,8,
+6,3,85,10,8,5,85,10,7,5,85,0,36,5,4,2,57,8,6,3,
+85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,
+108,8,6,3,85,6,5,3,71,0,24,5,4,2,42,8,6,3,85,9,
+7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,108,8,
+6,3,85,6,5,3,71,0,48,5,4,2,3,8,6,3,85,9,8,4,
+85,9,7,4,74,0,16,8,6,3,42,9,7,4,85,8,6,3,85,9,
+7,4,85,8,6,3,125,8,6,3,170,7,6,4,170,9,7,4,170,12,
+9,7,170,19,14,10,170,19,13,10,142,8,6,5,28,0,16,5,4,2,
+51,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,
+164,8,6,3,108,8,6,3,85,6,5,3,71,0,20,10,8,5,57,9,
+7,4,170,8,6,3,170,8,6,3,170,8,6,3,161,8,6,3,142,9,
+7,4,96,9,7,4,85,8,6,3,85,9,7,4,85,9,7,4,74,0,
+20,5,4,2,42,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3,
+170,8,6,3,164,8,6,3,108,8,6,3,85,6,5,3,76,0,24,8,
+6,5,82,10,8,7,133,12,9,7,170,15,11,8,170,15,11,8,170,15,
+11,8,170,13,10,8,170,10,8,7,161,10,8,7,85,6,5,5,28,0,
+96,8,6,3,74,9,8,4,85,8,6,3,57,0,68,7,6,4,28,9,
+7,4,85,9,7,4,85,5,4,2,17,0,40,5,4,2,42,8,6,3,
+85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,
+108,8,6,3,85,6,5,3,85,0,24,8,6,5,85,10,8,7,133,12,
+9,7,170,15,10,8,170,15,11,8,170,15,11,8,170,13,10,8,170,10,
+8,7,150,8,6,5,62,0,24,8,6,5,82,10,8,7,133,12,9,7,
+170,15,10,8,170,14,10,7,170,9,7,4,170,8,6,5,147,10,8,5,
+85,7,6,4,85,5,4,4,3,0,16,12,9,7,57,11,8,6,161,9,
+7,6,170,10,8,7,170,13,10,8,170,14,10,7,170,13,10,8,170,12,
+9,7,170,10,8,7,156,10,8,7,85,6,5,5,25,0,20,6,5,3,
+57,8,7,5,85,9,7,4,110,9,7,4,170,10,8,5,170,10,8,5,
+170,11,8,6,170,10,8,7,150,10,8,7,85,6,5,5,25,0,16,15,
+11,8,57,11,8,6,170,9,7,6,170,10,8,7,170,13,10,8,170,15,
+11,8,170,15,11,8,170,13,10,8,170,10,8,7,159,10,8,7,85,6,
+5,5,25,0,16,15,11,8,59,11,9,6,170,9,7,4,125,10,8,5,
+85,8,6,3,133,8,6,3,167,8,6,3,170,8,6,3,170,9,8,4,
+113,0,16,8,6,3,42,10,8,5,85,10,7,5,85,9,7,4,125,10,
+8,5,170,12,10,7,170,14,11,7,170,19,14,10,170,19,14,10,142,8,
+6,5,28,0,16,8,6,5,82,10,8,7,133,12,9,7,170,15,11,8,
+170,15,11,8,170,15,11,8,170,13,10,8,170,10,8,7,161,10,8,7,
+85,6,5,5,25,0,16,12,10,7,74,14,10,7,170,12,9,7,139,7,
+6,4,28,0,16,10,8,7,110,14,10,7,170,13,10,8,125,0,16,13,
+10,8,71,15,11,8,170,13,10,8,130,5,5,4,8,0,44,11,8,6,
+85,9,7,4,170,10,8,5,93,0,16,12,9,7,57,10,8,5,167,11,
+8,6,110,6,5,3,8,0,16,11,8,6,57,10,7,5,159,11,8,6,
+102,0,16,8,6,3,51,10,8,5,85,9,7,4,85,0,40,10,7,5,
+57,11,9,6,85,7,6,4,57,0,28,7,5,4,28,10,8,5,85,11,
+8,6,85,0,16,8,6,3,48,10,8,5,85,8,6,3,85,0,20,8,
+6,3,57,11,8,4,85,9,7,4,79,0,20,5,4,2,45,8,6,3,
+85,9,7,4,85,9,7,4,88,9,7,4,108,9,8,4,93,9,7,4,
+85,8,6,3,85,6,5,3,74,0,20,8,6,3,45,9,7,4,85,8,
+6,3,85,9,7,4,85,8,6,3,125,8,6,3,170,8,6,3,164,8,
+6,3,108,8,6,3,85,6,5,3,74,0,24,6,5,3,57,8,7,5,
+85,10,8,5,85,9,7,4,119,8,6,3,142,9,7,4,130,10,8,5,
+91,10,7,5,85,6,5,3,85,0,20,9,7,4,57,10,8,5,85,10,
+7,5,85,10,8,5,85,8,6,3,144,8,6,3,170,8,6,3,164,8,
+6,3,108,8,6,3,85,6,5,3,71,0,24,5,4,2,45,8,6,3,
+85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,9,7,4,
+105,8,6,3,85,6,5,3,74,0,20,11,8,4,59,9,7,4,170,8,
+6,3,164,9,7,4,91,8,6,3,85,8,6,3,85,8,6,3,85,9,
+7,4,85,8,6,3,142,9,6,4,170,9,8,4,116,0,16,8,6,3,
+48,10,8,5,85,9,7,4,85,0,20,8,6,3,57,11,8,4,85,9,
+7,4,76,0,16,8,6,3,48,10,8,5,85,9,7,4,85,0,20,8,
+6,3,57,11,8,4,85,9,7,4,76,0,16,8,6,3,48,10,8,5,
+85,9,7,4,85,0,28,8,6,3,57,11,8,4,85,9,7,4,76,0,
+16,8,6,3,54,9,8,4,96,9,7,4,85,0,20,8,6,3,57,9,
+8,4,96,9,7,4,85,0,16,10,8,5,57,10,7,5,153,10,8,5,
+93,0,20,10,8,7,93,14,11,7,170,13,10,8,136,0,16,11,8,6,
+91,11,8,6,170,9,7,4,170,9,7,4,170,8,6,5,170,8,6,3,
+119,9,7,4,85,8,6,3,85,8,6,3,85,9,7,4,85,9,7,4,
+76,0,16,8,6,3,42,9,7,4,85,8,6,3,85,8,6,3,122,9,
+8,4,102,0,16,8,6,3,51,9,7,4,85,6,5,3,45,0,40,12,
+8,5,57,8,6,3,156,10,7,5,93,11,8,6,85,11,8,6,85,0,
+28,6,5,5,14,13,10,8,85,8,7,5,45,0,80,10,8,5,57,10,
+7,5,156,10,8,5,96,0,76,9,7,4,57,10,8,5,93,10,8,5,
+85,0,140,10,8,7,110,13,10,8,170,12,9,7,133,5,5,4,6,0,
+84,8,6,5,79,10,8,7,127,13,10,8,170,16,12,9,142,8,7,5,
+28,0,72,8,6,3,57,10,8,5,85,9,6,4,85,0,48,15,11,8,
+113,25,18,12,170,20,15,11,142,8,7,5,28,0,28,15,11,8,130,22,
+16,11,170,20,15,11,142,7,6,6,23,0,12,13,10,8,68,12,9,7,
+170,11,8,6,116,6,5,3,8,0,44,12,9,7,82,15,10,8,170,13,
+10,8,130,5,5,4,8,0,255,0,197,6,5,3,57,8,6,3,85,0,
+255,0,149,5,4,2,6,8,6,3,85,8,6,3,156,9,8,4,113,0,
+16,8,6,3,48,9,8,4,91,9,7,4,76,0,16,10,8,5,57,9,
+6,4,170,8,6,3,99,5,4,2,34,0,36,8,6,3,71,9,8,4,
+93,9,8,4,96,8,6,3,85,6,5,3,45,0,12,8,6,3,76,0,
+44,8,6,3,57,58,31,9,255,93,50,12,255,88,45,11,255,12,10,5,
+113,0,4,7,6,4,28,54,29,9,255,93,46,12,255,88,45,11,255,12,
+9,5,122,0,4,7,5,4,37,54,29,9,255,93,46,12,255,88,45,11,
+255,14,10,5,142,0,16,8,6,3,85,58,31,9,255,93,50,12,255,88,
+44,11,255,9,7,4,170,0,4,5,4,2,85,52,28,9,255,93,48,12,
+255,88,44,11,255,12,10,5,170,0,32,7,6,4,85,58,31,9,255,93,
+50,12,255,88,45,11,255,12,9,5,170,0,24,8,6,3,57,58,31,9,
+255,93,50,12,255,88,45,11,255,14,10,5,142,0,20,6,5,3,28,19,
+12,6,227,76,37,11,255,88,45,11,255,14,10,5,139,0,16,9,8,4,
+170,69,35,10,255,92,47,11,255,92,47,11,255,88,45,11,255,88,45,11,
+255,16,11,5,227,7,5,4,28,0,28,8,6,3,57,58,31,9,255,93,
+46,12,255,88,45,11,255,14,10,5,142,0,16,6,5,3,28,19,12,6,
+227,82,39,11,255,92,47,11,255,14,10,5,105,0,8,7,5,4,20,54,
+29,9,255,100,50,13,255,30,19,7,255,8,6,3,85,0,255,0,21,6,
+5,3,28,19,12,6,227,76,37,11,255,88,45,11,255,14,10,5,130,0,
+12,7,6,4,65,17,11,6,227,71,37,10,255,88,45,11,255,92,47,11,
+255,92,47,11,255,88,45,11,255,88,44,11,255,88,44,11,255,25,16,6,
+255,8,6,3,142,0,24,7,5,4,85,17,12,6,229,77,39,12,255,107,
+51,14,255,113,55,16,255,20,14,9,178,0,28,14,11,7,170,29,18,8,
+255,74,39,11,255,88,45,11,255,88,45,11,255,92,47,11,255,92,47,11,
+255,88,45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,5,4,
+23,0,12,9,7,4,170,26,17,6,255,74,39,11,255,88,45,11,255,88,
+45,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88,44,11,255,41,
+24,8,255,12,9,5,227,6,5,3,28,0,36,6,5,3,85,16,11,5,
+227,71,37,10,255,88,45,11,255,88,44,11,255,12,10,5,113,0,8,8,
+6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,88,45,11,255,92,
+46,13,255,100,52,13,255,109,53,16,255,121,63,20,255,158,74,23,255,180,
+88,27,255,183,90,28,255,26,17,11,142,0,12,10,7,5,170,26,17,6,
+255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11,255,92,47,11,
+255,88,45,11,255,88,45,11,255,41,24,8,255,12,9,5,227,6,5,3,
+28,0,8,7,6,4,8,61,32,10,255,102,51,13,255,92,46,13,255,92,
+46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,90,45,11,255,84,
+44,11,255,88,45,11,255,88,44,11,255,14,10,5,119,0,12,9,7,4,
+153,26,17,6,255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11,
+255,92,47,11,255,88,45,11,255,88,44,11,255,45,25,8,255,13,10,6,
+227,7,6,4,28,0,12,17,13,10,170,64,39,21,255,155,78,26,255,169,
+83,26,255,165,80,24,255,161,79,24,255,145,71,22,255,136,70,21,255,134,
+69,21,255,88,50,23,255,22,17,11,232,9,8,6,31,0,84,4,4,3,
+23,12,9,5,173,71,34,10,255,92,43,13,255,33,20,8,255,10,8,5,
+57,0,64,20,14,7,227,83,42,12,255,92,46,13,255,19,13,6,227,6,
+5,3,34,0,32,10,8,5,170,26,17,6,255,76,37,11,255,90,46,11,
+255,92,46,13,255,92,46,13,255,90,45,11,255,90,45,11,255,88,44,11,
+255,46,26,9,255,18,13,9,227,8,7,5,28,0,12,15,12,8,170,58,
+35,19,255,134,73,23,255,153,76,24,255,142,69,21,255,131,64,20,255,121,
+59,18,255,121,59,18,255,121,62,18,255,43,27,12,255,11,9,6,170,0,
+16,17,13,10,170,64,39,21,255,164,85,27,255,177,86,26,255,154,75,23,
+255,121,62,18,255,115,56,16,255,119,61,18,255,123,61,20,255,80,45,19,
+255,22,16,11,227,8,7,5,28,0,8,13,10,8,57,96,48,19,255,165,
+80,24,255,159,78,24,255,159,78,24,255,165,80,24,255,165,80,24,255,165,
+80,24,255,159,78,24,255,164,81,25,255,91,52,24,255,22,17,11,227,8,
+7,5,28,0,12,13,10,8,170,38,24,11,255,99,47,16,255,116,59,17,
+255,126,65,21,255,142,69,21,255,153,76,24,255,157,74,24,255,155,76,24,
+255,91,52,24,255,23,18,12,227,8,7,5,28,0,8,13,10,8,57,104,
+52,21,255,171,84,26,255,155,76,24,255,164,81,25,255,173,81,26,255,180,
+88,27,255,180,88,27,255,177,86,26,255,169,80,26,255,92,55,25,255,22,
+17,11,227,8,7,5,28,0,8,13,10,8,57,114,63,25,255,177,86,26,
+255,114,56,17,255,92,46,13,255,92,47,11,255,93,46,12,255,92,46,13,
+255,96,48,13,255,92,46,13,255,18,12,5,91,0,8,8,6,3,40,55,
+29,10,255,108,50,15,255,114,56,17,255,130,67,21,255,153,76,24,255,161,
+82,24,255,171,84,26,255,179,84,26,255,179,84,26,255,25,17,10,142,0,
+12,15,12,8,170,64,39,21,255,162,84,27,255,179,88,28,255,183,90,28,
+255,181,89,28,255,181,89,28,255,172,88,27,255,156,77,25,255,88,50,23,
+255,22,17,11,227,8,7,5,28,0,8,13,9,6,57,96,48,19,255,153,
+71,22,255,134,69,21,255,20,14,9,193,0,12,11,8,6,113,124,62,25,
+255,185,91,28,255,169,80,26,255,22,15,9,142,0,8,11,8,6,57,111,
+61,24,255,184,90,27,255,177,86,26,255,23,16,10,173,0,40,11,8,6,
+113,114,59,23,255,144,73,21,255,126,63,21,255,20,14,9,142,0,8,11,
+9,6,57,97,51,20,255,152,71,23,255,134,69,21,255,20,14,9,187,0,
+12,12,9,7,96,97,48,18,255,140,71,21,255,138,71,21,255,20,15,9,
+142,0,8,8,6,3,40,52,28,9,255,93,50,12,255,88,45,11,255,14,
+10,5,142,0,32,13,10,8,82,91,48,16,255,132,71,21,255,63,36,18,
+255,10,8,7,136,0,20,7,6,6,62,31,21,12,244,124,66,23,255,134,
+69,21,255,20,15,9,142,0,8,8,6,3,28,54,29,9,255,93,46,12,
+255,80,39,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,
+50,12,255,88,44,11,255,14,10,5,116,0,12,9,7,4,153,26,17,6,
+255,74,39,11,255,88,45,11,255,88,45,11,255,88,45,11,255,88,45,11,
+255,88,44,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,4,4,
+17,0,8,8,6,3,34,54,29,9,255,92,43,11,255,88,44,11,255,88,
+45,11,255,92,43,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88,
+44,11,255,45,25,8,255,12,10,5,227,6,5,3,28,0,12,13,10,6,
+170,40,24,11,255,97,48,16,255,113,55,16,255,115,56,16,255,116,57,17,
+255,116,57,17,255,113,55,16,255,113,55,16,255,60,33,13,255,18,14,9,
+227,8,6,5,28,0,8,12,9,7,57,77,38,14,255,118,57,17,255,116,
+59,17,255,118,60,17,255,109,53,16,255,98,47,13,255,92,47,11,255,88,
+45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,6,5,3,28,0,
+12,10,8,5,170,28,18,7,255,76,37,11,255,90,45,11,255,92,46,13,
+255,94,45,13,255,94,45,13,255,92,46,13,255,92,46,13,255,46,26,9,
+255,13,10,6,227,6,5,5,28,0,8,7,6,4,8,61,32,10,255,100,
+50,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92,
+46,13,255,92,46,13,255,94,47,13,255,98,49,13,255,94,47,13,255,18,
+12,5,93,0,8,8,6,3,42,60,32,9,255,96,48,13,255,88,45,11,
+255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,50,12,255,88,
+44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9,255,93,50,12,
+255,88,44,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,
+50,12,255,88,44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9,
+255,93,50,12,255,88,44,11,255,14,10,5,142,0,20,8,6,3,57,58,
+31,9,255,93,50,12,255,88,44,11,255,12,10,5,113,0,8,7,6,4,
+28,54,29,9,255,93,50,12,255,88,45,11,255,14,10,5,142,0,12,8,
+7,3,57,60,31,9,255,96,48,13,255,92,46,13,255,14,10,5,127,0,
+8,10,8,5,57,82,42,15,255,135,66,20,255,121,60,20,255,20,15,9,
+176,0,12,11,9,6,108,107,56,22,255,172,84,25,255,158,74,23,255,22,
+15,9,142,0,8,11,8,6,54,98,51,19,255,142,72,21,255,136,70,21,
+255,138,71,21,255,121,59,18,255,100,52,13,255,90,46,11,255,88,44,11,
+255,88,44,11,255,88,44,11,255,88,45,11,255,12,10,5,113,0,8,8,
+6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,92,47,11,255,92,
+47,11,255,18,12,5,85,0,8,7,6,4,45,54,30,9,255,94,47,13,
+255,31,20,8,255,9,7,4,85,0,32,8,6,3,48,65,33,10,255,114,
+55,15,255,119,58,18,255,126,63,21,255,128,66,21,255,22,15,9,164,0,
+20,5,5,4,28,19,14,10,227,141,72,26,255,43,27,16,255,7,6,6,
+85,0,72,14,10,7,71,96,49,17,255,138,71,21,255,130,67,21,255,22,
+15,9,164,0,68,12,9,7,76,77,39,14,255,118,57,17,255,109,53,16,
+255,22,15,9,153,0,132,11,8,6,96,103,53,20,255,144,73,21,255,121,
+60,20,255,24,16,9,153,0,80,15,12,8,184,61,36,20,255,141,68,24,
+255,168,82,25,255,171,84,26,255,26,18,11,159,0,68,9,7,4,57,60,
+32,9,255,96,48,13,255,92,46,13,255,19,12,6,142,0,40,14,10,7,
+76,129,67,26,255,190,97,29,255,180,88,27,255,26,17,11,161,0,24,14,
+10,7,85,129,67,26,255,190,97,29,255,180,88,27,255,25,17,10,125,0,
+8,11,8,6,57,109,60,24,255,175,86,26,255,142,73,23,255,20,14,9,
+187,0,40,12,9,7,93,121,65,24,255,183,89,26,255,168,82,25,255,21,
+15,10,178,0,255,0,193,10,8,5,170,39,23,8,255,78,41,11,255,16,
+11,5,142,0,255,0,141,6,5,3,85,16,11,5,227,71,37,10,255,92,
+47,11,255,92,47,11,255,18,12,5,85,0,8,8,6,3,28,54,29,9,
+255,93,46,12,255,88,45,11,255,12,10,5,113,0,12,58,31,9,255,93,
+50,12,255,88,45,11,255,25,17,6,255,8,6,3,142,0,24,4,4,3,
+25,10,8,5,173,65,33,10,255,92,46,13,255,92,46,13,255,67,34,10,
+255,27,18,8,255,9,7,4,156,3,3,2,85,10,8,5,184,69,35,10,
+255,19,13,6,147,0,40,9,7,4,113,112,55,13,255,141,69,16,255,141,
+75,16,255,18,13,5,170,0,4,8,6,3,85,110,54,13,255,143,76,16,
+255,139,68,16,255,19,13,6,170,0,4,8,6,3,85,110,54,13,255,143,
+76,16,255,141,72,16,255,23,15,6,170,0,12,10,9,5,110,35,21,8,
+255,129,63,14,255,141,69,16,255,139,68,16,255,52,27,9,255,9,7,4,
+255,27,17,8,255,135,66,16,255,154,75,17,255,155,79,18,255,91,50,16,
+255,20,15,9,207,10,9,7,28,0,16,5,4,4,20,8,6,3,127,31,
+20,8,255,130,66,15,255,143,76,16,255,143,76,16,255,67,34,10,255,10,
+8,5,215,10,8,5,170,13,10,6,142,7,5,4,23,0,8,12,9,5,
+85,115,59,14,255,149,72,16,255,143,76,16,255,18,12,5,235,0,16,7,
+6,4,28,14,10,5,227,92,46,13,255,143,73,16,255,143,70,16,255,18,
+13,5,170,0,12,14,10,5,170,53,28,10,255,114,56,13,255,56,29,9,
+255,16,11,5,255,34,20,7,255,112,55,13,255,87,42,12,255,19,13,6,
+235,8,7,5,40,0,24,10,8,5,85,114,56,13,255,143,70,16,255,141,
+72,16,255,23,15,6,170,0,12,7,6,4,28,14,10,5,227,90,44,13,
+255,112,57,13,255,47,26,8,255,11,8,4,57,0,12,25,16,6,227,96,
+48,13,255,112,57,13,255,26,16,7,255,8,6,5,85,0,24,13,10,6,
+85,8,7,5,57,0,20,6,5,3,28,15,11,6,85,9,7,4,28,0,
+36,9,7,4,105,10,8,5,170,10,8,5,130,6,5,3,23,0,156,8,
+6,3,136,77,39,12,255,143,73,16,255,139,74,16,255,18,12,5,170,0,
+12,21,14,6,227,112,57,13,255,141,69,16,255,80,40,11,255,16,11,5,
+255,14,10,5,227,18,13,5,255,72,35,11,255,136,69,15,255,130,66,15,
+255,46,26,9,255,8,6,3,105,0,16,8,7,5,57,42,27,13,255,150,
+79,21,255,184,94,21,255,195,99,22,255,199,106,24,255,26,18,11,255,0,
+24,10,8,7,99,83,45,18,255,144,74,17,255,143,70,16,255,94,47,13,
+255,18,13,5,255,16,11,5,173,14,10,5,227,52,27,9,255,132,67,15,
+255,139,68,16,255,75,39,12,255,10,7,5,116,0,8,6,5,3,57,52,
+27,9,255,137,73,16,255,143,76,16,255,94,47,13,255,18,13,5,255,16,
+11,5,173,14,10,5,227,52,27,9,255,132,67,15,255,139,74,16,255,75,
+39,12,255,10,8,5,142,0,32,8,6,5,85,22,15,7,255,102,51,13,
+255,137,67,16,255,140,71,15,255,141,75,16,255,20,13,5,170,0,8,9,
+6,4,85,108,55,13,255,141,69,16,255,139,74,16,255,74,36,11,255,18,
+12,7,255,20,13,7,181,22,15,9,207,20,13,9,238,18,13,9,252,23,
+16,10,255,31,21,12,218,14,11,7,42,0,8,7,6,4,57,40,22,9,
+255,130,66,15,255,141,75,16,255,84,42,11,255,18,12,5,255,16,12,5,
+181,14,10,5,241,69,35,10,255,140,69,17,255,154,78,17,255,117,60,18,
+255,17,13,8,142,0,12,21,14,8,190,28,18,9,255,23,15,8,255,21,
+14,8,255,21,14,8,255,23,15,8,255,38,24,11,255,98,53,17,255,151,
+74,18,255,150,76,17,255,141,75,16,255,21,15,6,170,0,8,5,4,2,
+28,33,20,8,255,130,66,15,255,141,72,16,255,84,42,11,255,18,12,5,
+255,18,12,5,176,14,10,5,235,57,29,10,255,140,72,17,255,165,85,20,
+255,121,67,24,255,14,11,7,142,0,8,8,6,5,57,72,46,23,255,198,
+113,29,255,200,102,23,255,131,68,22,255,33,21,12,255,17,13,8,255,21,
+14,8,255,88,47,19,255,192,99,23,255,203,113,26,255,146,87,29,255,13,
+11,8,164,0,12,10,8,5,85,13,10,6,170,11,9,6,142,7,6,4,
+28,0,12,13,10,8,113,18,14,9,170,16,13,9,147,10,8,7,28,0,
+24,10,8,7,28,20,15,11,227,104,62,21,255,184,94,21,255,117,62,22,
+255,17,12,8,227,7,5,4,28,0,64,11,8,6,170,67,35,16,255,164,
+85,21,255,115,58,16,255,20,14,7,252,8,6,5,85,0,24,9,7,4,
+82,66,37,13,255,145,75,18,255,154,78,17,255,115,58,16,255,29,18,8,
+255,14,10,7,255,16,11,7,255,65,34,12,255,150,74,19,255,189,97,22,
+255,138,79,27,255,14,12,9,142,0,8,7,6,6,57,55,33,16,255,158,
+81,19,255,162,80,19,255,102,53,17,255,24,15,7,255,19,12,6,170,14,
+10,5,204,46,26,9,255,137,67,16,255,139,71,16,255,49,27,10,255,7,
+6,4,105,0,8,7,6,6,62,72,46,23,255,199,115,32,255,205,111,28,
+255,155,84,26,255,41,24,14,255,18,13,9,255,25,16,10,255,110,61,25,
+255,199,100,28,255,205,112,30,255,146,87,29,255,13,11,8,142,0,8,10,
+8,7,147,180,87,25,255,206,111,27,255,203,105,26,255,164,85,27,255,40,
+24,15,255,20,14,9,255,26,17,11,255,121,64,26,255,201,101,28,255,205,
+112,30,255,146,87,29,255,14,11,7,142,0,8,8,6,5,57,71,44,22,
+255,192,108,25,255,198,101,23,255,150,78,25,255,41,24,14,255,32,21,13,
+255,74,41,21,255,184,105,27,255,202,104,25,255,202,118,27,255,174,102,31,
+255,17,14,10,142,0,8,11,9,6,136,182,92,25,255,206,112,29,255,205,
+111,28,255,166,79,27,255,43,25,16,255,21,15,10,255,29,19,12,255,116,
+67,27,255,202,107,31,255,206,113,31,255,146,87,29,255,12,10,7,142,0,
+8,11,8,6,144,185,93,26,255,202,103,23,255,157,77,18,255,83,42,12,
+255,19,13,6,255,13,10,6,255,20,13,7,255,27,17,8,255,28,18,9,
+227,10,8,5,45,0,8,11,9,6,142,139,73,20,255,198,96,21,255,199,
+106,24,255,155,78,26,255,41,25,14,255,21,15,10,255,28,18,11,255,38,
+24,15,255,40,24,15,227,14,10,7,62,0,8,8,7,5,57,65,41,20,
+255,197,108,28,255,205,111,28,255,170,88,27,255,43,27,16,255,19,14,10,
+255,29,19,12,255,123,66,24,255,181,84,20,255,170,87,19,255,114,60,17,
+255,11,10,6,142,0,8,11,9,6,85,119,60,15,255,154,75,17,255,154,
+78,17,255,18,13,7,255,0,12,13,10,8,170,191,102,30,255,209,118,30,
+255,207,113,30,255,28,19,11,201,0,8,13,10,8,105,166,87,23,255,198,
+101,23,255,198,97,23,255,26,18,11,255,0,40,13,10,8,170,189,100,28,
+255,206,111,27,255,204,102,27,255,28,20,11,201,0,8,12,10,7,116,184,
+93,27,255,206,107,27,255,203,113,26,255,23,17,10,255,0,8,6,5,5,
+28,25,18,12,244,192,105,27,255,206,112,29,255,207,117,30,255,32,22,13,
+170,0,8,11,9,6,88,112,57,13,255,143,70,16,255,141,69,16,255,17,
+12,6,227,0,32,14,11,9,170,184,92,25,255,206,111,27,255,192,111,31,
+255,49,33,18,255,10,8,7,122,0,12,7,7,6,59,22,16,11,232,167,
+100,28,255,205,112,30,255,205,116,30,255,26,18,11,210,0,8,8,7,3,
+85,110,54,13,255,141,69,16,255,141,75,16,255,25,16,6,255,5,4,4,
+40,0,8,10,8,5,85,112,55,13,255,141,75,16,255,141,75,16,255,20,
+13,5,170,0,8,5,4,2,28,33,20,8,255,130,66,15,255,141,72,16,
+255,112,55,13,255,45,25,8,255,26,17,6,255,33,20,8,255,94,47,13,
+255,141,69,16,255,144,71,17,255,80,40,13,255,9,7,4,125,0,8,10,
+8,5,85,112,57,13,255,148,79,17,255,141,75,16,255,87,42,12,255,19,
+13,6,255,14,10,5,215,15,10,6,255,60,31,11,255,143,71,18,255,160,
+82,19,255,96,54,17,255,12,9,7,142,0,8,8,6,5,57,71,44,22,
+255,192,100,25,255,199,106,24,255,185,93,26,255,91,50,22,255,58,33,17,
+255,72,41,19,255,158,81,25,255,199,106,24,255,199,106,24,255,138,79,27,
+255,13,11,8,142,0,8,10,8,7,147,166,87,23,255,203,108,24,255,202,
+108,25,255,153,77,26,255,38,22,13,255,15,11,6,255,14,10,5,255,52,
+28,9,255,132,70,15,255,141,75,16,255,80,41,13,255,10,8,5,139,0,
+8,7,6,6,57,48,29,13,255,154,79,19,255,160,85,19,255,108,56,17,
+255,30,18,9,255,16,11,7,255,24,15,9,255,96,51,17,255,167,86,20,
+255,181,88,20,255,140,75,23,255,18,14,9,144,0,12,22,14,7,193,22,
+13,7,255,20,13,7,255,78,40,15,255,165,81,20,255,177,90,20,255,177,
+90,20,255,115,58,20,255,32,20,11,255,24,15,9,255,30,19,9,227,11,
+8,6,54,0,8,11,9,6,142,139,68,20,255,166,78,19,255,144,71,17,
+255,19,12,6,215,0,12,9,7,4,136,114,56,13,255,143,70,16,255,139,
+68,16,255,19,13,6,170,0,8,10,7,5,85,112,55,13,255,143,70,16,
+255,139,74,16,255,17,11,6,221,0,12,9,7,4,136,114,56,13,255,143,
+70,16,255,141,75,16,255,20,13,5,170,0,8,9,6,4,85,110,54,13,
+255,141,69,16,255,141,72,16,255,17,11,6,221,0,20,9,7,4,136,114,
+56,13,255,143,73,16,255,139,74,16,255,19,13,6,170,0,8,8,6,3,
+85,110,54,13,255,143,76,16,255,141,69,16,255,18,12,5,252,0,12,11,
+9,6,170,131,69,18,255,170,87,19,255,168,86,19,255,28,19,9,170,0,
+8,11,8,6,85,145,74,26,255,204,102,27,255,203,105,26,255,52,33,17,
+255,6,5,5,57,0,8,17,14,10,227,190,107,25,255,204,113,25,255,174,
+86,27,255,18,13,9,170,0,12,28,18,11,198,37,23,14,255,32,21,13,
+255,21,15,10,255,20,14,9,255,38,23,11,255,87,44,12,255,137,70,16,
+255,141,72,16,255,143,70,16,255,141,72,16,255,18,12,5,170,0,8,9,
+6,4,85,110,54,13,255,145,74,16,255,141,69,16,255,94,47,13,255,27,
+17,8,227,12,8,5,28,0,8,14,10,7,85,121,62,18,255,172,87,19,
+255,139,69,18,255,20,15,9,227,0,36,21,14,8,227,117,61,24,255,199,
+100,28,255,205,106,26,255,204,110,27,255,26,18,11,255,0,16,8,7,5,
+28,20,15,11,227,135,73,22,255,192,97,21,255,165,83,22,255,33,22,12,
+255,10,9,7,85,0,68,11,9,6,170,184,97,27,255,206,112,29,255,204,
+110,27,255,28,19,11,255,0,68,14,11,7,170,179,93,24,255,202,103,23,
+255,198,97,23,255,22,15,9,255,0,132,9,7,6,170,125,63,18,255,158,
+77,17,255,146,75,17,255,17,12,6,255,0,76,8,6,5,76,72,46,23,
+255,197,108,28,255,201,107,24,255,164,85,27,255,37,22,14,227,13,9,6,
+48,0,68,12,9,7,170,138,67,19,255,170,79,19,255,168,86,19,255,20,
+14,9,255,0,40,8,7,5,20,21,15,10,184,26,17,11,255,26,17,11,
+215,12,9,7,74,0,24,8,7,5,20,21,15,10,184,26,17,11,255,31,
+21,12,207,18,13,9,28,0,8,11,9,8,156,184,93,27,255,208,105,29,
+255,205,111,28,255,28,19,11,255,0,40,14,11,7,170,184,92,25,255,203,
+104,24,255,200,98,23,255,26,18,11,255,0,255,0,189,8,7,5,57,51,
+29,12,255,152,75,19,255,162,86,19,255,19,13,8,246,0,255,0,137,6,
+5,3,28,19,13,6,249,92,46,13,255,123,63,14,255,78,39,11,255,21,
+15,6,227,9,8,4,28,0,8,9,8,4,85,110,59,13,255,141,69,16,
+255,141,75,16,255,21,14,6,170,0,12,16,11,5,170,52,28,9,255,115,
+59,14,255,116,60,15,255,43,26,10,255,9,7,6,125,0,16,8,7,5,
+28,21,17,10,227,109,59,18,255,160,82,19,255,121,64,18,255,62,34,13,
+255,94,53,17,255,149,78,20,255,102,54,19,255,32,22,11,255,72,39,15,
+255,121,62,18,255,24,17,9,187,0,40,8,6,3,167,128,66,15,255,161,
+85,17,255,159,81,18,255,24,15,7,178,0,4,6,5,3,37,48,28,11,
+255,173,92,20,255,181,96,20,255,21,15,8,221,0,4,6,5,3,28,40,
+24,9,255,143,74,18,255,158,80,17,255,21,15,6,181,0,8,10,8,5,
+54,107,51,14,255,157,83,18,255,164,84,19,255,176,89,19,255,189,92,20,
+255,191,98,22,255,190,106,23,255,197,110,26,255,203,108,24,255,203,117,24,
+255,205,119,26,255,207,122,30,255,199,118,32,255,32,23,13,170,0,12,7,
+6,4,85,22,15,7,232,113,54,14,255,146,75,17,255,158,80,17,255,154,
+78,17,255,158,80,17,255,148,76,17,255,139,71,16,255,135,66,16,255,135,
+66,16,255,21,14,6,136,0,8,10,8,5,85,128,66,15,255,161,85,17,
+255,158,80,17,255,25,16,6,204,0,12,7,6,4,28,25,16,8,227,102,
+50,15,255,148,76,17,255,142,73,17,255,84,45,13,255,10,8,5,113,0,
+8,9,7,4,82,107,53,14,255,146,75,17,255,84,41,13,255,8,7,5,
+198,3,2,2,23,5,4,4,136,38,23,9,255,136,70,17,255,140,72,17,
+255,21,15,6,178,0,24,7,6,4,57,45,26,10,255,143,74,18,255,158,
+80,17,255,26,17,6,170,0,12,24,16,7,227,115,58,16,255,148,76,17,
+255,46,26,9,255,7,6,4,156,0,16,5,4,4,71,19,13,6,255,139,
+71,16,255,140,72,17,255,43,26,10,255,9,8,4,85,0,16,14,10,5,
+85,109,52,14,255,38,23,9,255,6,5,3,85,0,12,4,4,3,28,15,
+12,6,227,115,56,16,255,29,19,8,170,0,32,13,10,6,113,122,64,21,
+255,164,85,21,255,138,71,17,255,21,15,6,161,0,156,13,10,6,227,137,
+67,16,255,154,75,17,255,84,45,13,255,10,8,5,116,0,8,9,7,4,
+85,111,55,14,255,158,87,17,255,158,80,17,255,19,13,6,255,4,4,3,
+28,0,4,3,3,2,113,17,12,6,255,139,71,16,255,161,85,17,255,146,
+75,17,255,20,14,7,210,0,16,16,13,9,110,184,105,27,255,209,123,30,
+255,210,124,31,255,208,123,31,255,207,122,30,255,27,20,12,255,0,24,13,
+11,8,147,143,75,20,255,161,85,17,255,158,80,17,255,27,18,8,227,5,
+4,2,28,0,8,10,7,5,198,131,65,16,255,161,85,17,255,150,76,17,
+255,21,14,6,170,0,8,10,8,5,85,123,61,16,255,163,83,18,255,158,
+80,17,255,27,18,8,227,5,4,2,28,0,8,9,7,4,198,130,66,15,
+255,163,83,18,255,148,76,17,255,21,14,6,193,0,28,7,6,4,85,22,
+15,7,255,131,65,16,255,154,78,17,255,154,78,17,255,154,78,17,255,154,
+78,17,255,21,15,6,170,0,8,10,8,5,85,129,64,16,255,163,86,18,
+255,180,91,19,255,29,20,10,255,3,3,2,93,0,36,10,8,5,122,121,
+60,16,255,161,85,17,255,159,81,18,255,24,15,7,255,4,4,3,34,0,
+4,2,2,1,6,17,13,8,181,181,93,22,255,203,108,24,255,205,114,26,
+255,32,23,13,210,0,36,5,4,4,161,30,22,13,255,198,116,29,255,206,
+106,25,255,191,96,20,255,26,17,7,170,0,8,9,7,4,85,116,60,15,
+255,161,85,17,255,158,80,17,255,21,14,6,255,5,4,2,28,0,4,2,
+2,1,3,12,9,7,215,190,107,25,255,211,124,30,255,208,134,37,255,32,
+22,13,178,0,8,13,11,8,96,187,112,32,255,209,123,30,255,191,96,20,
+255,28,19,9,255,4,3,3,74,0,4,3,2,2,28,13,10,8,227,196,
+120,31,255,211,124,30,255,199,106,24,255,27,19,10,170,0,8,13,10,6,
+57,114,61,19,255,178,91,21,255,182,102,23,255,23,17,10,173,0,8,11,
+9,6,91,146,85,25,255,198,113,29,255,196,120,31,255,27,20,12,207,0,
+20,5,5,4,28,21,17,12,227,190,118,33,255,209,131,40,255,161,100,34,
+255,17,14,10,227,5,5,4,28,0,72,9,8,6,170,91,59,28,255,189,
+94,24,255,162,83,19,255,39,25,12,255,7,7,6,85,0,20,13,11,8,
+142,183,103,24,255,203,112,24,255,203,112,24,255,42,26,13,249,5,4,4,
+62,0,4,3,2,2,25,12,9,7,227,195,115,30,255,212,127,35,255,211,
+132,38,255,32,22,13,181,0,8,12,10,7,85,124,65,17,255,161,85,17,
+255,159,78,18,255,21,14,6,255,5,4,2,28,0,8,7,6,4,224,133,
+68,16,255,159,81,18,255,146,72,17,255,22,14,7,170,0,8,13,11,8,
+91,185,111,32,255,210,125,33,255,205,114,26,255,37,26,14,255,4,4,3,
+85,0,4,4,4,4,28,13,10,8,227,193,105,26,255,206,111,27,255,202,
+118,27,255,32,22,13,170,0,8,11,9,6,127,174,91,23,255,202,102,21,
+255,200,105,21,255,36,23,13,255,4,4,3,85,0,4,3,3,2,28,13,
+11,8,227,198,118,33,255,212,127,35,255,208,128,33,255,31,22,12,181,0,
+8,13,11,8,91,185,114,30,255,211,124,30,255,208,122,29,255,34,24,13,
+255,4,4,3,85,0,4,7,6,6,113,32,24,13,255,185,95,22,255,202,
+98,21,255,198,97,23,255,33,22,12,170,0,8,10,8,7,156,190,108,27,
+255,212,126,33,255,211,127,36,255,40,26,15,255,4,4,3,85,0,4,3,
+3,2,28,13,11,8,227,198,118,33,255,214,129,37,255,211,132,38,255,32,
+23,13,173,0,8,10,8,7,144,167,87,22,255,185,94,20,255,165,87,18,
+255,25,17,8,255,3,3,2,57,0,28,13,11,8,170,195,112,30,255,210,
+125,33,255,208,117,29,255,39,26,14,255,4,4,3,85,0,28,12,10,7,
+150,184,108,27,255,211,124,30,255,211,127,36,255,40,27,15,255,4,4,3,
+85,0,4,3,3,2,28,17,13,8,178,138,71,17,255,161,85,17,255,155,
+79,18,255,21,14,6,170,0,8,10,8,5,85,124,61,15,255,169,89,18,
+255,180,91,19,255,25,18,10,255,0,12,13,11,8,170,196,113,31,255,211,
+124,30,255,205,119,26,255,26,18,11,204,0,8,11,9,6,88,134,70,19,
+255,173,87,18,255,168,86,19,255,20,13,7,255,0,40,13,11,8,170,196,
+113,31,255,210,125,33,255,207,122,30,255,24,18,11,212,0,8,11,9,6,
+119,180,93,23,255,203,108,24,255,202,103,23,255,20,15,9,255,0,8,15,
+13,10,195,101,63,26,255,202,117,25,255,206,128,35,255,160,106,35,255,15,
+13,10,142,0,8,10,8,5,147,139,70,20,255,191,96,20,255,200,105,21,
+255,25,18,10,255,0,32,13,10,8,170,189,99,26,255,206,115,27,255,205,
+106,26,255,185,106,28,255,79,52,26,255,10,9,7,122,0,4,7,6,6,
+42,36,27,17,244,172,106,35,255,207,128,34,255,211,126,34,255,211,127,36,
+255,24,18,11,227,0,8,10,8,5,85,124,64,15,255,159,81,18,255,158,
+80,17,255,76,40,13,255,11,8,6,210,0,8,12,9,5,85,129,64,16,
+255,161,85,17,255,158,80,17,255,26,16,7,170,0,8,9,7,4,85,115,
+56,16,255,161,85,17,255,159,81,18,255,49,27,10,255,7,6,4,170,5,
+4,4,85,6,5,3,113,26,19,11,255,185,95,22,255,202,102,21,255,197,
+104,22,255,28,20,11,173,0,8,13,10,6,102,167,87,22,255,200,101,21,
+255,201,102,22,255,32,21,11,255,4,3,3,65,0,4,2,2,1,17,12,
+10,7,221,190,98,23,255,208,116,27,255,204,110,27,255,30,21,11,181,0,
+8,13,11,8,91,185,114,30,255,211,124,30,255,209,123,30,255,86,55,25,
+255,9,8,6,187,6,6,5,85,7,6,6,130,32,24,15,255,200,122,31,
+255,209,123,30,255,206,122,31,255,32,23,13,173,0,8,10,8,7,144,191,
+113,30,255,212,127,35,255,210,126,35,255,40,27,15,255,4,4,3,85,0,
+4,2,2,1,8,11,9,6,212,157,81,20,255,189,92,20,255,190,97,21,
+255,27,19,10,178,0,8,12,10,7,96,183,105,28,255,209,123,30,255,205,
+114,26,255,36,24,13,255,4,4,3,85,0,4,4,4,4,28,18,14,9,
+187,195,115,30,255,211,124,30,255,210,130,35,255,35,26,14,210,0,20,3,
+2,2,28,12,10,7,227,195,115,30,255,211,124,30,255,209,123,30,255,38,
+25,15,255,4,4,3,85,0,20,13,11,8,170,194,115,31,255,209,122,28,
+255,196,99,21,255,21,15,8,255,0,12,11,9,6,170,153,79,20,255,187,
+91,20,255,181,96,20,255,30,20,9,178,0,8,13,10,6,96,151,79,20,
+255,187,91,20,255,181,96,20,255,22,16,9,255,0,12,12,9,7,170,146,
+76,19,255,167,88,18,255,158,77,17,255,23,15,6,170,0,8,10,8,5,
+85,133,66,16,255,167,88,18,255,168,86,19,255,22,16,9,255,0,20,12,
+9,7,170,155,80,20,255,185,94,20,255,181,96,20,255,22,16,9,221,0,
+8,6,6,5,42,51,29,12,255,150,81,19,255,165,87,18,255,42,26,11,
+255,5,5,4,108,0,4,5,5,4,28,18,15,11,255,195,114,28,255,207,
+123,32,255,158,94,31,255,17,13,10,142,0,8,6,5,5,57,50,34,19,
+255,191,111,32,255,208,117,29,255,113,73,30,255,10,10,9,227,6,6,5,
+125,7,7,6,198,42,29,17,255,187,96,22,255,166,87,23,255,42,27,15,
+255,8,6,5,110,0,32,5,5,4,184,21,16,8,255,106,54,15,255,154,
+78,17,255,151,77,18,255,92,48,15,255,11,9,6,119,0,8,10,8,5,
+93,131,69,18,255,189,92,20,255,200,105,21,255,33,22,12,255,5,4,4,
+54,0,12,9,8,6,85,76,53,25,255,200,118,31,255,204,114,27,255,65,
+43,22,255,6,6,5,113,0,32,4,3,3,17,14,11,9,227,195,111,28,
+255,206,115,27,255,204,105,25,255,24,17,11,255,0,12,5,5,4,28,13,
+10,6,227,125,66,18,255,165,84,18,255,161,85,17,255,161,85,17,255,155,
+79,18,255,28,19,9,255,6,5,3,85,0,64,11,9,8,68,86,56,27,
+255,204,126,33,255,210,125,33,255,30,21,13,255,0,68,13,11,8,170,195,
+115,30,255,209,123,30,255,207,122,30,255,27,19,12,255,3,3,2,28,0,
+128,7,6,4,184,131,65,16,255,161,85,17,255,154,78,17,255,15,11,6,
+249,0,76,10,8,7,173,166,87,23,255,198,104,21,255,196,99,21,255,35,
+23,12,255,3,3,2,85,0,72,13,11,8,170,194,115,31,255,211,124,30,
+255,207,122,30,255,27,19,12,255,3,3,2,28,0,108,13,11,8,170,196,
+113,31,255,213,132,36,255,211,127,36,255,30,21,13,255,0,40,11,9,6,
+170,155,80,20,255,185,94,20,255,180,91,19,255,21,15,8,255,0,255,0,
+189,10,8,7,184,183,100,26,255,208,116,27,255,204,114,27,255,26,18,11,
+255,4,4,4,28,0,255,0,133,10,8,5,127,119,60,15,255,160,85,19,
+255,91,48,16,255,10,8,5,227,4,4,3,28,0,12,9,7,4,161,131,
+67,16,255,159,81,18,255,159,78,18,255,18,13,7,249,0,16,7,6,4,
+170,57,34,14,255,176,90,21,255,195,95,22,255,26,19,11,232,0,16,17,
+14,10,99,179,106,28,255,207,122,30,255,180,109,33,255,25,20,12,255,7,
+6,6,170,20,17,11,255,196,114,27,255,208,117,29,255,203,124,30,255,172,
+106,35,255,53,36,20,255,10,9,7,108,0,40,9,8,6,170,159,82,20,
+255,202,103,23,255,206,111,27,255,22,17,11,255,0,8,10,9,7,139,115,
+74,30,255,213,133,48,255,39,28,16,255,0,8,9,8,4,113,67,39,14,
+255,181,92,20,255,24,18,9,255,0,12,28,19,9,227,139,79,26,255,206,
+117,31,255,212,123,37,255,214,126,41,255,172,106,35,255,53,34,18,255,122,
+78,31,255,211,127,44,255,217,136,50,255,216,135,49,255,190,122,41,255,65,
+43,22,255,14,11,7,85,0,8,7,6,4,28,29,21,10,249,153,79,20,
+255,174,85,19,255,103,53,16,255,17,12,6,244,19,13,6,170,21,14,6,
+170,27,17,6,170,21,14,6,212,21,14,6,255,25,17,6,224,12,9,5,
+45,0,12,24,16,7,153,22,15,7,255,26,16,7,210,12,9,5,40,0,
+8,8,7,5,28,17,13,8,227,114,61,19,255,174,85,19,255,154,79,19,
+255,60,33,13,255,11,9,6,170,0,12,10,8,5,170,146,79,19,255,180,
+87,19,255,67,39,14,255,8,6,5,85,0,8,24,17,9,255,143,75,20,
+255,162,80,19,255,22,15,7,215,0,28,8,7,5,110,60,33,13,255,166,
+78,19,255,22,15,7,227,0,8,7,6,4,85,91,51,16,255,174,88,19,
+255,169,78,18,255,25,17,8,255,3,3,2,8,0,20,11,9,6,178,143,
+74,18,255,177,89,18,255,138,75,19,255,18,13,7,176,0,16,9,7,4,
+28,29,19,8,232,41,25,10,255,17,13,8,255,9,8,6,116,0,4,7,
+6,4,59,14,11,7,227,32,21,9,255,40,24,9,255,12,9,5,105,0,
+32,14,11,9,170,199,124,36,255,213,119,36,255,202,102,21,255,20,14,7,
+246,0,152,8,7,5,142,53,31,12,255,162,86,19,255,121,64,18,255,19,
+14,8,252,6,5,3,28,0,8,10,8,5,125,142,74,19,255,180,91,19,
+255,183,89,19,255,19,14,8,255,0,4,5,5,4,6,15,13,10,193,69,
+42,18,255,171,91,20,255,189,88,20,255,200,101,21,255,31,21,12,255,0,
+16,10,8,7,28,30,21,13,227,150,92,35,255,208,121,37,255,211,115,30,
+255,208,117,29,255,28,21,13,255,0,24,10,8,7,28,22,15,7,198,26,
+17,7,255,24,15,7,221,9,7,4,57,0,12,8,7,5,156,171,89,22,
+255,202,107,23,255,202,103,23,255,23,18,10,249,0,12,26,18,9,198,29,
+19,8,255,24,16,7,215,10,8,5,51,0,12,10,8,5,85,134,70,19,
+255,175,88,18,255,173,87,18,255,20,14,7,255,0,24,10,8,5,85,26,
+19,9,255,107,58,18,255,154,83,19,255,168,79,19,255,169,78,18,255,173,
+87,18,255,172,80,19,255,26,17,7,170,0,8,11,10,8,136,189,99,26,
+255,210,115,31,255,216,129,45,255,143,96,40,255,15,13,10,227,12,12,11,
+170,15,13,12,170,13,12,10,170,13,12,10,136,9,8,8,85,0,16,11,
+9,6,170,169,91,22,255,202,103,23,255,203,108,24,255,18,15,9,255,0,
+12,6,5,5,23,28,19,11,156,31,22,12,255,34,24,13,227,14,11,7,
+85,0,36,9,8,8,142,72,54,31,255,215,147,60,255,218,146,61,255,174,
+100,35,255,14,11,7,142,0,8,11,8,6,102,142,74,19,255,185,86,20,
+255,195,98,20,255,18,14,9,249,0,12,10,8,7,170,202,131,47,255,220,
+152,63,255,220,151,61,255,22,19,13,252,0,8,11,9,8,167,203,135,46,
+255,217,139,48,255,210,120,33,255,18,14,9,255,0,12,9,8,6,170,198,
+117,37,255,211,115,30,255,202,102,21,255,34,22,11,176,0,8,13,11,8,
+170,202,122,37,255,218,144,49,255,217,144,50,255,28,21,13,255,0,8,12,
+11,9,170,204,122,41,255,217,135,46,255,215,136,42,255,46,33,19,255,0,
+16,10,9,7,28,21,19,14,227,153,104,46,255,214,149,55,255,158,103,39,
+255,16,14,11,221,7,6,6,28,0,20,20,18,13,142,31,26,18,170,25,
+21,16,170,24,20,15,170,24,20,15,170,24,20,15,170,24,21,15,170,31,
+26,18,170,25,21,16,170,14,12,9,31,0,20,10,9,7,167,75,51,26,
+255,202,117,33,255,186,120,43,255,41,32,20,255,12,11,9,85,0,16,11,
+9,8,28,31,22,12,215,49,33,18,255,41,27,16,227,12,10,7,85,0,
+12,14,12,9,170,204,137,51,255,220,152,63,255,220,151,61,255,23,19,12,
+252,0,8,11,10,6,85,136,70,17,255,175,88,18,255,169,78,18,255,15,
+11,6,255,0,8,9,8,6,85,26,19,9,255,153,82,18,255,177,89,18,
+255,180,84,19,255,24,17,9,218,0,8,11,9,8,147,196,115,35,255,215,
+125,38,255,214,125,39,255,20,16,11,255,0,12,9,8,6,159,165,86,22,
+255,197,99,20,255,195,90,20,255,32,21,11,170,0,8,12,10,7,85,145,
+76,20,255,189,92,20,255,191,96,20,255,18,14,9,255,0,12,9,8,6,
+170,199,126,39,255,217,133,50,255,217,144,50,255,23,18,12,252,0,8,11,
+10,8,142,191,105,28,255,206,111,27,255,203,104,24,255,19,15,10,255,0,
+12,9,8,6,57,21,15,8,198,28,19,9,255,32,21,11,227,11,9,6,
+76,0,8,11,9,8,170,203,125,42,255,220,146,59,255,219,146,60,255,24,
+19,13,255,0,12,11,10,8,170,204,136,47,255,220,146,59,255,218,147,55,
+255,25,19,12,232,0,8,11,10,8,119,161,87,22,255,195,98,20,255,202,
+103,23,255,18,15,9,255,0,32,14,12,9,170,200,125,37,255,214,124,37,
+255,205,106,26,255,20,16,9,221,0,32,16,13,9,170,205,130,42,255,219,
+144,56,255,219,146,60,255,24,19,13,255,0,12,6,5,3,23,21,14,6,
+170,26,16,7,255,26,17,7,224,14,10,5,31,0,8,11,9,6,125,170,
+89,23,255,211,115,30,255,214,126,41,255,23,19,12,255,0,12,11,10,8,
+170,195,112,30,255,206,106,25,255,200,105,21,255,29,20,10,170,0,8,11,
+9,6,85,134,70,19,255,177,85,18,255,172,80,19,255,18,13,7,255,0,
+40,14,12,9,170,195,112,30,255,206,111,27,255,202,103,23,255,31,22,10,
+170,0,8,13,10,6,85,151,79,20,255,189,92,20,255,183,89,19,255,17,
+13,8,255,0,4,8,7,5,59,57,34,16,255,184,97,27,255,198,115,33,
+255,114,77,33,255,16,14,11,210,6,5,5,8,0,8,12,10,7,170,195,
+113,32,255,215,123,42,255,217,133,50,255,32,24,15,255,0,32,12,11,7,
+170,175,90,22,255,198,104,21,255,189,92,20,255,192,97,21,255,189,97,22,
+255,45,29,14,255,10,9,7,210,22,17,11,255,183,102,30,255,212,121,41,
+255,216,135,49,255,217,137,52,255,214,125,39,255,29,21,12,204,0,8,11,
+9,6,85,143,75,20,255,193,97,20,255,195,98,20,255,180,93,23,255,88,
+54,23,255,11,10,8,113,0,4,14,12,7,85,170,89,23,255,202,103,23,
+255,202,102,21,255,32,22,11,178,0,8,12,10,7,113,176,91,23,255,205,
+105,24,255,209,117,28,255,39,28,16,255,5,5,5,28,0,8,15,14,10,
+198,206,132,45,255,217,133,50,255,215,133,44,255,25,19,12,232,0,8,11,
+10,8,125,198,118,39,255,218,145,51,255,218,146,53,255,20,17,11,255,0,
+12,9,8,6,170,198,124,37,255,216,134,45,255,214,139,41,255,22,18,11,
+255,0,8,11,10,8,136,191,105,28,255,206,111,27,255,206,106,25,255,36,
+26,15,255,5,5,4,28,0,8,15,13,10,198,192,105,27,255,206,106,25,
+255,204,105,25,255,23,17,10,232,0,8,12,10,7,125,196,119,37,255,218,
+141,51,255,218,139,55,255,20,16,11,255,0,12,9,8,6,170,196,110,33,
+255,215,126,40,255,214,125,39,255,23,18,12,252,0,8,11,9,8,167,201,
+123,40,255,217,133,50,255,214,136,43,255,20,16,11,255,0,12,6,5,5,
+23,29,21,12,153,32,22,13,255,35,25,14,227,15,12,8,85,0,24,12,
+10,9,170,198,124,37,255,215,125,38,255,213,124,38,255,23,18,12,255,0,
+24,14,12,9,170,204,132,47,255,219,144,56,255,211,127,36,255,28,21,13,
+255,0,12,14,12,9,170,198,117,37,255,215,123,42,255,214,125,39,255,25,
+20,12,215,0,8,11,10,8,130,198,119,35,255,215,126,40,255,212,123,37,
+255,30,22,13,255,0,12,14,12,9,170,196,114,33,255,206,106,25,255,200,
+105,21,255,30,21,11,184,0,8,13,11,8,99,184,100,25,255,209,117,28,
+255,210,115,31,255,28,21,13,255,0,20,14,12,9,170,198,117,37,255,215,
+126,40,255,214,126,41,255,25,19,12,255,0,12,10,9,7,125,61,42,22,
+255,190,107,33,255,153,98,38,255,29,23,16,255,13,12,10,255,17,15,10,
+255,108,74,37,255,210,144,59,255,153,98,38,255,16,14,11,224,6,6,5,
+17,0,12,15,13,8,227,115,67,24,255,197,100,22,255,150,81,25,255,32,
+24,13,255,15,13,8,255,19,15,10,255,85,48,18,255,178,95,21,255,115,
+65,20,255,15,12,8,255,5,5,4,34,0,32,10,9,7,198,69,46,22,
+255,186,103,29,255,195,111,28,255,92,58,25,255,15,12,8,198,0,12,10,
+9,7,170,194,112,31,255,215,125,38,255,218,146,53,255,24,19,13,255,0,
+20,15,14,10,227,159,103,42,255,212,127,43,255,177,118,48,255,19,17,12,
+227,6,6,5,28,0,32,11,10,8,170,182,98,23,255,202,106,21,255,195,
+98,20,255,24,17,9,212,0,12,18,14,9,227,102,54,19,255,157,83,18,
+255,85,46,14,255,19,13,6,255,47,27,10,255,150,81,19,255,131,67,20,
+255,39,26,14,255,12,11,9,85,0,64,10,9,7,170,118,75,33,255,215,
+141,54,255,44,33,19,255,0,16,9,9,8,108,19,17,12,170,27,23,16,
+170,23,21,16,170,23,21,16,170,24,20,15,170,20,18,13,170,15,14,10,
+170,10,9,7,113,7,6,6,28,0,12,12,11,9,170,189,99,26,255,209,
+110,30,255,211,118,36,255,141,88,36,255,19,17,12,227,20,18,13,170,24,
+20,15,170,21,19,14,170,16,14,11,170,10,9,7,113,6,6,5,28,0,
+20,8,7,5,65,11,10,8,142,16,14,11,170,24,21,15,170,25,22,16,
+170,23,21,16,170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6,
+28,0,20,8,7,5,62,10,9,5,136,12,10,7,170,14,11,7,170,13,
+10,6,170,11,9,6,198,31,21,10,255,153,82,18,255,177,85,18,255,169,
+78,18,255,22,15,7,204,0,16,8,7,5,57,11,10,6,142,19,17,12,
+170,23,21,16,170,25,22,16,170,23,21,16,170,21,19,14,170,15,14,10,
+170,10,10,9,113,7,6,6,28,0,16,12,10,7,153,55,32,14,255,175,
+93,20,255,185,94,20,255,183,89,19,255,80,44,17,255,13,11,8,187,7,
+6,6,25,0,16,8,7,5,62,11,10,6,142,16,14,11,170,23,19,14,
+170,25,22,16,170,23,21,16,170,19,17,12,170,15,14,10,170,17,15,10,
+170,19,17,12,142,9,8,8,28,0,8,12,10,9,170,204,137,49,255,220,
+146,59,255,218,146,53,255,141,91,38,255,19,17,12,227,19,17,12,170,24,
+20,15,170,21,19,14,170,15,14,10,170,10,10,9,113,7,6,6,28,0,
+16,12,10,7,57,14,12,7,102,14,11,7,85,0,32,12,10,7,57,13,
+11,8,105,15,13,8,85,0,12,12,11,9,170,204,136,47,255,220,146,59,
+255,218,153,59,255,24,19,13,255,0,12,8,7,5,82,11,10,6,156,11,
+9,6,170,10,9,7,91,0,12,10,8,5,127,144,78,19,255,180,87,19,
+255,174,81,19,255,24,15,7,210,0,12,14,11,7,68,12,10,7,170,12,
+10,7,170,17,15,10,170,24,20,15,170,19,17,12,170,15,14,10,170,18,
+15,11,170,24,21,15,170,21,19,14,170,15,14,10,170,11,10,8,113,7,
+7,6,28,0,16,15,13,10,119,17,15,12,170,15,13,10,170,16,14,11,
+170,19,17,12,170,21,18,12,170,18,15,11,170,15,13,8,170,11,9,6,
+170,10,8,7,88,6,5,5,23,0,20,10,9,7,85,14,12,9,170,19,
+17,12,170,21,19,14,170,21,19,14,170,21,19,14,170,19,17,12,170,15,
+14,10,170,11,10,8,116,7,7,6,28,0,16,15,14,10,119,18,15,11,
+170,15,14,10,170,18,15,11,170,21,19,14,170,25,22,16,170,23,21,16,
+170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6,28,0,20,10,
+9,7,85,14,12,9,170,19,17,12,170,20,18,13,170,20,18,13,170,23,
+19,14,170,19,17,12,170,15,14,10,170,17,14,10,170,19,17,12,142,10,
+9,7,28,0,12,15,13,10,113,18,15,11,170,15,14,10,170,18,15,11,
+170,21,19,14,170,25,22,16,170,23,21,16,170,20,18,13,170,16,14,11,
+170,11,10,8,113,7,7,6,28,0,20,7,7,6,82,11,10,6,142,16,
+13,9,170,19,17,12,170,21,19,14,170,24,21,15,170,25,22,16,170,25,
+22,16,170,15,13,10,170,12,11,9,57,0,16,15,13,10,170,97,65,34,
+255,209,132,42,255,214,136,43,255,214,127,43,255,159,103,42,255,21,19,14,
+227,11,10,8,28,0,12,16,14,11,113,21,19,14,170,18,15,11,153,11,
+10,8,28,0,16,15,14,10,125,21,19,14,170,19,17,12,142,10,9,7,
+28,0,12,15,14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0,
+16,15,13,10,125,21,19,14,170,19,17,12,142,10,9,7,28,0,12,15,
+14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0,24,15,14,10,
+125,21,19,14,170,19,17,12,142,9,9,8,28,0,12,17,14,10,130,27,
+24,16,170,21,19,14,142,10,9,7,28,0,16,16,14,11,113,28,24,17,
+170,24,21,15,161,12,11,9,28,0,12,16,14,11,113,21,19,14,170,18,
+15,11,153,11,10,8,28,0,16,15,13,10,125,21,19,14,170,19,17,12,
+142,9,8,6,28,0,12,18,15,11,136,19,16,10,170,16,13,9,170,16,
+14,9,170,15,13,8,170,13,11,8,170,12,11,9,170,13,12,8,170,15,
+14,10,170,14,13,11,170,11,11,10,113,0,20,13,11,8,170,190,98,23,
+255,204,116,31,255,74,52,27,255,9,8,8,113,0,16,13,11,8,170,192,
+106,29,255,208,112,27,255,208,117,29,255,27,21,12,255,0,16,5,5,4,
+28,27,23,16,255,199,121,44,255,214,139,41,255,31,23,14,255,0,16,13,
+11,8,28,32,24,13,227,36,26,15,255,19,16,12,198,8,8,7,51,0,
+4,8,8,7,57,29,21,12,218,48,32,17,255,45,30,16,255,20,16,11,
+218,10,9,7,105,0,44,14,12,9,170,204,130,51,255,224,153,77,255,225,
+169,88,255,33,27,18,255,0,12,21,19,14,215,217,163,86,255,61,46,28,
+255,0,12,19,16,12,201,203,121,40,255,51,38,22,255,0,12,4,4,3,
+25,16,14,11,227,212,147,71,255,224,160,77,255,223,161,80,255,31,25,16,
+255,4,4,4,102,10,10,9,215,206,133,55,255,223,156,70,255,224,164,85,
+255,51,39,24,255,5,5,4,82,0,12,15,12,8,110,178,98,27,255,211,
+115,30,255,211,121,34,255,36,26,15,255,3,3,2,85,0,60,8,8,5,
+28,27,20,10,232,125,73,22,255,190,97,21,255,180,92,21,255,97,56,20,
+255,14,11,7,170,0,16,12,10,7,142,165,89,22,255,198,104,21,255,84,
+50,19,255,7,6,4,159,0,4,5,5,4,82,32,23,11,255,121,69,22,
+255,97,56,20,255,15,13,8,142,0,32,14,12,7,198,172,92,21,255,28,
+19,9,207,0,8,11,10,6,85,148,78,21,255,198,104,21,255,192,97,21,
+255,21,15,8,255,0,24,10,9,5,170,167,90,22,255,202,93,21,255,202,
+103,23,255,21,16,10,255,0,20,4,3,3,133,20,16,9,255,151,80,22,
+255,75,42,16,255,10,8,7,255,32,22,11,255,164,86,23,255,60,39,17,
+255,5,5,4,252,0,36,12,11,9,198,213,155,80,255,224,166,83,255,211,
+121,34,255,20,16,9,255,3,3,2,28,0,144,6,6,5,51,27,20,10,
+255,160,84,23,255,198,104,21,255,67,40,16,255,8,7,5,125,0,12,12,
+10,9,170,195,112,30,255,215,125,38,255,217,133,50,255,49,35,22,255,5,
+5,4,133,13,12,10,210,189,119,50,255,211,127,44,255,212,121,41,255,218,
+135,53,255,220,148,63,255,34,27,17,255,0,20,4,4,4,17,13,12,10,
+227,196,113,31,255,212,118,35,255,214,123,43,255,33,26,16,255,0,56,12,
+11,9,187,208,134,55,255,223,146,70,255,221,152,70,255,34,26,17,255,0,
+40,8,7,5,164,165,86,22,255,202,98,21,255,198,96,21,255,22,16,9,
+255,0,20,8,8,5,85,32,22,11,255,167,87,22,255,160,84,23,255,93,
+54,20,255,120,65,21,255,188,96,21,255,196,99,21,255,200,105,21,255,24,
+19,11,207,0,8,15,14,10,110,208,152,71,255,227,174,98,255,228,179,103,
+255,225,176,98,255,217,169,94,255,213,166,92,255,215,167,92,255,213,155,80,
+255,204,136,55,255,138,89,37,255,25,22,16,227,9,9,8,28,0,8,11,
+10,8,170,203,129,50,255,223,149,70,255,222,158,75,255,31,25,16,255,4,
+4,4,28,0,60,8,8,7,57,49,40,26,255,206,152,83,255,224,169,91,
+255,194,140,71,255,31,27,20,255,9,8,8,28,0,8,12,10,9,161,196,
+110,33,255,218,130,51,255,222,158,75,255,31,25,16,255,4,4,4,28,0,
+8,11,10,8,198,213,160,84,255,228,180,105,255,227,175,100,255,33,28,18,
+207,0,8,12,11,9,130,210,155,77,255,228,169,99,255,226,172,95,255,30,
+25,17,255,4,4,4,28,0,8,11,10,8,198,204,129,49,255,214,127,43,
+255,213,125,40,255,23,19,12,232,0,8,14,13,9,125,208,152,71,255,223,
+159,76,255,218,153,59,255,33,26,16,210,0,8,13,12,10,127,198,118,39,
+255,215,127,42,255,213,126,42,255,41,31,18,227,0,12,6,6,5,28,25,
+21,16,227,204,150,79,255,223,171,98,255,175,122,60,255,18,15,11,218,5,
+4,4,17,0,20,20,18,13,85,177,101,34,255,204,123,37,255,199,117,36,
+255,199,117,36,255,202,122,37,255,199,117,36,255,198,114,31,255,198,110,31,
+255,202,118,35,255,46,33,21,170,0,24,10,9,7,153,110,78,37,255,213,
+162,82,255,218,164,87,255,67,51,30,255,9,8,8,85,0,40,6,5,5,
+28,21,19,14,255,217,166,92,255,227,175,100,255,224,169,91,255,31,25,16,
+215,0,8,12,10,7,85,154,80,21,255,197,99,20,255,192,97,21,255,28,
+20,9,255,4,3,3,110,11,9,6,170,117,63,20,255,184,94,21,255,198,
+104,21,255,203,104,24,255,210,122,37,255,21,17,12,252,0,8,10,9,7,
+161,203,129,50,255,224,160,77,255,225,169,88,255,30,25,17,255,4,4,4,
+28,0,8,8,7,5,190,165,86,22,255,198,104,21,255,196,99,21,255,28,
+19,9,170,0,8,13,11,8,85,176,91,23,255,208,112,27,255,210,121,35,
+255,27,22,14,255,4,4,4,28,0,8,11,10,8,198,211,149,76,255,224,
+168,87,255,224,162,81,255,32,26,17,210,0,8,12,10,7,113,176,91,23,
+255,202,107,23,255,202,95,23,255,20,16,9,255,0,40,15,13,10,170,213,
+160,84,255,228,180,105,255,227,174,98,255,33,26,18,255,0,12,15,13,10,
+170,213,155,80,255,226,172,95,255,224,167,85,255,23,20,14,244,0,8,11,
+10,8,127,189,104,28,255,214,127,43,255,221,148,70,255,31,25,16,255,4,
+4,4,28,0,28,14,12,9,170,195,113,32,255,209,117,28,255,202,103,23,
+255,20,15,9,252,3,3,3,14,0,28,15,14,10,170,213,155,80,255,226,
+172,95,255,221,152,70,255,28,24,15,255,0,40,14,12,9,170,208,141,61,
+255,225,162,88,255,227,174,98,255,33,26,18,255,4,4,4,28,0,8,10,
+8,7,198,182,98,23,255,202,103,23,255,198,104,21,255,28,19,9,170,0,
+8,11,10,6,85,154,80,21,255,202,98,21,255,202,103,23,255,25,20,12,
+255,0,40,12,10,7,170,186,100,23,255,202,99,23,255,200,105,21,255,30,
+21,9,170,0,8,12,9,7,85,154,80,21,255,198,104,21,255,196,99,21,
+255,28,20,9,255,4,4,3,113,11,10,6,227,183,100,26,255,212,127,43,
+255,167,117,52,255,17,15,12,215,5,5,5,14,0,12,15,13,10,170,211,
+149,76,255,224,166,83,255,223,161,80,255,34,26,17,255,0,32,10,9,7,
+170,167,87,22,255,198,92,21,255,196,99,21,255,196,95,21,255,198,92,21,
+255,195,99,22,255,192,106,29,255,206,127,43,255,217,141,60,255,223,146,70,
+255,224,165,81,255,220,148,63,255,212,124,39,255,25,19,12,215,0,8,12,
+11,9,116,196,116,37,255,218,141,51,255,218,139,55,255,218,142,61,255,215,
+143,58,255,24,19,13,212,0,4,10,9,7,156,203,129,50,255,221,150,66,
+255,220,148,63,255,25,21,14,227,0,8,10,10,7,159,204,134,59,255,225,
+160,84,255,225,169,88,255,36,29,19,255,0,12,15,14,10,170,204,130,51,
+255,220,142,59,255,218,139,55,255,21,18,12,249,0,8,11,10,8,142,206,
+145,67,255,226,172,95,255,227,174,98,255,32,26,17,255,4,4,4,28,0,
+8,11,10,8,198,198,117,37,255,215,125,38,255,211,122,36,255,28,21,13,
+215,0,8,13,11,8,96,174,91,23,255,202,107,23,255,202,103,23,255,22,
+17,9,255,0,12,11,10,6,170,176,91,23,255,202,103,23,255,203,108,24,
+255,21,15,10,238,0,8,11,10,8,142,206,145,67,255,226,170,91,255,224,
+160,85,255,30,24,17,255,4,4,4,28,0,8,11,10,8,198,209,149,70,
+255,224,160,77,255,222,158,75,255,31,25,16,212,0,8,12,11,9,127,198,
+116,35,255,215,125,38,255,211,122,36,255,28,21,13,255,4,4,4,28,0,
+52,13,12,8,170,195,112,30,255,209,110,30,255,207,105,30,255,25,20,12,
+255,0,24,15,14,10,170,213,158,80,255,226,172,95,255,224,164,85,255,33,
+27,18,255,0,12,15,14,10,170,210,143,65,255,224,168,87,255,224,165,81,
+255,25,21,14,232,0,8,10,10,9,153,208,147,67,255,224,166,83,255,222,
+158,75,255,34,26,17,255,0,12,15,14,10,170,211,149,76,255,223,149,70,
+255,219,146,60,255,25,20,14,235,0,8,10,10,9,150,204,134,59,255,224,
+156,83,255,224,165,81,255,33,27,18,255,0,20,15,14,10,170,211,150,70,
+255,226,170,91,255,226,172,95,255,33,26,18,255,0,16,9,9,8,150,101,
+74,38,255,198,145,77,255,206,157,87,255,202,151,79,255,197,141,74,255,200,
+146,75,255,180,126,57,255,21,19,14,227,5,5,4,28,0,16,8,7,5,
+113,43,28,14,255,187,96,22,255,181,93,22,255,98,55,21,255,68,42,17,
+255,77,46,18,255,129,72,22,255,174,89,21,255,83,47,18,255,11,9,6,
+221,0,28,6,6,5,28,16,14,11,195,108,76,35,255,210,141,59,255,218,
+162,81,255,167,118,54,255,16,14,11,221,5,5,5,14,0,12,15,13,10,
+170,211,149,76,255,224,168,87,255,223,154,80,255,31,25,16,255,0,20,6,
+6,5,57,34,27,17,255,203,122,36,255,208,124,41,255,109,76,34,255,13,
+12,10,142,0,32,13,11,8,170,176,91,23,255,202,93,21,255,196,99,21,
+255,28,19,9,170,0,8,11,9,6,85,132,71,21,255,195,99,22,255,103,
+59,20,255,11,10,6,170,3,3,2,25,6,6,5,110,55,35,16,255,198,
+113,29,255,212,134,51,255,41,32,20,210,0,68,21,19,14,215,217,163,86,
+255,49,38,24,255,0,12,11,10,8,82,54,43,27,255,200,135,59,255,210,
+137,59,255,207,131,50,255,205,127,44,255,199,117,36,255,195,111,28,255,187,
+101,24,255,93,54,22,255,19,15,10,227,7,6,6,28,0,8,10,9,7,
+170,195,109,32,255,218,138,53,255,224,158,81,255,223,173,95,255,219,167,94,
+255,217,169,94,255,218,171,97,255,217,166,92,255,208,136,59,255,110,68,27,
+255,19,15,10,227,6,6,5,28,0,12,12,11,7,170,61,42,20,255,188,
+106,33,255,208,134,55,255,215,163,82,255,217,166,92,255,216,167,88,255,216,
+167,89,255,211,150,70,255,146,94,39,255,26,21,15,229,9,8,6,28,0,
+12,12,10,7,170,51,32,14,255,151,80,22,255,169,91,22,255,173,86,22,
+255,169,88,22,255,173,86,22,255,180,92,21,255,194,98,21,255,196,95,21,
+255,192,97,21,255,31,21,10,170,0,12,12,10,7,170,57,37,18,255,189,
+107,34,255,212,149,67,255,217,166,92,255,217,166,92,255,218,171,97,255,215,
+163,82,255,205,126,48,255,116,72,29,255,20,16,11,227,6,6,5,28,0,
+8,11,9,6,68,126,68,21,255,191,98,22,255,194,98,21,255,192,97,21,
+255,192,97,21,255,191,98,22,255,177,91,22,255,26,19,9,142,0,12,12,
+10,7,170,58,37,17,255,185,107,30,255,208,134,55,255,216,167,88,255,218,
+171,97,255,217,166,92,255,213,148,72,255,204,130,51,255,209,141,60,255,211,
+159,76,255,30,25,17,170,0,8,10,10,7,167,210,155,77,255,228,178,99,
+255,224,165,81,255,221,165,86,255,217,166,92,255,218,169,93,255,217,166,92,
+255,214,156,81,255,206,135,51,255,116,72,29,255,20,16,11,227,6,6,5,
+28,0,8,13,10,6,57,115,62,20,255,169,91,22,255,165,86,22,255,24,
+18,9,167,0,24,12,10,7,88,117,63,20,255,186,100,23,255,191,107,32,
+255,35,27,16,144,0,8,10,10,7,170,210,155,77,255,228,178,99,255,221,
+152,70,255,24,19,13,255,0,8,12,10,7,170,58,36,15,255,157,79,22,
+255,151,80,22,255,58,35,15,255,11,9,6,57,0,8,12,10,7,85,157,
+81,20,255,197,99,20,255,192,97,21,255,28,20,9,170,0,8,11,9,6,
+57,115,62,20,255,189,94,24,255,198,117,37,255,213,157,76,255,218,171,97,
+255,217,169,94,255,214,161,85,255,213,157,76,255,212,149,67,255,208,134,55,
+255,205,126,48,255,143,96,40,255,28,26,19,229,8,8,7,28,0,8,13,
+12,8,85,141,74,24,255,190,94,23,255,183,95,24,255,183,95,24,255,187,
+93,24,255,189,97,22,255,181,93,22,255,177,91,22,255,169,88,22,255,89,
+52,20,255,21,18,12,227,9,9,8,28,0,12,18,17,13,181,103,74,40,
+255,207,146,74,255,214,156,81,255,210,144,67,255,208,138,55,255,207,129,52,
+255,205,133,48,255,205,126,48,255,151,101,42,255,28,26,19,232,9,8,8,
+28,0,8,13,12,10,110,186,127,63,255,214,156,81,255,213,158,80,255,213,
+155,80,255,214,156,81,255,214,153,75,255,213,148,72,255,213,148,72,255,211,
+150,70,255,159,111,54,255,28,25,19,241,9,8,8,31,0,12,18,17,13,
+181,103,74,40,255,208,156,81,255,214,156,81,255,208,138,55,255,209,137,60,
+255,213,158,80,255,213,155,80,255,213,160,84,255,215,160,88,255,213,163,84,
+255,30,24,17,178,0,8,12,11,9,93,178,121,53,255,213,158,80,255,210,
+143,65,255,211,146,62,255,213,148,72,255,215,163,82,255,213,158,80,255,212,
+149,67,255,209,141,60,255,153,106,49,255,28,25,19,235,9,9,8,31,0,
+12,18,15,11,173,66,43,21,255,187,101,32,255,207,132,52,255,210,144,67,
+255,213,148,72,255,214,156,81,255,216,167,88,255,214,156,81,255,176,128,65,
+255,46,39,27,255,0,12,15,14,10,85,181,111,42,255,215,136,52,255,213,
+125,40,255,211,122,36,255,212,123,37,255,210,123,39,255,202,122,37,255,31,
+24,14,170,0,8,12,11,9,88,164,89,29,255,203,122,36,255,199,117,36,
+255,30,23,15,212,0,12,15,13,10,127,187,133,62,255,213,148,72,255,208,
+138,55,255,31,24,16,170,0,8,13,12,10,85,172,104,37,255,209,134,54,
+255,206,135,51,255,32,25,17,212,0,12,15,13,10,127,181,116,46,255,211,
+143,62,255,210,153,71,255,29,24,16,178,0,8,13,12,10,91,178,121,53,
+255,213,154,70,255,208,134,55,255,31,25,16,210,0,20,15,14,10,125,179,
+110,42,255,210,135,55,255,208,139,65,255,26,21,15,184,0,8,14,13,9,
+85,179,117,44,255,217,165,82,255,213,163,84,255,27,23,16,221,0,12,14,
+12,9,136,174,103,39,255,206,127,43,255,199,117,36,255,31,24,14,170,0,
+8,12,11,9,88,164,89,29,255,202,118,35,255,196,114,33,255,29,22,14,
+210,0,12,14,12,9,125,169,95,30,255,202,119,37,255,199,119,39,255,24,
+19,13,190,0,8,14,12,9,85,170,95,29,255,198,113,29,255,199,116,34,
+255,204,128,47,255,206,135,51,255,204,129,49,255,204,129,49,255,208,134,55,
+255,211,149,76,255,192,140,73,255,95,74,39,255,17,15,12,85,0,16,14,
+12,9,198,211,150,70,255,206,152,81,255,31,26,20,255,7,7,6,48,0,
+16,15,13,10,170,211,149,76,255,226,170,91,255,226,172,95,255,35,28,18,
+255,0,20,15,14,12,218,171,120,60,255,219,154,70,255,41,31,20,255,4,
+4,3,28,0,104,17,16,12,170,219,179,116,255,232,193,137,255,232,199,135,
+255,40,33,23,255,0,12,10,10,9,76,62,50,31,255,20,18,13,167,0,
+12,11,10,8,76,58,46,29,255,20,18,13,167,0,16,13,12,10,170,210,
+150,71,255,223,147,72,255,221,150,66,255,26,21,15,210,0,4,11,10,8,
+119,211,159,84,255,229,184,114,255,230,186,123,255,30,26,19,255,0,16,12,
+11,9,93,137,90,40,255,223,167,94,255,228,180,111,255,167,133,80,255,17,
+16,14,227,11,11,10,170,12,11,9,170,12,11,9,170,12,11,9,119,7,
+7,6,57,0,36,7,7,6,62,21,18,12,227,157,92,28,255,203,105,26,
+255,197,106,26,255,82,48,21,255,14,12,7,173,5,5,4,8,0,16,8,
+7,5,28,26,19,11,227,103,68,25,255,158,96,29,255,57,41,22,255,13,
+12,10,241,33,26,16,255,146,88,31,255,66,47,23,255,12,10,9,201,6,
+5,5,14,0,32,8,7,5,57,30,22,11,255,15,12,8,96,0,8,10,
+10,7,130,190,104,27,255,209,118,30,255,211,117,34,255,27,21,14,255,0,
+24,13,12,10,170,199,122,39,255,218,130,51,255,223,146,70,255,30,24,17,
+255,0,12,23,22,18,139,30,27,21,170,16,15,11,255,89,59,26,255,203,
+110,28,255,196,113,31,255,122,81,33,255,186,117,43,255,216,129,51,255,184,
+126,57,255,38,34,25,255,24,22,19,221,33,30,24,170,15,15,12,28,0,
+12,24,22,19,142,32,31,25,170,21,20,16,198,90,71,45,255,223,179,110,
+255,226,172,95,255,221,150,66,255,143,100,44,255,22,21,17,227,28,27,21,
+170,29,28,22,170,13,13,12,42,0,36,8,8,8,11,25,24,20,142,39,
+35,28,170,30,28,23,170,29,27,22,170,29,27,22,170,29,27,22,170,29,
+27,22,170,29,27,20,170,23,21,16,170,14,13,11,34,0,52,13,12,10,
+159,142,86,31,255,208,116,35,255,201,119,38,255,32,26,17,255,5,5,4,
+28,0,12,14,13,11,170,216,167,97,255,231,184,124,255,231,193,128,255,181,
+146,92,255,52,44,33,255,90,71,45,255,201,155,88,255,223,173,102,255,228,
+179,115,255,230,183,123,255,230,184,119,255,39,32,22,255,0,24,12,12,11,
+170,206,139,61,255,226,164,91,255,228,174,103,255,39,32,22,255,0,48,6,
+6,5,28,9,9,8,142,56,46,31,255,222,180,113,255,230,187,119,255,222,
+180,113,255,23,21,16,255,0,36,15,14,12,164,79,59,30,255,209,128,42,
+255,211,127,44,255,171,117,46,255,18,15,11,170,0,16,9,9,8,116,33,
+28,16,255,161,94,28,255,199,107,26,255,65,40,18,255,8,7,5,255,25,
+20,12,255,198,113,29,255,210,120,33,255,217,133,50,255,27,23,16,255,0,
+8,7,7,6,23,34,28,19,198,46,36,25,255,39,31,22,255,41,33,22,
+255,59,46,28,255,51,40,26,255,61,47,28,255,180,133,71,255,227,175,100,
+255,226,175,103,255,181,143,88,255,17,16,12,142,0,8,11,11,10,170,214,
+166,97,255,229,179,114,255,228,185,111,255,161,121,68,255,23,21,16,227,23,
+22,18,170,22,21,17,170,16,15,13,170,11,11,8,147,8,8,7,85,0,
+40,14,13,11,170,181,143,88,255,228,185,123,255,218,168,97,255,70,54,35,
+255,9,9,8,113,0,12,11,10,8,85,120,87,45,255,223,183,120,255,231,
+190,132,255,167,135,80,255,24,22,19,227,19,18,16,170,19,18,16,198,95,
+80,46,255,226,193,129,255,228,187,129,255,186,148,87,255,15,14,12,170,0,
+8,10,10,9,85,155,113,64,255,229,196,132,255,232,191,133,255,179,142,90,
+255,27,25,20,227,18,18,15,170,19,18,16,198,90,71,45,255,222,175,101,
+255,227,174,98,255,228,185,111,255,28,25,19,255,0,8,7,7,6,23,34,
+28,19,198,49,35,22,255,39,29,18,227,12,11,9,85,0,8,8,7,7,
+28,33,26,16,198,52,39,23,255,47,35,22,227,13,12,8,85,0,8,8,
+8,7,28,33,30,24,227,201,157,100,255,230,186,123,255,181,137,74,255,16,
+15,11,207,6,6,5,23,0,24,11,10,8,28,27,21,12,193,26,19,11,
+255,23,18,10,255,23,18,10,255,24,18,11,255,24,18,11,255,26,20,11,
+255,35,27,16,255,42,31,19,241,17,14,10,85,0,28,9,9,8,144,91,
+67,36,255,217,154,72,255,211,150,70,255,69,55,34,255,15,14,12,85,0,
+28,6,6,5,11,11,11,10,142,24,22,19,255,167,135,80,255,225,172,104,
+255,224,166,83,255,193,126,54,255,16,14,11,170,0,8,13,12,8,85,185,
+97,26,255,207,112,28,255,204,110,27,255,71,46,22,255,8,8,7,255,28,
+22,13,255,198,107,27,255,193,111,30,255,126,78,31,255,199,139,62,255,226,
+184,111,255,27,24,18,255,0,8,11,10,8,170,214,166,97,255,230,187,119,
+255,228,179,103,255,143,102,48,255,17,16,12,227,12,12,9,170,13,12,10,
+198,46,33,17,255,199,112,28,255,206,111,27,255,204,110,27,255,32,23,13,
+176,0,8,12,11,9,136,204,134,59,255,226,172,95,255,228,181,107,255,162,
+125,73,255,24,22,19,227,19,18,16,170,19,18,16,198,95,80,46,255,224,
+179,109,255,223,173,95,255,173,117,50,255,15,13,10,156,0,8,12,11,7,
+99,185,97,26,255,208,112,27,255,204,110,27,255,22,18,11,255,0,40,16,
+15,13,170,219,179,116,255,232,194,133,255,231,193,128,255,40,33,23,255,0,
+12,16,15,13,170,219,177,112,255,230,187,119,255,224,159,83,255,24,21,15,
+255,0,8,11,10,8,164,211,158,82,255,229,184,114,255,230,191,123,255,166,
+127,77,255,22,21,17,227,22,21,17,170,20,19,13,170,14,13,11,28,0,
+16,12,11,9,170,195,112,30,255,209,106,30,255,206,111,27,255,101,63,26,
+255,16,14,11,227,23,21,16,170,29,27,22,170,13,13,12,42,0,16,16,
+15,13,170,216,167,97,255,224,158,87,255,216,125,45,255,24,20,13,255,0,
+40,17,16,12,170,219,177,112,255,232,195,137,255,231,189,128,255,162,125,73,
+255,22,21,17,227,14,14,11,170,13,12,10,198,50,35,19,255,199,112,28,
+255,206,111,27,255,204,110,27,255,32,24,13,170,0,8,13,12,8,93,194,
+109,33,255,219,139,54,255,224,158,81,255,39,32,22,255,0,40,11,10,8,
+170,190,104,27,255,208,112,27,255,204,110,27,255,32,24,13,170,0,8,13,
+12,8,85,184,96,25,255,207,112,28,255,204,102,27,255,129,78,28,255,31,
+26,16,255,127,84,34,255,219,147,70,255,173,122,62,255,15,14,12,212,6,
+6,5,25,0,16,16,15,13,170,213,155,80,255,221,144,68,255,217,130,52,
+255,31,25,16,255,0,32,10,9,7,170,189,99,26,255,208,112,27,255,204,
+110,27,255,155,87,26,255,72,46,21,255,179,103,36,255,223,156,76,255,216,
+170,97,255,134,96,47,255,174,127,71,255,221,167,90,255,223,147,72,255,222,
+158,75,255,23,19,14,252,0,8,11,10,8,170,214,166,97,255,231,187,124,
+255,230,191,123,255,228,182,117,255,222,175,101,255,64,50,33,255,7,7,6,
+229,26,23,19,255,220,175,105,255,228,183,113,255,228,188,117,255,25,21,16,
+255,0,8,11,10,8,170,217,176,112,255,232,197,137,255,232,199,135,255,37,
+31,22,255,0,12,13,12,10,170,198,117,37,255,215,127,42,255,217,130,52,
+255,21,19,14,255,0,8,11,10,8,167,215,172,104,255,232,191,133,255,231,
+190,132,255,166,127,77,255,23,21,16,227,18,17,15,170,17,16,12,198,74,
+52,27,255,204,117,33,255,211,111,30,255,173,93,28,255,15,12,8,164,0,
+8,13,12,8,88,185,97,26,255,208,112,27,255,204,110,27,255,19,16,10,
+255,0,12,10,9,7,170,190,104,27,255,212,118,35,255,216,136,51,255,21,
+19,14,252,0,8,11,10,8,167,215,172,104,255,232,194,127,255,231,193,128,
+255,166,129,77,255,23,21,16,227,19,18,16,170,19,18,14,198,81,59,34,
+255,213,144,62,255,215,140,60,255,165,108,40,255,13,12,10,167,0,8,8,
+8,7,85,101,63,26,255,206,114,33,255,212,121,33,255,155,92,36,255,23,
+21,16,227,22,21,17,170,28,26,21,170,21,20,18,170,13,13,12,164,10,
+10,9,85,6,6,6,6,0,28,12,11,9,170,194,112,31,255,212,119,37,
+255,216,134,45,255,35,28,18,255,0,24,16,15,13,170,217,171,106,255,231,
+187,124,255,228,181,107,255,39,32,22,255,0,12,16,15,11,170,208,134,55,
+255,223,156,70,255,221,148,70,255,23,20,14,238,0,8,11,10,8,170,204,
+136,55,255,223,156,70,255,222,158,75,255,34,28,19,255,0,12,14,13,11,
+170,217,171,106,255,232,189,127,255,230,186,123,255,25,22,16,255,0,8,10,
+10,9,167,210,155,77,255,226,172,95,255,224,165,81,255,31,26,18,255,0,
+20,15,13,12,170,217,173,104,255,232,191,133,255,231,195,132,255,40,33,23,
+255,0,20,10,9,9,133,73,58,36,255,225,184,120,255,231,193,128,255,228,
+180,111,255,147,102,48,255,15,13,10,227,8,7,7,28,0,24,12,11,7,
+198,100,59,23,255,169,93,26,255,156,91,27,255,174,96,27,255,180,99,27,
+255,168,97,27,255,105,62,24,255,18,15,9,255,7,6,6,48,0,24,7,
+7,7,28,15,15,12,227,144,114,67,255,219,177,112,255,223,176,102,255,153,
+113,62,255,17,16,12,227,7,7,6,28,0,16,16,15,13,170,213,155,80,
+255,223,146,70,255,217,129,50,255,27,22,14,255,0,24,12,10,9,195,161,
+94,28,255,207,114,32,255,193,114,36,255,23,20,16,255,0,32,12,11,9,
+170,191,105,28,255,207,100,28,255,204,110,27,255,26,20,11,204,0,8,6,
+5,5,3,26,19,9,198,24,18,9,246,15,12,8,142,0,12,15,13,10,
+91,31,24,16,244,51,39,24,255,21,19,14,91,0,68,10,10,9,76,61,
+49,30,255,20,18,13,156,0,16,17,15,12,142,27,22,14,232,30,22,13,
+255,25,20,12,255,22,18,11,238,21,16,10,255,99,58,22,255,203,113,26,
+255,205,111,28,255,131,80,30,255,12,11,9,142,0,8,11,10,8,170,212,
+160,85,255,232,191,127,255,231,195,132,255,196,155,91,255,81,59,34,255,41,
+32,20,255,54,43,27,255,180,133,71,255,216,144,59,255,208,115,33,255,129,
+78,28,255,12,11,7,142,0,8,8,7,7,57,72,52,29,255,215,155,78,
+255,227,174,98,255,207,158,94,255,85,63,34,255,36,29,19,255,57,43,26,
+255,189,130,66,255,219,149,66,255,212,121,41,255,172,105,33,255,17,15,10,
+147,0,8,7,6,6,54,58,40,21,255,198,113,29,255,206,103,27,255,165,
+87,24,255,42,28,13,255,21,16,8,255,27,20,10,255,95,60,22,255,202,
+105,27,255,206,100,29,255,204,110,27,255,35,24,12,170,0,8,7,7,6,
+54,70,50,27,255,212,145,65,255,227,174,98,255,201,155,88,255,59,44,28,
+255,23,20,14,255,34,28,19,255,157,104,48,255,211,126,42,255,208,115,33,
+255,132,82,29,255,13,11,8,142,0,12,24,18,9,221,108,61,23,255,201,
+112,26,255,207,112,28,255,204,110,27,255,158,91,25,255,46,29,13,249,11,
+10,6,57,0,8,8,8,7,57,70,50,27,255,212,142,59,255,226,172,95,
+255,207,158,94,255,85,63,34,255,41,32,20,255,57,43,26,255,174,124,59,
+255,224,170,93,255,229,184,114,255,231,196,128,255,28,25,19,255,0,8,10,
+10,9,167,215,169,102,255,232,191,127,255,231,193,128,255,196,154,87,255,77,
+59,34,255,41,31,20,255,54,43,27,255,168,113,49,255,212,121,41,255,206,
+114,33,255,132,82,29,255,12,11,9,130,0,8,12,11,7,110,188,98,25,
+255,206,111,27,255,206,106,25,255,26,19,11,255,0,24,14,12,9,170,199,
+117,36,255,221,148,62,255,227,174,98,255,28,26,19,255,0,8,10,10,9,
+167,212,161,89,255,224,166,83,255,217,129,50,255,32,24,15,255,5,5,4,
+31,7,7,6,136,65,44,22,255,192,106,29,255,203,108,24,255,114,66,23,
+255,17,13,8,221,0,12,10,9,7,139,185,97,26,255,208,112,27,255,208,
+117,29,255,32,24,13,170,0,8,15,13,8,91,189,99,26,255,215,123,42,
+255,226,172,95,255,198,152,87,255,81,58,34,255,176,133,71,255,224,168,95,
+255,197,138,62,255,65,47,26,255,133,81,30,255,208,121,37,255,212,115,37,
+255,152,98,35,255,12,11,9,142,0,8,10,9,7,147,190,107,25,255,206,
+111,27,255,206,106,25,255,158,91,25,255,42,28,13,255,21,15,8,255,26,
+19,9,255,114,66,23,255,204,113,25,255,208,115,33,255,173,122,62,255,16,
+15,13,150,0,8,8,8,7,71,110,87,51,255,222,180,113,255,224,166,83,
+255,209,137,60,255,133,84,32,255,77,50,24,255,89,59,26,255,181,109,32,
+255,210,121,35,255,212,121,41,255,171,116,52,255,15,14,12,142,0,8,14,
+13,11,170,219,177,112,255,231,187,124,255,228,180,111,255,205,158,90,255,79,
+58,32,255,38,29,19,255,49,35,22,255,167,114,46,255,217,146,62,255,219,
+154,70,255,169,117,56,255,15,13,12,156,0,8,8,8,7,71,104,80,45,
+255,224,183,119,255,232,191,127,255,210,166,97,255,81,60,32,255,39,30,18,
+255,52,40,25,255,175,128,66,255,225,173,98,255,228,180,105,255,226,175,95,
+255,29,25,18,255,0,8,12,12,11,170,208,138,55,255,222,145,63,255,220,
+139,59,255,193,121,50,255,68,50,29,255,38,28,19,255,48,35,23,255,175,
+112,44,255,217,142,54,255,217,144,66,255,191,137,66,255,19,16,12,170,0,
+8,9,8,8,74,111,82,40,255,216,155,75,255,226,172,95,255,200,151,81,
+255,57,41,26,255,27,23,16,255,35,28,18,255,41,32,20,255,39,30,20,
+255,25,22,16,227,15,14,10,142,0,12,10,9,7,28,33,24,14,227,135,
+81,28,255,206,117,31,255,210,108,33,255,208,110,31,255,171,92,28,255,49,
+33,16,252,13,11,8,68,0,8,11,10,8,170,195,108,30,255,212,118,35,
+255,217,137,52,255,42,33,23,255,0,12,20,18,15,170,214,156,81,255,221,
+148,62,255,214,127,43,255,23,19,12,238,0,8,10,10,7,159,196,109,31,
+255,213,119,36,255,212,123,37,255,31,24,14,255,0,12,15,14,10,170,209,
+137,60,255,228,172,99,255,230,189,119,255,28,26,19,255,0,8,12,12,11,
+170,208,134,55,255,218,137,51,255,214,127,43,255,35,27,16,255,0,20,16,
+14,11,170,199,116,34,255,217,132,48,255,224,166,83,255,32,26,19,255,0,
+8,10,10,7,34,81,58,34,255,224,178,105,255,226,172,95,255,129,92,40,
+255,9,9,8,170,6,6,6,85,6,6,5,113,35,27,16,255,204,117,33,
+255,208,117,29,255,110,69,25,255,14,12,7,108,0,8,10,10,7,170,195,
+112,30,255,211,115,30,255,211,115,30,255,30,23,13,255,0,12,14,12,9,
+170,196,113,31,255,211,120,32,255,214,126,41,255,33,26,18,255,0,8,9,
+8,6,28,44,33,19,212,60,42,23,255,46,35,21,255,74,53,31,255,156,
+109,53,255,216,167,97,255,228,179,109,255,229,177,110,255,227,184,108,255,168,
+123,69,255,23,21,16,227,9,8,8,28,0,12,17,16,14,170,134,98,51,
+255,223,166,92,255,132,100,53,255,9,9,8,133,0,20,16,15,13,170,219,
+177,112,255,232,191,133,255,231,195,132,255,40,33,23,255,0,20,6,6,5,
+45,39,32,22,255,210,129,49,255,172,106,35,255,20,17,13,227,11,11,8,
+28,0,100,17,17,14,170,221,189,132,255,235,205,154,255,234,205,155,255,42,
+39,29,255,0,16,9,9,8,25,0,20,9,8,8,25,0,20,14,14,11,
+170,208,141,61,255,224,168,87,255,228,174,103,255,31,26,20,221,0,4,13,
+12,12,130,218,185,127,255,234,202,147,255,232,198,139,255,40,33,25,255,0,
+20,17,17,14,176,140,115,71,255,230,202,147,255,232,202,149,255,218,170,101,
+255,200,124,43,255,198,117,37,255,198,117,37,255,196,116,37,255,72,52,27,
+255,12,11,9,170,0,28,8,8,7,85,37,31,20,255,174,110,41,255,210,
+123,39,255,204,120,37,255,130,87,31,255,15,13,10,190,0,28,5,5,4,
+113,28,26,19,255,210,143,65,255,220,163,81,255,217,166,92,255,222,173,97,
+255,225,176,98,255,42,37,25,255,4,4,4,74,0,56,13,12,10,170,208,
+141,61,255,226,172,95,255,228,183,111,255,40,34,25,255,0,24,17,16,14,
+170,219,177,112,255,232,194,133,255,233,202,148,255,27,24,20,255,0,8,16,
+15,13,85,199,161,102,255,220,166,89,255,211,143,62,255,217,154,72,255,223,
+161,80,255,224,169,91,255,225,185,114,255,229,188,124,255,231,190,132,255,231,
+200,143,255,227,195,140,255,227,196,138,255,225,195,136,255,44,37,27,170,0,
+8,17,16,14,85,200,165,109,255,227,198,142,255,225,191,132,255,227,195,134,
+255,231,199,136,255,231,197,132,255,231,194,124,255,229,191,130,255,225,195,136,
+255,225,195,136,255,225,191,132,255,49,42,30,198,0,36,18,17,13,105,193,
+135,66,255,221,175,102,255,222,186,123,255,223,190,132,255,224,192,135,255,223,
+190,132,255,222,186,123,255,221,178,110,255,218,172,105,255,46,39,27,195,0,
+48,6,6,6,28,27,26,20,255,216,170,97,255,225,178,104,255,176,136,83,
+255,16,15,13,198,0,16,17,17,14,170,221,188,130,255,235,205,154,255,234,
+205,155,255,232,204,149,255,228,199,143,255,171,144,96,255,64,57,41,255,154,
+126,81,255,227,189,122,255,230,184,119,255,227,171,98,255,34,30,21,255,0,
+24,17,16,14,170,221,186,126,255,234,202,147,255,232,192,135,255,44,39,27,
+255,0,44,9,9,8,142,25,24,20,255,114,95,53,255,207,169,102,255,227,
+187,118,255,226,188,123,255,178,148,95,255,19,18,16,170,0,32,24,22,19,
+85,197,145,84,255,227,187,118,255,231,194,124,255,207,173,114,255,61,55,38,
+255,8,8,8,136,0,12,10,10,9,108,45,36,21,255,195,116,38,255,207,
+122,38,255,139,90,32,255,13,12,8,170,0,4,10,10,9,198,208,140,59,
+255,226,170,91,255,231,193,128,255,40,35,27,255,0,36,4,4,3,28,18,
+17,13,227,222,189,131,255,234,201,143,255,229,191,130,255,34,30,23,204,0,
+8,11,11,10,170,211,158,82,255,226,170,91,255,224,165,81,255,219,154,70,
+255,208,132,51,255,206,128,45,255,204,122,41,255,201,120,40,255,196,116,37,
+255,111,74,30,255,20,18,13,227,8,8,7,28,0,28,6,6,6,28,28,
+26,21,255,222,186,123,255,229,196,132,255,181,144,92,255,16,15,13,212,0,
+16,6,6,6,85,25,24,20,255,180,149,101,255,231,205,154,255,232,204,149,
+255,227,198,142,255,223,192,138,255,223,193,136,255,230,199,139,255,232,197,141,
+255,211,176,122,255,64,57,41,255,8,8,7,113,0,8,6,6,5,14,33,
+31,24,227,186,155,107,255,232,204,149,255,233,205,152,255,227,197,140,255,221,
+189,132,255,224,192,135,255,228,198,141,255,232,201,141,255,232,192,135,255,231,
+197,132,255,41,35,26,255,0,64,17,16,14,139,211,178,120,255,233,202,148,
+255,233,202,148,255,56,48,33,255,4,4,4,85,0,104,11,11,10,255,216,
+164,89,255,230,191,123,255,227,195,134,255,40,35,27,227,0,28,16,15,13,
+227,126,105,69,255,217,176,112,255,225,175,104,255,223,159,76,255,189,124,49,
+255,43,35,20,255,9,8,8,57,0,8,10,10,9,133,194,109,33,255,215,
+125,38,255,212,124,39,255,144,93,33,255,29,24,16,255,68,53,29,255,186,
+123,49,255,128,95,47,255,25,24,20,255,143,119,78,255,230,201,145,255,33,
+30,24,255,0,8,11,11,10,170,217,176,112,255,228,182,109,255,222,158,75,
+255,212,134,51,255,204,122,41,255,198,117,37,255,200,118,37,255,208,123,39,
+255,212,123,37,255,214,121,39,255,217,133,50,255,24,21,15,244,0,8,11,
+11,10,170,218,185,127,255,235,203,148,255,233,202,148,255,230,201,145,255,227,
+197,140,255,221,187,128,255,221,184,120,255,224,178,105,255,224,164,85,255,189,
+129,58,255,39,32,20,255,7,7,6,85,0,8,11,10,8,125,194,109,33,
+255,215,125,38,255,213,125,40,255,29,24,16,255,0,40,17,17,14,170,221,
+188,130,255,235,201,152,255,232,201,141,255,42,36,27,255,0,12,17,17,14,
+170,219,179,116,255,231,187,124,255,228,183,111,255,24,22,17,255,0,8,11,
+11,10,170,218,185,127,255,232,197,137,255,227,179,104,255,219,155,72,255,208,
+132,51,255,204,122,41,255,202,120,39,255,38,31,19,170,0,16,12,11,9,
+170,196,110,33,255,215,113,38,255,213,122,42,255,215,143,58,255,217,166,92,
+255,222,186,123,255,225,195,136,255,52,44,33,198,0,16,17,16,14,170,211,
+150,70,255,219,140,56,255,213,126,42,255,25,21,14,255,0,40,17,17,14,
+170,221,187,128,255,232,199,141,255,228,180,111,255,219,155,72,255,207,128,44,
+255,199,119,39,255,200,118,37,255,208,123,39,255,212,123,37,255,214,125,39,
+255,212,124,39,255,34,26,15,181,0,8,11,10,10,161,215,172,104,255,234,
+201,143,255,234,206,151,255,42,39,29,255,0,40,12,11,9,170,196,110,33,
+255,215,125,38,255,212,124,39,255,36,28,17,170,0,8,15,14,10,85,194,
+109,33,255,215,125,38,255,212,124,39,255,210,128,41,255,211,135,54,255,225,
+176,98,255,231,197,132,255,56,48,33,255,4,4,4,85,0,20,17,16,14,
+170,206,135,51,255,217,133,50,255,213,122,42,255,25,21,14,255,0,32,12,
+11,9,170,196,110,33,255,215,125,38,255,213,122,42,255,67,51,28,255,6,
+6,5,255,40,34,25,255,226,190,127,255,138,110,69,255,7,7,7,255,25,
+24,20,255,221,179,112,255,232,191,127,255,232,201,141,255,26,23,19,255,0,
+8,11,11,10,170,214,168,101,255,230,187,119,255,228,188,117,255,212,173,105,
+255,150,118,67,255,102,86,47,255,111,90,50,255,185,145,88,255,227,187,118,
+255,231,195,132,255,232,201,141,255,26,23,19,255,0,8,11,11,10,170,219,
+184,128,255,235,205,154,255,234,206,151,255,42,36,27,255,0,12,15,15,12,
+170,213,158,80,255,228,182,109,255,230,191,123,255,27,23,18,255,0,8,11,
+11,10,170,219,189,132,255,235,205,154,255,232,197,141,255,225,185,114,255,215,
+155,78,255,206,135,51,255,205,126,42,255,209,128,42,255,212,121,41,255,181,
+111,36,255,39,30,18,255,8,8,7,57,0,8,10,10,9,136,194,109,33,
+255,215,125,38,255,212,124,39,255,24,20,13,255,0,12,15,14,12,170,210,
+146,71,255,229,183,110,255,231,197,132,255,26,23,19,255,0,8,11,11,10,
+170,218,189,127,255,234,199,143,255,231,197,132,255,225,176,106,255,214,153,75,
+255,208,138,55,255,205,133,48,255,210,127,45,255,214,134,49,255,179,119,42,
+255,37,30,18,255,7,7,6,85,0,12,23,20,14,227,161,115,50,255,222,
+167,89,255,227,186,114,255,225,190,130,255,223,198,136,255,227,198,142,255,224,
+196,141,255,221,191,134,255,161,130,86,255,33,30,24,229,10,10,9,42,0,
+24,15,15,12,170,211,149,76,255,228,182,109,255,231,189,128,255,44,39,27,
+255,0,24,17,17,14,170,216,170,97,255,226,172,95,255,224,165,81,255,31,
+26,18,255,0,12,13,12,10,170,201,120,40,255,217,133,50,255,216,125,45,
+255,25,21,14,212,0,8,11,10,8,144,203,130,52,255,224,166,83,255,228,
+174,103,255,40,34,25,255,0,12,17,16,14,170,221,187,128,255,234,201,143,
+255,230,191,123,255,28,25,19,244,0,8,10,10,9,164,203,122,50,255,220,
+148,63,255,217,141,52,255,23,20,14,255,0,8,14,13,11,108,10,10,9,
+28,0,4,13,13,12,170,221,189,134,255,235,205,154,255,234,206,151,255,42,
+37,27,255,0,24,11,11,10,255,222,189,131,255,232,195,131,255,224,162,81,
+255,36,29,19,255,4,4,4,54,0,28,7,7,6,28,19,17,12,232,93,
+66,30,255,183,112,36,255,209,122,38,255,212,120,39,255,159,102,34,255,22,
+19,13,255,7,7,6,85,0,24,6,6,5,28,17,16,14,227,149,122,84,
+255,227,195,140,255,227,191,134,255,179,142,90,255,17,16,14,227,5,5,4,
+25,0,20,15,14,12,170,204,129,49,255,218,141,51,255,213,126,42,255,25,
+21,14,255,0,24,8,7,7,91,68,48,25,255,205,127,44,255,220,153,75,
+255,99,78,44,255,8,8,7,113,0,28,12,11,9,170,196,110,33,255,215,
+125,38,255,212,124,39,255,24,20,13,255,0,124,9,9,8,25,0,40,2,
+2,1,23,9,8,6,255,199,116,34,255,215,125,38,255,212,128,45,255,27,
+24,16,207,0,8,11,11,10,170,219,184,128,255,235,205,154,255,234,205,155,
+255,58,49,35,255,5,5,4,85,0,4,4,4,3,28,16,15,11,227,204,
+122,41,255,215,126,40,255,210,123,39,255,32,25,15,170,0,8,13,13,12,
+122,208,168,99,255,234,199,143,255,234,204,151,255,63,54,38,255,5,5,4,
+85,0,4,4,4,3,28,18,17,13,215,204,127,45,255,214,125,39,255,212,
+121,41,255,34,27,15,170,0,8,13,12,10,85,185,112,34,255,215,125,38,
+255,212,123,37,255,35,28,16,255,4,4,3,85,0,4,3,3,2,28,12,
+10,9,224,198,117,37,255,215,125,38,255,212,124,39,255,34,27,15,178,0,
+8,14,13,11,113,206,162,94,255,232,199,141,255,234,207,155,255,63,53,36,
+255,4,4,3,113,0,4,3,3,3,28,10,10,9,255,200,118,37,255,215,
+125,38,255,210,123,39,255,27,22,14,227,0,12,3,3,2,6,13,11,8,
+221,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,5,4,4,
+57,0,12,15,14,12,147,206,154,87,255,232,195,137,255,234,204,151,255,63,
+54,38,255,5,5,4,85,0,4,4,4,3,28,18,16,13,227,222,189,131,
+255,235,205,152,255,234,205,155,255,27,24,20,255,0,8,11,11,10,170,219,
+184,130,255,235,205,152,255,234,205,155,255,58,49,35,255,5,5,4,85,0,
+4,4,4,3,28,14,12,9,227,199,117,36,255,215,113,38,255,210,123,39,
+255,32,25,15,170,0,8,12,12,9,102,194,109,33,255,215,125,38,255,212,
+124,39,255,27,22,14,255,0,24,18,16,13,170,217,176,110,255,234,196,143,
+255,234,204,151,255,27,24,20,255,0,8,11,10,10,170,204,134,59,255,219,
+136,54,255,213,122,42,255,72,50,27,255,8,8,7,255,25,22,14,255,195,
+116,38,255,208,123,39,255,142,91,31,255,16,14,9,193,4,4,3,17,0,
+12,11,11,8,170,198,117,37,255,219,133,56,255,221,152,70,255,27,23,16,
+221,0,8,13,12,10,99,193,113,34,255,223,156,70,255,231,193,128,255,40,
+34,25,255,4,3,3,113,17,16,12,227,208,136,59,255,45,36,21,255,4,
+3,3,113,10,9,7,207,196,110,33,255,215,125,38,255,210,128,41,255,32,
+25,15,170,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212,124,39,
+255,35,27,16,255,4,4,3,85,0,4,3,3,2,28,12,11,9,227,199,
+117,36,255,221,150,66,255,229,191,126,255,32,29,23,210,0,8,13,13,12,
+122,204,150,79,255,223,159,76,255,217,141,52,255,84,57,29,255,9,8,6,
+170,5,5,4,85,6,6,5,113,27,22,14,255,207,128,44,255,223,147,72,
+255,227,187,118,255,34,30,23,207,0,8,12,11,11,170,218,180,119,255,229,
+184,114,255,224,167,85,255,50,40,25,255,5,5,4,85,0,4,4,4,3,
+28,14,12,9,227,203,125,42,255,217,128,48,255,213,128,45,255,35,27,16,
+173,0,8,12,12,11,130,209,163,98,255,235,203,148,255,233,202,148,255,63,
+54,36,255,5,5,4,85,0,4,4,4,3,28,15,15,12,227,209,137,60,
+255,221,151,68,255,219,147,62,255,23,20,14,238,0,8,10,10,9,150,196,
+121,41,255,217,128,48,255,215,133,44,255,40,31,19,255,5,5,5,85,0,
+4,4,4,3,28,16,14,11,207,201,120,40,255,217,133,50,255,221,161,76,
+255,57,44,28,170,0,8,15,14,12,105,211,165,98,255,232,197,137,255,232,
+199,141,255,58,49,35,255,4,4,3,113,0,40,3,3,2,17,12,11,9,
+227,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,4,4,3,
+62,0,12,12,11,9,170,200,120,41,255,223,159,76,255,230,191,123,255,44,
+37,27,255,0,12,18,17,15,170,208,140,59,255,217,133,50,255,213,125,40,
+255,27,23,14,195,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212,
+124,39,255,25,21,14,255,0,12,17,16,14,170,219,179,116,255,235,201,152,
+255,234,204,151,255,27,24,20,255,0,8,10,10,9,170,198,122,41,255,215,
+127,42,255,213,125,40,255,27,22,14,255,0,20,12,11,9,170,201,120,40,
+255,224,156,83,255,231,190,132,255,40,33,25,255,0,12,10,10,9,85,52,
+42,29,255,200,142,59,255,183,119,44,255,72,52,27,255,39,30,18,255,49,
+37,22,255,150,99,33,255,196,116,37,255,77,50,24,255,10,9,7,144,0,
+12,10,10,9,170,196,115,35,255,215,125,38,255,212,124,39,255,25,21,14,
+255,0,12,12,11,9,170,196,110,33,255,214,127,43,255,222,158,75,255,41,
+34,24,255,0,24,5,5,4,85,11,11,10,255,130,101,59,255,223,176,102,
+255,224,176,101,255,177,137,74,255,18,17,13,227,6,5,5,28,0,12,20,
+19,15,85,186,120,49,255,217,142,62,255,217,139,56,255,34,29,19,255,4,
+4,3,17,0,20,17,17,14,170,221,188,130,255,235,205,152,255,234,205,155,
+255,42,39,29,255,0,24,13,13,10,181,199,119,39,255,212,121,41,255,203,
+121,40,255,35,29,17,170,0,100,20,18,15,170,222,186,123,255,234,201,143,
+255,232,197,135,255,47,40,28,255,0,64,14,13,11,170,213,160,84,255,230,
+187,119,255,231,197,132,255,35,30,22,198,0,4,14,13,11,108,217,176,112,
+255,232,193,137,255,231,197,132,255,33,28,22,255,0,24,12,12,11,113,31,
+29,22,210,40,35,27,255,41,34,24,255,29,24,16,255,32,26,17,255,146,
+92,35,255,214,134,49,255,212,128,45,255,123,81,36,255,15,13,10,142,0,
+20,7,7,6,85,28,26,19,252,194,140,71,255,212,127,43,255,202,118,35,
+255,97,66,30,255,15,14,10,207,6,6,5,25,0,24,6,6,5,8,15,
+13,12,227,111,86,50,255,209,168,102,255,176,136,83,255,85,67,44,255,163,
+129,80,255,221,186,126,255,83,69,44,255,7,7,6,170,5,5,5,8,0,
+4,9,9,8,108,20,18,13,170,13,12,10,51,0,36,16,15,13,170,217,
+176,110,255,232,194,133,255,232,198,139,255,36,33,25,255,0,24,15,15,12,
+170,219,179,116,255,232,193,137,255,232,199,135,255,31,26,20,255,0,8,11,
+11,10,28,56,48,33,227,98,76,45,255,104,80,45,255,195,154,96,255,227,
+186,114,255,226,189,125,255,207,173,114,255,222,188,123,255,231,190,132,255,217,
+188,124,255,137,109,70,255,99,86,54,255,78,64,43,255,21,20,16,85,0,
+8,12,12,11,28,54,48,35,227,86,72,47,255,74,63,43,255,171,137,84,
+255,229,191,130,255,230,191,123,255,230,186,123,255,202,164,105,255,97,80,50,
+255,75,64,44,255,72,61,39,255,22,21,17,102,0,36,12,11,11,45,55,
+45,30,227,90,71,45,255,78,63,41,255,72,61,39,255,74,63,43,255,72,
+61,39,255,72,61,39,255,91,74,46,255,78,63,41,255,22,20,17,102,0,
+48,12,12,11,176,132,106,61,255,228,188,125,255,210,172,113,255,42,37,29,
+255,9,9,8,62,0,16,17,16,14,170,221,186,124,255,234,199,143,255,232,
+201,141,255,232,201,141,255,221,189,134,255,52,46,33,255,6,7,6,227,24,
+23,17,255,208,132,51,255,215,133,44,255,212,124,39,255,24,20,13,255,0,
+24,17,16,12,170,219,177,112,255,231,187,124,255,228,182,109,255,40,33,23,
+255,0,36,9,9,8,74,17,15,12,227,67,51,28,255,162,107,43,255,200,
+142,67,255,204,157,91,255,177,140,86,255,74,63,43,255,19,17,16,198,9,
+9,8,28,0,32,14,14,11,31,56,46,31,227,192,157,103,255,229,194,128,
+255,225,188,124,255,146,112,67,255,11,10,8,164,0,8,7,7,6,28,34,
+27,17,255,190,107,33,255,210,121,35,255,146,95,35,255,16,14,11,187,0,
+8,9,9,8,170,214,164,93,255,232,194,127,255,231,195,132,255,40,34,25,
+255,0,40,13,13,10,170,213,157,84,255,224,166,83,255,221,150,66,255,23,
+20,14,246,0,8,12,11,9,113,194,109,33,255,212,119,37,255,210,113,35,
+255,168,103,33,255,56,42,23,255,27,23,14,255,38,31,19,255,149,92,30,
+255,207,118,32,255,207,113,30,255,124,75,27,255,13,11,8,161,0,28,12,
+12,11,176,130,99,59,255,229,191,126,255,211,174,116,255,43,37,28,255,9,
+9,8,59,0,16,8,8,7,85,68,58,37,255,214,177,119,255,231,196,136,
+255,207,171,114,255,97,80,50,255,54,47,35,255,66,59,41,255,178,148,95,
+255,228,189,121,255,224,187,123,255,146,112,67,255,12,12,11,170,0,12,10,
+10,9,28,16,15,13,147,29,28,22,221,48,42,31,255,70,61,41,255,66,
+57,39,255,70,61,41,255,171,140,92,255,224,170,101,255,224,168,87,255,224,
+165,81,255,39,32,22,255,0,64,14,13,11,57,100,82,51,255,222,186,123,
+255,226,172,95,255,113,82,38,255,9,8,8,127,0,32,11,9,6,102,11,
+10,6,170,11,10,8,170,12,11,9,170,15,13,10,170,15,13,10,170,15,
+14,10,170,18,15,11,170,18,15,11,156,12,11,9,28,0,28,6,6,5,
+65,40,34,25,255,224,183,119,255,229,195,136,255,171,140,92,255,21,20,18,
+142,0,24,11,10,8,102,131,92,46,255,213,145,56,255,214,119,43,255,210,
+128,41,255,151,94,32,255,23,21,14,255,10,10,9,85,0,12,10,9,7,
+170,191,106,30,255,211,115,30,255,208,114,31,255,141,87,30,255,36,31,19,
+255,121,90,42,255,217,168,92,255,205,163,102,255,132,102,59,255,213,172,108,
+255,231,193,128,255,35,30,22,255,0,8,11,11,10,164,203,129,50,255,215,
+127,42,255,211,117,34,255,166,97,29,255,54,40,21,255,29,23,14,255,38,
+31,19,255,120,78,29,255,206,118,33,255,214,127,43,255,224,155,81,255,23,
+21,16,255,0,8,11,10,10,170,217,183,116,255,234,201,143,255,232,198,139,
+255,202,166,109,255,97,78,50,255,52,46,33,255,58,50,33,255,150,96,39,
+255,208,121,37,255,195,112,30,255,83,53,24,255,9,8,6,113,0,8,13,
+12,8,96,189,104,28,255,210,120,33,255,214,132,45,255,34,29,19,255,0,
+40,17,16,12,170,217,172,102,255,228,180,105,255,228,181,107,255,40,33,23,
+255,0,12,17,15,12,170,216,171,101,255,232,191,127,255,231,197,132,255,24,
+22,17,255,0,8,11,11,10,167,209,146,72,255,221,151,68,255,213,126,42,
+255,172,106,35,255,57,41,22,255,42,32,19,255,43,33,20,252,18,15,11,
+85,0,16,11,10,8,170,193,111,30,255,215,113,38,255,220,144,63,255,197,
+145,84,255,91,71,44,255,75,62,42,255,75,64,44,255,22,21,17,99,0,
+16,14,13,11,170,196,110,33,255,210,115,31,255,210,115,31,255,22,19,11,
+227,0,8,16,13,9,113,24,21,15,170,17,15,12,170,18,15,13,170,19,
+17,12,142,9,8,8,28,0,8,14,13,11,170,210,146,71,255,220,142,59,
+255,213,125,40,255,168,103,33,255,54,40,21,255,29,23,14,255,38,31,19,
+255,119,78,30,255,204,116,31,255,210,119,31,255,210,115,31,255,26,20,13,
+210,0,8,11,11,10,170,217,179,120,255,234,202,147,255,232,201,141,255,40,
+35,25,255,0,40,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31,
+255,36,25,13,170,0,8,14,12,9,85,190,105,29,255,210,107,31,255,208,
+114,31,255,187,124,42,255,143,111,56,255,210,171,109,255,229,187,128,255,131,
+99,54,255,8,8,7,156,0,20,13,12,10,170,194,112,31,255,210,107,31,
+255,210,115,31,255,22,19,11,255,0,32,11,10,8,170,193,111,30,255,215,
+125,38,255,218,141,59,255,39,33,22,255,5,5,5,28,12,12,11,170,156,
+126,83,255,27,24,20,227,5,5,5,23,14,13,11,198,219,177,112,255,232,
+191,127,255,230,191,123,255,25,22,16,249,0,8,11,10,8,153,200,120,41,
+255,214,127,43,255,213,126,42,255,93,66,32,255,11,11,10,255,34,31,23,
+255,206,152,81,255,226,179,111,255,231,189,128,255,232,192,135,255,232,201,141,
+255,25,22,18,255,0,8,11,10,10,170,215,171,102,255,228,174,105,255,222,
+158,75,255,27,24,16,255,0,12,15,15,12,170,219,177,112,255,232,193,137,
+255,232,201,141,255,25,22,18,255,0,8,11,10,10,170,215,172,104,255,228,
+182,109,255,221,155,70,255,177,114,46,255,55,42,24,255,35,28,18,255,41,
+31,18,255,35,28,17,255,27,22,14,255,17,16,12,187,9,9,8,79,0,
+12,10,9,7,170,191,106,30,255,211,115,30,255,210,115,31,255,33,25,14,
+255,0,12,21,20,16,170,221,180,116,255,232,193,137,255,232,201,141,255,25,
+22,18,255,0,8,11,11,10,170,212,160,85,255,224,156,83,255,218,141,59,
+255,175,115,44,255,55,42,24,255,31,25,16,255,38,30,19,255,127,82,30,
+255,204,116,31,255,195,112,30,255,82,55,25,255,11,10,8,150,0,12,9,
+9,8,28,15,14,12,142,28,25,19,221,46,40,29,255,71,60,38,255,66,
+57,39,255,70,61,41,255,193,159,106,255,227,184,108,255,221,153,72,255,155,
+98,36,255,13,12,10,170,0,24,17,15,12,170,219,180,112,255,232,197,137,
+255,232,201,141,255,40,35,25,255,0,24,14,13,11,170,198,117,37,255,213,
+124,38,255,210,121,35,255,23,19,12,255,0,12,11,10,8,170,193,111,30,
+255,211,115,30,255,208,114,31,255,23,19,12,207,0,8,14,13,11,85,181,
+132,68,255,228,185,117,255,231,193,128,255,54,46,31,255,5,5,4,8,0,
+8,21,20,16,178,215,160,88,255,223,147,72,255,206,135,51,255,23,20,14,
+170,0,8,12,11,9,102,192,111,31,255,210,108,33,255,208,114,31,255,22,
+18,11,255,0,4,10,10,9,113,79,61,38,255,17,16,12,198,0,4,16,
+15,13,170,219,179,116,255,231,187,124,255,224,169,91,255,33,28,20,255,0,
+20,9,8,8,85,39,33,24,255,217,166,92,255,219,140,56,255,210,121,35,
+255,66,44,21,255,7,7,6,133,0,32,6,6,5,74,19,18,12,255,183,
+102,30,255,207,105,30,255,210,111,31,255,73,51,24,255,8,8,7,116,0,
+24,6,6,6,28,15,13,12,227,144,112,61,255,221,180,116,255,224,178,113,
+255,152,116,65,255,18,17,13,221,8,8,7,28,0,24,12,10,9,170,193,
+111,30,255,210,107,31,255,210,115,31,255,22,19,11,255,0,28,16,15,13,
+227,164,122,63,255,225,185,114,255,192,153,97,255,21,19,16,232,7,7,6,
+28,0,24,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31,255,23,
+19,12,255,0,148,6,6,5,51,11,9,6,85,12,10,7,102,10,8,5,
+156,10,8,5,127,8,7,5,184,27,22,12,255,198,105,29,255,211,122,36,
+255,220,136,61,255,25,22,16,255,0,8,10,10,9,170,218,181,123,255,234,
+202,147,255,232,197,141,255,30,27,21,255,0,12,9,8,6,170,191,106,30,
+255,211,115,30,255,210,111,31,255,39,27,14,170,0,8,12,11,11,170,218,
+180,119,255,234,196,143,255,232,201,141,255,29,26,20,255,0,12,7,7,6,
+28,27,22,14,156,25,22,14,255,32,25,15,210,22,18,11,28,0,8,10,
+9,7,150,195,112,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0,
+12,9,9,8,170,191,106,30,255,211,111,30,255,208,114,31,255,25,20,12,
+204,0,8,12,11,11,170,218,180,119,255,234,202,147,255,232,201,141,255,142,
+111,63,255,14,12,9,227,10,9,7,127,8,7,5,181,35,25,14,255,199,
+112,28,255,209,118,30,255,209,117,28,255,30,22,13,255,0,16,9,8,6,
+167,191,106,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0,16,21,
+19,16,170,220,178,113,255,232,197,137,255,232,201,141,255,26,23,19,255,0,
+12,11,11,10,170,218,181,123,255,234,201,143,255,231,197,132,255,24,22,17,
+255,0,8,11,10,10,170,218,181,123,255,234,201,143,255,231,197,132,255,30,
+26,21,255,0,12,9,8,6,167,191,106,30,255,211,115,30,255,210,111,31,
+255,39,27,14,170,0,8,13,12,8,85,190,105,29,255,213,119,36,255,214,
+132,45,255,32,26,17,255,0,24,17,16,14,170,221,186,124,255,234,202,147,
+255,232,199,135,255,25,22,18,252,0,8,11,10,8,127,192,111,31,255,210,
+107,31,255,208,114,31,255,161,94,28,255,65,43,20,255,145,85,26,255,207,
+117,30,255,122,75,29,255,15,14,10,170,5,5,4,8,0,16,11,10,8,
+170,196,115,35,255,223,146,70,255,228,183,111,255,25,22,16,252,0,8,14,
+12,9,85,190,105,29,255,215,125,38,255,218,141,59,255,30,24,17,195,0,
+4,10,10,7,170,193,111,30,255,20,17,11,252,0,4,11,10,8,85,188,
+103,27,255,211,115,30,255,209,106,30,255,39,27,14,170,0,8,13,12,8,
+85,190,105,29,255,211,115,30,255,210,115,31,255,19,15,10,255,0,12,9,
+8,6,167,192,111,31,255,218,137,51,255,227,175,100,255,27,24,18,255,0,
+8,11,10,8,147,196,106,33,255,210,108,33,255,210,115,31,255,30,23,13,
+255,4,4,3,14,0,8,15,14,12,195,211,149,76,255,229,184,114,255,232,
+199,135,255,28,25,19,255,0,8,11,10,8,167,203,129,50,255,215,127,42,
+255,210,121,35,255,20,17,11,232,0,12,9,8,6,139,190,105,29,255,211,
+111,30,255,209,114,30,255,30,22,13,198,0,8,13,12,10,170,217,173,104,
+255,232,193,137,255,232,194,139,255,25,22,18,255,0,12,9,8,8,156,192,
+111,31,255,210,108,33,255,210,115,31,255,32,24,13,173,0,8,13,12,8,
+88,190,105,29,255,211,115,30,255,208,114,31,255,19,15,10,255,0,12,7,
+7,6,28,27,22,14,198,45,36,21,255,52,43,29,244,14,13,11,85,0,
+8,13,13,12,88,177,143,90,255,230,194,131,255,226,172,95,255,137,91,36,
+255,10,9,7,227,8,8,5,161,10,9,7,167,10,9,7,136,13,10,6,
+85,7,6,6,74,0,24,9,8,6,167,191,106,30,255,211,115,30,255,210,
+115,31,255,19,15,10,252,0,16,12,11,9,170,208,141,61,255,230,187,119,
+255,232,201,141,255,40,34,25,255,0,12,14,12,9,170,196,109,31,255,210,
+107,31,255,210,115,31,255,36,25,13,170,0,8,10,9,7,85,155,91,28,
+255,208,114,31,255,209,106,30,255,30,22,13,255,0,12,22,21,17,176,222,
+186,123,255,234,199,143,255,226,195,135,255,35,29,22,178,0,8,12,11,9,
+105,190,105,29,255,211,115,30,255,208,114,31,255,23,19,12,210,0,8,15,
+12,8,59,7,6,4,3,0,4,9,9,8,159,204,134,59,255,230,182,119,
+255,232,198,139,255,39,33,24,255,0,16,10,10,9,34,15,14,10,198,52,
+40,21,255,165,96,28,255,198,113,29,255,185,102,28,255,80,53,25,255,19,
+17,12,227,10,9,7,76,0,16,11,10,8,170,195,112,30,255,211,115,30,
+255,210,115,31,255,20,16,11,255,0,12,10,9,7,170,192,111,31,255,215,
+125,38,255,224,159,83,255,41,33,24,255,0,24,7,7,6,108,24,20,13,
+255,146,88,31,255,195,127,38,255,113,77,34,255,15,14,12,210,7,7,6,
+28,0,16,12,12,11,28,37,30,18,227,168,99,31,255,206,114,33,255,51,
+34,18,255,6,5,5,71,0,20,17,16,14,170,221,186,124,255,234,202,147,
+255,232,201,141,255,40,35,25,255,0,24,17,15,10,227,198,105,29,255,194,
+109,33,255,62,44,23,255,16,14,11,85,0,100,19,17,12,142,214,171,97,
+255,228,183,113,255,227,186,108,255,50,40,25,227,0,64,12,11,9,198,214,
+158,85,255,229,183,110,255,228,181,107,255,21,19,14,249,2,2,1,20,8,
+8,7,181,210,156,79,255,226,169,95,255,224,155,81,255,33,26,18,255,4,
+4,4,28,0,40,3,3,2,28,11,10,8,255,209,138,62,255,223,154,72,
+255,221,164,82,255,27,23,16,249,0,16,7,7,6,79,46,38,25,255,197,
+151,84,255,222,161,89,255,209,128,42,255,141,91,32,255,15,13,10,218,5,
+5,5,11,0,28,15,13,10,139,191,131,60,255,220,168,93,255,168,123,69,
+255,14,13,11,227,5,5,5,85,9,9,8,170,105,78,40,255,162,116,61,
+255,88,66,37,255,23,21,16,255,11,11,10,255,78,58,35,255,208,150,75,
+255,61,46,28,181,0,36,15,13,10,170,216,170,97,255,230,187,119,255,228,
+178,113,255,34,28,19,255,0,24,15,13,10,170,215,167,92,255,229,179,114,
+255,228,181,107,255,32,27,19,255,0,16,6,6,6,25,5,5,4,198,52,
+42,27,255,220,169,97,255,189,142,76,255,35,31,22,255,134,96,51,255,225,
+176,106,255,140,106,53,255,6,6,5,255,6,6,6,51,0,28,5,5,5,
+28,15,13,10,227,208,136,59,255,218,138,53,255,213,122,42,255,43,31,18,
+255,5,5,4,85,0,136,9,8,8,57,57,47,30,255,212,163,93,255,224,
+157,85,255,124,90,45,255,10,10,9,147,0,20,15,13,10,170,216,170,97,
+255,228,181,107,255,224,165,81,255,194,136,61,255,58,46,29,255,12,12,11,
+85,0,4,10,9,7,156,174,91,23,255,202,103,23,255,202,102,21,255,20,
+16,9,255,0,24,15,13,10,170,213,155,80,255,227,175,100,255,227,171,98,
+255,35,29,20,255,0,32,7,7,6,85,49,33,18,255,183,108,34,255,209,
+128,42,255,209,137,60,255,186,134,67,255,95,74,39,255,22,20,15,229,8,
+8,7,105,0,44,5,4,4,28,17,15,12,227,216,167,89,255,228,181,107,
+255,223,176,102,255,34,28,19,184,0,8,12,11,9,108,180,106,33,255,214,
+125,39,255,217,141,52,255,42,33,21,255,4,4,4,85,0,8,11,10,8,
+198,211,149,76,255,224,160,77,255,220,144,63,255,34,27,17,255,0,40,12,
+10,7,170,189,99,26,255,206,102,25,255,203,100,24,255,30,21,11,176,0,
+8,12,10,7,85,167,87,22,255,202,103,23,255,202,102,21,255,27,20,10,
+255,4,4,3,68,0,4,4,4,4,28,12,10,7,215,176,91,23,255,203,
+104,24,255,202,105,27,255,28,21,13,249,0,24,9,8,8,57,57,47,30,
+255,213,167,94,255,228,184,115,255,126,92,47,255,9,9,8,147,0,20,13,
+12,10,167,199,131,58,255,220,148,63,255,219,147,62,255,49,38,24,255,6,
+6,6,85,0,4,5,5,5,28,15,14,12,227,217,169,94,255,228,183,111,
+255,225,174,102,255,31,25,18,241,0,36,5,5,5,28,15,13,10,227,204,
+127,45,255,219,133,56,255,221,150,66,255,35,28,18,255,0,68,10,9,9,
+85,45,34,21,255,201,110,30,255,192,100,25,255,57,35,16,255,12,10,7,
+85,0,24,13,11,6,79,126,68,21,255,191,100,26,255,198,117,37,255,208,
+139,65,255,213,155,80,255,214,161,85,255,215,167,92,255,216,167,89,255,215,
+160,88,255,49,38,24,170,0,24,7,7,6,76,45,36,24,249,207,164,90,
+255,228,183,111,255,143,111,56,255,13,12,10,170,0,28,13,12,8,142,182,
+99,25,255,203,108,24,255,202,102,21,255,112,65,23,255,15,13,8,227,6,
+6,5,45,0,16,10,8,7,170,171,89,22,255,202,95,23,255,202,103,23,
+255,103,64,26,255,20,18,13,255,79,61,36,255,222,173,97,255,227,179,104,
+255,224,172,97,255,226,171,99,255,224,176,93,255,36,29,19,207,0,8,12,
+10,7,113,176,91,23,255,202,95,23,255,202,102,21,255,27,20,10,255,4,
+4,3,74,0,4,4,4,4,28,11,9,6,215,187,101,24,255,216,134,45,
+255,226,172,95,255,23,21,16,241,0,8,10,10,9,161,212,160,85,255,226,
+172,95,255,222,158,75,255,51,39,24,255,6,6,6,85,0,4,4,4,3,
+28,11,10,6,215,176,91,23,255,202,102,21,255,191,102,22,255,22,17,9,
+170,0,8,12,10,7,85,167,87,22,255,204,105,25,255,217,133,50,255,35,
+28,18,255,0,40,15,13,10,170,199,116,34,255,212,114,35,255,218,139,55,
+255,33,27,18,255,0,12,15,13,10,170,213,160,84,255,227,175,100,255,224,
+165,81,255,25,21,14,235,0,8,13,11,8,108,184,96,25,255,203,96,24,
+255,202,95,23,255,27,20,10,255,4,4,3,71,0,28,10,9,7,170,187,
+101,24,255,216,134,45,255,224,167,85,255,54,42,27,255,6,6,6,85,0,
+28,10,9,7,170,171,89,22,255,202,103,23,255,202,102,21,255,29,21,10,
+170,0,4,11,9,6,42,137,77,24,255,211,136,56,255,215,167,92,255,216,
+166,95,255,213,163,84,255,33,28,18,161,0,8,11,10,8,130,184,100,25,
+255,203,100,24,255,202,102,21,255,27,20,10,255,4,4,3,74,0,4,4,
+4,4,28,11,9,6,215,176,91,23,255,202,103,23,255,202,95,23,255,28,
+21,11,190,0,8,10,10,9,161,212,161,89,255,228,174,105,255,223,161,80,
+255,33,28,18,255,0,40,10,9,7,167,171,89,22,255,202,103,23,255,202,
+102,21,255,29,21,10,170,0,8,12,10,7,85,167,87,22,255,202,103,23,
+255,203,108,24,255,68,47,25,255,6,6,5,255,31,26,20,255,220,168,93,
+255,220,177,101,255,110,80,41,255,12,11,9,150,0,16,10,9,7,170,171,
+89,22,255,202,103,23,255,202,102,21,255,20,16,9,255,0,32,10,9,7,
+170,193,111,30,255,219,136,54,255,224,165,81,255,27,24,16,255,0,4,7,
+7,7,28,21,20,16,181,10,10,9,85,0,4,12,11,9,170,204,130,51,
+255,218,141,51,255,211,122,36,255,32,23,13,187,0,8,13,11,8,85,167,
+87,22,255,203,100,24,255,208,105,29,255,23,19,12,255,4,4,3,28,11,
+10,8,181,211,158,82,255,229,183,110,255,228,183,111,255,228,183,113,255,228,
+181,107,255,27,23,16,229,0,8,10,10,9,150,192,111,31,255,208,112,27,
+255,203,108,24,255,21,17,10,255,0,12,15,13,10,170,216,170,97,255,229,
+183,110,255,228,181,107,255,25,21,16,235,0,8,11,10,8,142,194,116,33,
+255,209,106,30,255,203,108,24,255,27,20,10,255,4,4,3,74,0,36,10,
+8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,42,28,13,255,6,
+5,5,48,0,4,6,6,6,28,21,19,14,255,221,175,102,255,229,179,114,
+255,228,181,107,255,24,20,15,246,0,8,12,11,9,127,190,104,27,255,206,
+106,25,255,202,103,23,255,27,20,10,255,4,4,3,74,0,4,4,4,4,
+28,11,10,6,215,176,91,23,255,204,105,25,255,207,122,38,255,28,22,15,
+238,0,36,5,5,5,28,15,13,10,227,195,111,28,255,204,105,25,255,197,
+100,22,255,22,17,9,224,0,24,15,13,10,170,216,170,97,255,229,184,114,
+255,228,181,107,255,34,28,19,255,0,24,10,9,7,170,174,91,23,255,202,
+103,23,255,202,102,21,255,20,16,9,252,0,12,10,9,7,170,171,89,22,
+255,202,107,23,255,206,111,27,255,22,17,11,252,0,8,8,7,7,45,73,
+59,36,255,218,174,105,255,228,178,107,255,89,67,36,255,7,7,6,113,0,
+4,5,5,4,28,20,18,13,255,199,110,30,255,202,105,27,255,88,54,23,
+255,10,9,7,113,0,8,13,11,6,85,167,87,22,255,202,95,23,255,202,
+90,23,255,32,24,13,255,4,4,3,178,19,16,12,238,212,163,93,255,66,
+52,31,255,5,5,5,184,14,13,11,255,205,133,48,255,212,114,35,255,208,
+117,29,255,29,22,14,255,0,16,12,11,9,85,101,74,38,255,189,121,49,
+255,185,104,32,255,180,98,25,255,180,93,23,255,154,82,23,255,75,44,18,
+255,11,9,6,144,0,32,10,9,7,170,157,79,22,255,202,102,21,255,202,
+102,21,255,22,17,9,255,0,28,14,13,11,224,136,98,53,255,217,165,82,
+255,213,145,56,255,150,92,35,255,19,16,12,173,5,5,5,8,0,28,10,
+8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,20,16,9,252,0,
+28,7,7,6,59,43,35,24,255,221,175,102,255,223,178,106,255,134,98,51,
+255,14,13,11,142,0,24,10,9,7,167,171,89,22,255,202,103,23,255,202,
+102,21,255,20,16,9,255,0,144,12,10,7,170,46,29,13,255,140,74,21,
+255,165,86,22,255,167,87,22,255,165,86,22,255,167,87,22,255,185,95,22,
+255,198,97,23,255,206,111,27,255,221,146,66,255,23,19,14,249,0,8,10,
+10,9,153,212,161,89,255,229,183,110,255,224,165,81,255,28,23,15,255,0,
+12,10,8,7,156,171,89,22,255,202,103,23,255,202,102,21,255,31,21,10,
+170,0,8,10,10,9,167,212,160,85,255,228,177,105,255,222,158,75,255,27,
+23,16,255,0,40,10,8,7,170,167,87,22,255,202,103,23,255,202,102,21,
+255,20,16,9,238,0,12,10,8,7,164,171,89,22,255,202,103,23,255,203,
+100,24,255,22,18,11,235,0,8,10,10,9,167,214,164,93,255,228,182,109,
+255,223,154,80,255,207,120,36,255,189,94,24,255,167,87,22,255,167,87,22,
+255,187,96,22,255,198,93,23,255,202,93,21,255,198,96,21,255,26,19,9,
+227,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20,
+15,9,252,0,16,17,15,12,170,216,170,97,255,229,183,110,255,224,164,85,
+255,29,24,16,255,3,3,2,28,0,8,12,11,9,198,211,149,76,255,221,
+151,68,255,219,146,60,255,22,19,13,246,0,8,10,10,9,161,210,155,77,
+255,223,147,72,255,213,122,42,255,23,18,12,255,0,12,10,8,7,167,171,
+89,22,255,202,103,23,255,202,102,21,255,29,21,10,170,0,8,12,10,7,
+85,166,87,23,255,209,118,30,255,218,139,55,255,33,27,18,255,0,24,15,
+13,10,170,215,159,92,255,226,169,95,255,218,141,59,255,34,26,15,190,0,
+8,13,10,6,85,167,87,22,255,202,103,23,255,198,96,21,255,197,96,22,
+255,189,97,22,255,198,96,21,255,198,96,21,255,25,19,10,255,4,4,3,
+28,0,20,10,9,7,170,178,92,23,255,210,107,31,255,215,128,44,255,33,
+24,14,193,0,8,12,10,7,85,167,87,22,255,202,95,23,255,202,103,23,
+255,32,22,11,170,0,4,10,8,7,170,171,89,22,255,24,17,9,249,0,
+4,12,10,7,85,163,82,22,255,202,103,23,255,202,102,21,255,29,21,10,
+170,0,8,12,10,7,85,166,87,23,255,202,103,23,255,202,102,21,255,20,
+15,9,255,0,12,10,8,7,167,170,89,23,255,206,106,25,255,208,115,33,
+255,28,21,13,207,0,8,13,10,6,85,167,87,22,255,202,95,23,255,202,
+102,21,255,20,16,9,255,0,12,15,13,10,170,214,158,85,255,229,183,110,
+255,228,185,111,255,24,20,15,249,0,8,12,11,9,108,176,91,23,255,202,
+95,23,255,202,102,21,255,18,15,9,255,2,2,1,8,0,8,8,7,5,
+184,171,89,22,255,202,95,23,255,202,102,21,255,34,23,11,173,0,8,12,
+11,9,136,212,160,85,255,228,180,105,255,225,165,88,255,31,25,18,255,3,
+3,2,28,0,8,8,7,5,178,171,89,22,255,202,103,23,255,202,102,21,
+255,30,21,11,170,0,8,12,10,7,85,167,87,22,255,202,103,23,255,202,
+102,21,255,20,15,9,255,0,40,7,7,6,28,30,27,21,238,167,111,50,
+255,206,110,33,255,199,102,24,255,175,90,22,255,165,86,22,255,167,87,22,
+255,167,87,22,255,161,87,22,255,84,48,19,255,18,15,9,227,8,7,5,
+28,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20,
+15,9,252,0,16,15,13,10,170,211,159,76,255,229,180,110,255,228,182,109,
+255,34,28,19,255,0,12,10,9,7,170,171,89,22,255,202,103,23,255,202,
+102,21,255,31,22,10,170,0,8,7,6,6,28,48,31,15,255,189,93,22,
+255,202,102,21,255,45,29,14,255,5,5,4,113,0,4,5,5,4,28,22,
+20,15,255,220,169,97,255,226,178,103,255,167,118,54,255,15,13,10,133,0,
+8,13,11,6,85,167,87,22,255,202,103,23,255,202,102,21,255,19,15,8,
+215,0,4,11,9,6,105,121,65,20,255,26,18,9,190,0,4,9,9,8,
+167,208,150,75,255,229,183,110,255,228,181,113,255,37,29,20,255,0,24,8,
+8,5,218,167,87,22,255,202,93,21,255,198,104,21,255,23,18,10,255,3,
+3,2,51,0,20,10,9,7,153,171,89,22,255,202,95,23,255,202,102,21,
+255,20,15,9,255,2,2,1,17,0,8,8,7,5,181,184,100,25,255,215,
+119,42,255,224,160,85,255,34,28,19,255,0,20,9,8,6,85,31,22,12,
+255,166,87,23,255,189,97,22,255,99,60,22,255,15,13,8,170,0,28,4,
+3,3,23,13,11,8,227,182,94,23,255,149,87,26,255,19,17,12,227,7,
+7,7,23,0,16,15,13,10,170,216,170,97,255,229,179,114,255,228,182,109,
+255,34,28,19,255,0,20,9,8,6,130,69,42,18,255,195,95,22,255,35,
+24,12,255,5,5,4,76,0,104,10,9,7,28,27,24,16,184,32,27,19,
+255,39,29,20,212,13,12,10,85,0,60,13,11,8,170,81,54,28,255,216,
+148,67,255,223,161,72,255,220,147,61,255,117,76,32,255,13,11,8,255,44,
+33,19,255,207,123,40,255,217,136,50,255,218,142,53,255,156,100,39,255,18,
+15,11,227,10,8,7,28,0,12,15,13,8,125,19,14,10,170,14,11,7,
+170,10,8,7,170,11,9,6,122,13,10,8,85,8,7,5,153,46,33,21,
+255,212,138,51,255,221,151,68,255,191,132,62,255,19,17,12,176,0,12,7,
+7,6,76,26,22,15,241,189,129,58,255,219,152,72,255,217,154,72,255,133,
+87,38,255,15,13,10,221,6,6,5,28,0,8,15,12,8,113,20,16,11,
+170,17,14,10,142,7,6,6,28,0,8,19,16,12,170,200,117,35,255,212,
+123,37,255,115,74,30,255,9,8,6,113,0,8,12,11,9,178,104,73,37,
+255,206,147,63,255,178,121,53,255,58,46,29,255,46,36,25,255,40,32,21,
+252,19,17,12,85,0,36,12,10,9,164,191,131,60,255,223,161,80,255,221,
+151,68,255,46,34,21,255,4,4,3,3,0,20,19,16,12,173,208,134,55,
+255,223,156,70,255,216,160,81,255,21,19,14,255,0,16,6,5,5,25,17,
+14,10,227,67,48,28,255,94,67,35,255,20,17,13,227,6,6,5,113,12,
+11,9,198,67,51,30,255,85,62,32,255,25,20,14,255,9,8,6,82,0,
+32,10,8,5,170,161,87,22,255,195,90,20,255,187,91,20,255,19,14,8,
+255,0,28,15,12,8,119,20,16,11,170,17,14,10,156,10,8,7,28,0,
+64,15,12,8,122,18,15,11,170,17,14,10,144,10,8,7,28,0,16,13,
+12,10,170,157,96,36,255,211,123,38,255,199,116,34,255,31,24,16,255,6,
+6,6,28,0,20,16,13,11,170,197,110,32,255,209,110,30,255,202,103,23,
+255,58,36,15,255,8,7,5,113,0,8,10,8,5,85,137,68,18,255,185,
+86,20,255,174,88,19,255,18,13,7,255,0,24,12,10,9,170,204,129,49,
+255,220,144,63,255,217,133,50,255,26,20,13,255,0,28,7,6,6,76,23,
+19,12,244,185,113,36,255,207,129,52,255,173,117,50,255,59,46,28,255,18,
+15,13,198,9,9,8,113,6,6,6,11,0,24,15,12,8,133,22,17,11,
+170,17,14,10,142,8,7,5,28,0,12,9,8,6,170,202,128,49,255,220,
+148,63,255,219,140,56,255,22,19,13,255,0,8,12,10,9,170,200,125,37,
+255,218,141,51,255,220,147,61,255,138,86,35,255,13,10,8,227,11,9,6,
+170,13,11,8,198,61,41,22,255,202,111,31,255,204,105,25,255,200,105,21,
+255,22,17,9,221,0,12,11,9,6,108,14,11,7,170,11,9,6,139,6,
+5,3,17,0,12,9,7,6,133,144,75,19,255,185,86,20,255,178,86,19,
+255,27,18,8,170,0,8,11,9,6,85,134,70,19,255,181,88,20,255,180,
+87,19,255,24,15,7,178,0,12,10,8,5,99,165,86,22,255,206,111,27,
+255,213,124,38,255,36,27,17,255,0,24,10,10,9,133,167,112,48,255,222,
+166,77,255,223,157,72,255,54,39,23,255,5,5,4,37,0,20,13,11,8,
+170,181,93,22,255,206,111,27,255,214,127,43,255,20,16,11,255,0,12,9,
+8,8,170,203,129,50,255,222,145,63,255,220,147,61,255,33,26,16,255,0,
+12,12,10,7,113,15,12,8,170,13,10,8,122,0,16,10,8,7,170,200,
+120,41,255,220,142,59,255,219,146,60,255,27,21,14,255,0,12,13,11,8,
+113,18,15,11,170,17,14,10,142,8,7,5,28,0,12,14,12,9,113,20,
+15,11,170,17,14,10,153,10,8,7,28,0,16,9,8,6,85,29,21,10,
+255,119,62,20,255,153,79,20,255,40,25,11,255,9,8,6,85,0,20,10,
+8,7,28,32,24,13,218,68,47,25,255,61,43,24,255,61,46,28,255,61,
+47,28,255,61,47,28,255,66,50,29,255,73,55,32,255,66,48,29,255,24,
+20,15,85,0,20,7,6,6,79,32,26,17,244,199,132,54,255,208,150,75,
+255,122,87,41,255,17,15,10,170,0,32,10,9,7,28,32,23,11,227,53,
+33,14,255,34,23,11,255,12,10,7,190,6,5,5,28,0,20,9,7,4,
+170,146,76,19,255,197,99,20,255,204,110,27,255,59,41,22,255,6,6,6,
+170,10,9,9,113,31,26,18,184,30,25,17,255,29,25,18,255,34,27,19,
+255,37,28,18,221,13,11,8,57,0,8,13,10,6,88,144,75,19,255,185,
+86,20,255,178,90,19,255,20,14,7,212,0,12,9,7,4,125,157,81,20,
+255,212,117,33,255,220,148,63,255,27,21,14,218,0,8,12,10,9,127,192,
+111,31,255,208,112,27,255,202,103,23,255,22,16,9,204,0,12,10,8,5,
+93,137,68,18,255,185,94,20,255,180,91,19,255,30,20,9,170,0,8,11,
+9,6,85,140,67,19,255,202,106,21,255,214,125,39,255,25,20,14,255,0,
+12,6,6,5,28,13,11,8,139,20,16,11,170,19,15,10,142,8,7,5,
+28,0,8,10,9,5,142,153,79,20,255,195,90,20,255,206,111,27,255,24,
+20,13,255,0,12,12,10,9,170,195,113,32,255,211,115,30,255,203,108,24,
+255,31,21,10,173,0,8,11,9,6,85,140,70,19,255,185,86,20,255,180,
+87,19,255,24,15,7,181,0,32,9,8,6,170,174,91,23,255,215,123,42,
+255,221,150,66,255,25,20,14,255,0,32,9,7,4,170,148,77,19,255,181,
+92,20,255,180,87,19,255,25,17,8,170,0,8,34,24,13,170,161,102,38,
+255,219,154,70,255,220,142,59,255,213,124,38,255,32,24,13,198,0,8,11,
+9,6,85,140,70,19,255,185,86,20,255,178,90,19,255,20,14,7,212,0,
+12,8,7,5,127,144,78,19,255,185,86,20,255,180,87,19,255,29,19,10,
+170,0,8,13,11,8,116,194,116,33,255,209,110,30,255,202,95,23,255,22,
+17,9,221,0,12,10,8,5,85,12,9,5,170,10,8,5,130,6,5,3,
+8,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,27,
+18,8,170,0,8,11,8,6,85,137,68,18,255,185,86,20,255,200,105,21,
+255,29,21,12,255,4,4,4,25,10,9,7,139,154,100,47,255,215,148,70,
+255,198,131,45,255,46,34,19,255,11,9,6,88,0,12,10,8,5,119,144,
+78,19,255,185,86,20,255,180,87,19,255,21,15,8,210,0,32,13,11,8,
+170,199,119,39,255,220,144,63,255,221,155,70,255,27,21,14,255,0,20,10,
+9,7,170,171,89,22,255,195,98,20,255,183,89,19,255,29,20,8,170,0,
+8,11,9,6,85,139,70,20,255,202,103,23,255,211,118,36,255,28,21,13,
+201,0,4,8,8,7,57,118,84,39,255,215,159,86,255,219,149,66,255,216,
+129,45,255,211,121,34,255,34,25,13,178,0,8,11,10,6,88,146,76,19,
+255,185,94,20,255,178,90,19,255,24,18,9,255,0,12,18,15,11,170,203,
+122,42,255,215,126,40,255,209,106,30,255,32,22,13,184,0,8,12,10,7,
+85,143,72,20,255,185,94,20,255,178,90,19,255,20,14,7,210,0,40,9,
+7,4,170,148,77,19,255,180,87,19,255,178,86,19,255,30,21,9,255,5,
+5,4,37,8,7,5,28,20,17,13,227,133,89,38,255,215,142,56,255,216,
+129,45,255,209,115,32,255,26,19,11,210,0,8,11,9,6,85,142,74,19,
+255,185,86,20,255,178,90,19,255,20,14,7,210,0,12,9,7,4,122,143,
+75,20,255,203,108,24,255,216,129,45,255,30,23,15,255,0,12,12,10,7,
+110,16,13,9,170,13,10,8,122,0,16,9,8,6,105,142,74,19,255,185,
+86,20,255,180,87,19,255,23,16,8,255,0,24,15,13,10,170,203,122,42,
+255,215,126,40,255,209,118,30,255,24,17,11,255,0,24,9,8,4,170,148,
+77,19,255,181,92,20,255,180,87,19,255,23,16,8,198,0,12,9,7,6,
+139,159,82,20,255,203,100,24,255,212,121,33,255,28,21,13,255,0,12,12,
+11,9,119,81,59,34,255,216,153,71,255,173,117,50,255,21,18,14,255,10,
+10,9,244,11,10,8,255,60,35,15,255,173,85,20,255,84,49,17,255,13,
+10,6,170,0,12,10,8,5,130,146,79,19,255,193,89,20,255,203,104,24,
+255,120,77,31,255,19,17,12,255,117,80,36,255,219,154,70,255,178,121,53,
+255,20,17,13,255,45,33,18,255,184,94,21,255,195,90,20,255,205,106,26,
+255,30,22,13,255,0,12,7,7,6,82,35,28,18,255,196,114,33,255,148,
+80,25,255,32,22,11,255,20,15,9,255,26,18,9,255,88,49,17,255,149,
+78,20,255,40,26,11,255,9,7,4,85,0,28,9,7,4,127,140,70,19,
+255,181,88,20,255,180,87,19,255,18,13,7,235,0,24,10,9,7,93,104,
+69,35,255,201,131,48,255,194,109,33,255,65,42,20,255,12,10,7,170,0,
+36,9,7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,23,16,8,
+198,0,32,15,14,10,198,188,133,61,255,219,149,66,255,194,115,37,255,17,
+15,10,244,0,24,10,8,5,113,144,78,19,255,185,86,20,255,180,87,19,
+255,18,13,7,255,0,140,7,6,4,65,53,31,12,255,162,83,19,255,185,
+94,20,255,130,70,21,255,31,22,10,255,25,19,10,198,22,17,9,246,70,
+40,15,255,169,87,20,255,200,105,21,255,212,123,37,255,28,21,13,221,0,
+8,12,10,9,133,200,127,41,255,210,120,33,255,202,95,23,255,19,14,8,
+238,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,28,
+19,9,170,0,8,12,10,9,133,194,112,31,255,209,110,30,255,202,102,21,
+255,21,15,8,235,0,16,9,7,4,57,12,10,5,88,10,8,5,85,0,
+12,10,8,5,125,146,79,19,255,181,88,20,255,180,87,19,255,25,17,8,
+195,0,12,10,8,5,119,144,78,19,255,185,94,20,255,200,105,21,255,23,
+18,10,221,0,8,11,9,8,153,200,123,41,255,212,117,33,255,202,103,23,
+255,111,63,20,255,27,20,10,255,20,16,9,246,22,17,9,249,28,20,9,
+198,30,21,9,170,24,17,9,215,28,20,9,201,10,8,5,85,0,16,9,
+7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,18,13,7,255,0,
+16,11,10,8,113,152,104,47,255,214,134,49,255,204,105,25,255,98,54,19,
+255,18,13,9,227,13,10,8,170,14,12,9,198,60,41,21,255,199,112,28,
+255,202,102,21,255,202,103,23,255,26,19,11,204,0,8,12,11,9,116,187,
+101,24,255,202,93,21,255,187,91,20,255,18,13,7,255,0,12,9,7,4,
+170,146,79,19,255,181,88,20,255,178,90,19,255,27,17,8,170,0,8,11,
+9,6,85,139,70,20,255,202,103,23,255,212,123,37,255,32,24,15,255,0,
+24,13,12,10,170,196,114,33,255,206,106,25,255,196,99,21,255,28,19,9,
+170,0,8,11,8,6,85,137,68,18,255,181,88,20,255,178,86,19,255,164,
+85,21,255,138,73,21,255,175,93,20,255,178,86,19,255,46,28,11,255,6,
+5,3,108,0,20,9,7,4,170,146,76,19,255,189,88,20,255,189,88,20,
+255,28,19,9,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,178,
+90,19,255,27,17,8,170,0,4,9,7,4,167,146,79,19,255,20,14,7,
+252,0,4,11,9,6,85,137,68,18,255,185,94,20,255,178,90,19,255,27,
+17,8,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,180,87,19,
+255,18,13,7,255,0,12,9,7,4,170,146,79,19,255,185,94,20,255,183,
+85,19,255,27,19,8,170,0,8,11,9,6,85,140,73,19,255,181,88,20,
+255,178,90,19,255,20,15,7,255,0,12,16,14,11,170,208,143,59,255,223,
+156,70,255,216,135,49,255,28,22,13,210,0,8,11,9,6,85,140,70,19,
+255,185,94,20,255,178,90,19,255,72,39,13,255,10,8,5,218,8,6,3,
+170,9,7,4,193,39,24,10,255,160,82,19,255,185,94,20,255,144,74,23,
+255,16,13,9,170,0,8,10,9,7,85,145,101,48,255,218,149,67,255,210,
+115,31,255,99,57,19,255,10,8,5,227,8,6,3,170,9,7,4,190,30,
+20,9,255,158,81,19,255,185,94,20,255,178,90,19,255,27,17,8,170,0,
+8,11,8,6,85,137,68,18,255,185,86,20,255,180,87,19,255,18,13,7,
+255,0,44,9,9,8,28,13,12,8,142,27,20,10,170,29,21,10,193,24,
+17,9,252,22,17,9,232,22,17,9,255,87,49,18,255,181,88,20,255,178,
+90,19,255,100,54,17,255,11,10,6,150,0,16,9,7,4,170,146,79,19,
+255,181,88,20,255,180,87,19,255,18,13,7,255,0,16,15,13,10,170,208,
+141,55,255,223,156,70,255,217,133,50,255,23,19,12,255,0,12,10,8,5,
+122,144,78,19,255,185,86,20,255,180,87,19,255,30,20,9,176,0,12,12,
+10,7,85,39,26,12,255,155,80,20,255,99,55,19,255,19,16,12,255,12,
+11,9,255,18,15,11,255,119,84,38,255,209,137,60,255,138,86,35,255,18,
+15,11,178,0,12,10,8,5,130,144,78,19,255,181,92,20,255,178,90,19,
+255,39,24,10,255,6,5,3,210,29,20,8,255,169,87,20,255,97,53,18,
+255,8,7,5,255,26,21,15,255,212,142,59,255,221,151,68,255,218,142,53,
+255,34,25,15,255,0,20,5,5,4,82,16,12,7,255,160,82,19,255,185,
+86,20,255,185,86,20,255,52,29,11,255,7,6,4,170,0,20,8,7,5,
+85,83,46,16,255,181,92,20,255,178,86,19,255,87,47,14,255,10,8,5,
+224,8,6,3,170,9,7,4,190,29,20,8,255,195,104,24,255,217,136,50,
+255,221,155,70,255,30,23,15,255,0,16,8,7,5,85,26,18,9,255,107,
+59,20,255,151,80,22,255,60,34,15,255,11,9,6,170,0,36,8,7,5,
+170,159,82,20,255,202,118,35,255,66,51,29,255,9,9,8,96,0,16,15,
+13,10,170,208,140,59,255,223,156,70,255,215,133,44,255,27,20,12,255,0,
+20,14,12,7,244,131,67,20,255,176,89,19,255,17,12,6,255,0,184,17,
+14,10,85,171,95,28,255,206,123,33,255,208,123,31,255,207,112,28,255,202,
+107,23,255,191,98,22,255,170,91,21,255,195,107,22,255,209,123,30,255,212,
+132,37,255,214,134,39,255,211,133,40,255,202,121,35,255,29,21,12,164,0,
+8,12,10,7,82,168,98,29,255,202,121,35,255,196,120,31,255,194,115,31,
+255,190,115,27,255,185,101,26,255,184,100,25,255,199,107,26,255,208,123,31,
+255,168,105,37,255,25,21,14,227,9,8,8,28,0,8,8,8,7,28,39,
+30,18,249,183,122,42,255,211,133,40,255,210,133,43,255,161,106,41,255,15,
+13,10,221,5,4,4,17,0,8,14,11,7,113,148,83,25,255,193,108,24,
+255,180,93,23,255,27,18,10,153,0,8,12,9,7,122,144,78,19,255,180,
+91,19,255,83,46,16,255,7,6,4,184,0,8,4,4,3,85,28,21,13,
+255,202,121,35,255,209,132,42,255,131,87,36,255,10,9,7,255,5,5,5,
+28,0,40,10,9,7,68,86,62,31,255,206,131,43,255,214,130,39,255,76,
+50,25,255,7,6,6,113,0,16,5,5,4,28,21,17,12,255,202,121,35,
+255,210,135,37,255,157,100,38,255,18,15,11,150,0,16,18,15,9,91,161,
+88,24,255,105,64,28,255,11,10,8,170,0,12,8,7,7,85,40,28,17,
+255,174,91,23,255,42,27,13,173,0,32,10,8,5,116,133,66,16,255,161,
+85,17,255,161,78,17,255,25,16,8,221,0,24,15,12,8,119,170,99,29,
+255,203,126,36,255,199,127,34,255,27,20,12,210,0,60,13,11,8,122,170,
+99,29,255,204,127,37,255,199,119,34,255,27,20,12,198,0,12,4,4,3,
+11,18,13,9,255,154,79,19,255,174,88,19,255,92,51,17,255,12,10,7,
+198,0,24,11,9,6,147,142,74,19,255,171,90,18,255,159,81,18,255,17,
+12,6,255,0,12,8,7,5,142,133,66,16,255,161,85,17,255,161,85,17,
+255,21,14,6,215,0,24,10,9,7,198,190,107,25,255,203,104,24,255,196,
+99,21,255,21,15,8,255,2,2,1,14,0,20,9,8,6,37,35,28,18,
+255,183,112,36,255,212,132,37,255,178,118,41,255,27,23,16,255,5,5,4,
+198,0,32,15,12,8,105,142,79,23,255,189,97,22,255,160,83,21,255,18,
+13,7,218,0,12,10,8,7,198,196,114,33,255,214,129,37,255,212,132,37,
+255,27,21,12,210,0,8,13,11,8,116,192,114,31,255,210,125,33,255,209,
+123,30,255,203,113,26,255,177,91,22,255,159,82,20,255,160,83,21,255,165,
+85,20,255,168,89,19,255,163,86,18,255,161,78,17,255,23,15,6,170,0,
+8,9,7,4,57,99,48,14,255,142,73,17,255,133,66,16,255,19,13,6,
+190,0,12,7,6,4,164,135,66,16,255,161,85,17,255,161,85,17,255,25,
+16,6,170,0,8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17,
+255,19,13,6,227,0,12,10,8,5,176,190,107,25,255,212,127,35,255,214,
+134,39,255,30,21,13,255,0,24,12,10,7,170,194,109,33,255,213,132,36,
+255,208,122,29,255,28,20,11,255,0,24,9,7,4,147,136,70,17,255,202,
+98,21,255,211,126,34,255,27,20,12,255,3,3,2,28,0,8,10,8,7,
+195,180,93,23,255,202,102,21,255,202,102,21,255,25,17,10,221,0,8,13,
+11,8,65,129,70,22,255,172,88,21,255,144,78,19,255,22,15,7,176,0,
+12,10,8,7,198,198,124,37,255,215,136,42,255,214,134,39,255,27,21,12,
+212,0,8,12,10,7,79,151,88,26,255,198,116,29,255,192,109,27,255,25,
+18,10,167,0,8,12,9,7,82,119,62,20,255,174,89,21,255,154,79,19,
+255,22,15,7,181,0,20,5,5,4,68,20,14,7,249,142,73,17,255,143,
+74,18,255,45,26,10,255,10,8,5,85,0,76,7,6,6,85,39,30,18,
+255,196,121,41,255,213,135,42,255,115,72,30,255,10,9,7,170,0,40,5,
+5,4,17,6,5,5,85,5,5,4,45,0,28,9,7,4,142,146,79,19,
+255,204,108,23,255,212,126,33,255,30,22,13,255,3,3,3,40,0,36,10,
+8,5,125,133,66,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0,
+12,10,8,5,127,136,70,17,255,193,97,20,255,203,108,24,255,30,21,11,
+193,0,8,13,10,6,85,134,70,19,255,171,90,18,255,159,81,18,255,17,
+12,6,238,0,12,8,6,5,144,135,66,16,255,161,85,17,255,161,85,17,
+255,23,15,6,170,0,8,10,7,5,85,133,66,16,255,185,94,20,255,209,
+123,30,255,23,18,12,255,3,3,2,28,0,4,5,5,4,28,18,15,11,
+227,134,72,21,255,158,81,19,255,143,74,18,255,22,15,7,142,0,8,10,
+8,5,85,131,65,16,255,163,79,18,255,178,90,19,255,22,16,9,255,3,
+2,2,20,0,8,9,7,6,176,144,78,19,255,175,88,18,255,163,79,18,
+255,26,16,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,
+78,17,255,19,13,6,229,0,32,8,7,5,156,144,78,19,255,202,102,21,
+255,206,111,27,255,27,20,12,255,0,32,10,8,5,133,135,66,16,255,161,
+85,17,255,161,85,17,255,19,13,6,227,0,12,8,7,5,255,172,85,21,
+255,189,92,20,255,172,87,19,255,24,16,7,170,0,8,10,8,5,85,129,
+64,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0,12,10,8,5,
+127,135,66,16,255,161,85,17,255,161,85,17,255,26,16,7,170,0,8,11,
+9,6,85,134,70,19,255,171,90,18,255,159,78,18,255,23,15,6,170,0,
+8,9,7,4,57,98,49,13,255,139,71,16,255,133,66,16,255,19,13,6,
+193,0,12,7,6,4,176,133,66,16,255,161,85,17,255,161,85,17,255,23,
+15,6,170,0,8,10,8,5,85,129,64,16,255,165,87,18,255,180,91,19,
+255,20,15,9,255,0,4,5,5,4,17,26,21,15,227,126,75,25,255,178,
+95,21,255,142,74,19,255,46,28,11,255,10,8,5,57,0,8,10,8,5,
+85,131,65,16,255,161,85,17,255,161,85,17,255,17,12,6,252,2,1,1,
+8,0,28,13,11,8,170,199,119,34,255,215,136,42,255,214,139,41,255,28,
+20,13,255,0,20,8,7,5,170,135,66,16,255,161,85,17,255,161,85,17,
+255,23,15,6,170,0,8,10,8,5,85,131,67,16,255,202,102,21,255,211,
+127,36,255,22,17,11,249,0,8,16,14,11,201,101,67,28,255,191,98,22,
+255,185,94,20,255,172,87,19,255,26,17,7,170,0,8,10,8,5,85,129,
+64,16,255,161,85,17,255,161,85,17,255,31,20,8,255,5,5,4,102,0,
+4,5,4,4,28,16,13,9,255,164,85,21,255,180,91,19,255,165,87,18,
+255,26,17,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,
+85,17,255,19,13,6,212,0,40,10,8,5,133,135,66,16,255,161,85,17,
+255,161,85,17,255,26,17,7,255,3,3,2,136,9,7,4,227,131,67,20,
+255,197,104,22,255,198,104,21,255,183,93,19,255,172,87,19,255,26,17,7,
+170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,19,
+13,6,212,0,12,10,8,5,127,135,66,16,255,193,97,20,255,209,123,30,
+255,19,15,10,252,0,8,13,11,8,65,125,68,22,255,174,86,21,255,146,
+76,19,255,22,14,7,178,0,12,8,6,5,144,135,66,16,255,161,85,17,
+255,161,85,17,255,19,14,6,238,0,24,13,11,8,170,163,87,20,255,180,
+91,19,255,165,87,18,255,17,12,6,255,0,24,9,7,4,139,135,66,16,
+255,161,85,17,255,161,85,17,255,15,11,6,246,0,12,9,7,6,184,180,
+93,23,255,211,115,30,255,213,133,38,255,28,20,13,255,0,16,12,11,9,
+170,152,91,31,255,188,105,31,255,115,66,22,255,91,50,16,255,84,46,15,
+255,116,59,17,255,118,62,17,255,15,11,6,221,0,16,10,8,5,116,146,
+79,19,255,202,103,23,255,209,128,32,255,200,127,41,255,167,106,40,255,197,
+122,42,255,210,130,35,255,186,106,27,255,88,51,19,255,102,55,17,255,157,
+83,18,255,189,92,20,255,209,123,30,255,29,21,12,224,0,8,7,6,6,
+28,41,31,18,235,160,84,23,255,170,87,19,255,45,26,10,255,5,5,4,
+170,4,4,4,8,4,4,3,99,15,12,6,255,140,72,17,255,138,71,17,
+255,45,26,10,255,10,8,5,85,0,24,8,7,5,142,133,66,16,255,161,
+85,17,255,161,85,17,255,19,13,6,229,0,24,13,11,8,170,160,86,21,
+255,185,90,20,255,91,50,16,255,7,6,4,255,0,40,8,7,5,150,133,
+66,16,255,161,85,17,255,161,85,17,255,15,11,6,246,0,32,8,8,7,
+110,74,52,27,255,191,103,24,255,176,89,19,255,34,22,9,255,6,5,3,
+57,0,20,8,6,5,161,133,66,16,255,161,85,17,255,161,78,17,255,15,
+11,6,252,0,140,12,10,5,85,123,61,16,255,161,85,17,255,161,85,17,
+255,22,15,7,255,2,2,1,85,0,8,7,6,4,244,133,66,16,255,167,
+88,18,255,189,92,20,255,27,19,10,195,0,8,12,10,7,110,160,83,21,
+255,177,85,18,255,161,78,17,255,15,11,6,252,0,12,7,6,4,161,133,
+66,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0,8,11,9,6,
+85,134,70,19,255,171,90,18,255,159,78,18,255,15,11,6,249,0,12,10,
+8,5,85,98,49,13,255,135,72,16,255,133,66,16,255,19,13,6,139,0,
+8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17,255,15,11,6,
+246,0,12,7,6,4,164,133,66,16,255,165,87,18,255,178,90,19,255,24,
+17,9,212,0,8,13,11,8,105,165,86,22,255,180,91,19,255,159,81,18,
+255,19,14,6,255,2,2,1,79,0,44,8,6,5,167,133,66,16,255,161,
+85,17,255,161,85,17,255,15,11,6,252,0,16,7,6,6,28,24,19,13,
+227,103,59,20,255,157,83,18,255,154,78,17,255,150,81,19,255,154,79,19,
+255,158,81,19,255,162,83,19,255,161,85,17,255,159,81,18,255,163,86,18,
+255,27,18,8,170,0,8,11,9,6,85,131,67,16,255,165,87,18,255,161,
+85,17,255,15,11,6,252,0,12,8,6,5,167,133,66,16,255,161,85,17,
+255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,131,65,16,255,175,
+88,18,255,191,96,20,255,25,18,10,255,0,24,11,9,6,170,148,77,19,
+255,169,82,18,255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,129,
+64,16,255,161,85,17,255,161,85,17,255,87,47,14,255,23,17,8,255,65,
+34,12,255,150,76,17,255,132,68,17,255,41,25,10,255,10,8,5,85,0,
+16,8,7,5,150,133,66,16,255,161,85,17,255,161,78,17,255,23,15,6,
+170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23,
+15,6,170,0,4,8,7,5,153,133,66,16,255,19,13,6,238,0,4,10,
+8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0,
+8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,15,11,6,
+252,0,12,8,6,5,167,133,66,16,255,161,85,17,255,161,85,17,255,23,
+15,6,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,
+255,31,20,8,255,5,4,4,85,0,4,5,4,4,40,17,14,10,255,200,
+120,35,255,207,112,28,255,195,98,20,255,29,20,8,170,0,8,10,8,5,
+85,131,65,16,255,163,86,18,255,159,81,18,255,150,76,17,255,137,70,16,
+255,135,72,16,255,135,66,16,255,146,75,17,255,159,81,18,255,131,67,20,
+255,42,31,17,255,10,9,7,62,0,8,5,5,4,8,26,21,15,227,137,
+79,28,255,174,88,19,255,158,83,17,255,137,70,16,255,135,72,16,255,135,
+66,16,255,146,75,17,255,159,81,18,255,161,85,17,255,161,85,17,255,23,
+15,6,170,0,8,10,8,5,85,131,67,16,255,163,86,18,255,159,81,18,
+255,17,12,6,255,0,68,2,1,1,8,7,6,4,249,137,67,16,255,165,
+80,18,255,154,78,17,255,27,18,8,170,0,16,8,6,5,167,133,66,16,
+255,161,85,17,255,161,85,17,255,15,11,6,252,0,16,13,11,8,170,199,
+124,36,255,211,125,32,255,200,105,21,255,18,13,7,255,0,12,7,6,4,
+164,133,66,16,255,161,85,17,255,161,78,17,255,19,13,6,227,0,16,8,
+7,5,122,68,38,13,255,150,83,23,255,174,107,35,255,181,112,38,255,190,
+117,39,255,193,114,36,255,143,84,26,255,15,12,8,212,4,4,3,6,0,
+12,10,8,5,108,135,66,16,255,161,85,17,255,161,85,17,255,125,65,16,
+255,90,47,13,255,121,60,16,255,164,84,19,255,189,97,22,255,177,104,32,
+255,194,123,39,255,212,134,41,255,210,124,31,255,200,105,21,255,23,17,8,
+218,0,16,10,8,5,167,56,31,11,255,110,55,15,255,118,62,17,255,115,
+58,16,255,115,58,16,255,120,63,17,255,95,46,14,255,17,13,6,227,7,
+6,4,28,0,16,14,12,7,227,87,43,14,255,154,78,17,255,152,77,17,
+255,139,71,16,255,135,72,16,255,135,66,16,255,146,75,17,255,200,105,21,
+255,211,127,36,255,214,134,39,255,23,18,12,255,0,12,7,6,4,85,26,
+16,7,255,131,67,16,255,145,75,18,255,78,43,15,255,7,6,4,255,0,
+40,10,8,5,136,157,81,20,255,210,129,33,255,139,89,36,255,10,9,7,
+198,0,16,13,11,8,170,196,113,31,255,206,114,25,255,189,92,20,255,18,
+13,7,244,0,16,5,4,4,88,27,19,8,255,141,73,18,255,161,85,17,
+255,21,14,6,218,0,112,12,9,7,99,11,8,6,170,10,8,5,91,0,
+60,11,10,8,28,32,23,13,227,108,57,19,255,153,82,18,255,154,78,17,
+255,146,75,17,255,97,47,14,255,36,24,11,255,108,64,25,255,203,111,30,
+255,207,118,32,255,207,118,32,255,189,110,32,255,63,41,20,255,15,12,8,
+76,0,8,9,8,6,28,38,27,15,218,51,33,18,255,48,32,17,255,131,
+74,24,255,182,97,21,255,176,89,19,255,170,87,19,255,134,72,21,255,37,
+25,14,255,15,13,8,144,7,7,6,28,0,12,11,9,8,127,171,99,28,
+255,208,123,31,255,203,124,30,255,104,63,27,255,15,13,10,212,7,6,6,
+28,0,12,14,11,7,170,142,74,19,255,161,85,17,255,159,81,18,255,27,
+18,8,184,0,8,6,5,3,28,27,17,8,227,92,46,13,255,111,55,14,
+255,31,20,8,255,8,6,3,198,9,7,4,170,10,8,5,227,22,16,9,
+255,61,39,18,255,107,64,26,255,108,66,25,255,32,22,11,255,9,7,6,
+170,0,44,10,9,7,156,56,36,19,255,191,114,32,255,175,98,30,255,41,
+27,16,255,11,9,6,57,0,12,21,15,10,227,100,56,21,255,160,83,21,
+255,80,44,17,255,14,12,7,190,7,6,6,28,0,16,13,10,6,28,29,
+20,10,212,21,15,10,144,0,20,12,9,7,85,39,24,10,173,16,12,7,
+85,0,32,6,5,3,20,19,13,6,173,21,14,6,255,21,15,6,215,10,
+8,5,85,0,24,15,12,8,170,190,98,23,255,203,108,24,255,202,111,23,
+255,23,17,10,255,0,60,17,13,10,170,195,112,30,255,211,124,30,255,205,
+106,26,255,31,21,12,255,0,12,8,6,5,139,44,25,9,255,135,72,16,
+255,104,54,13,255,15,11,6,249,7,6,4,28,0,24,7,6,4,57,44,
+25,9,255,137,73,16,255,143,70,16,255,49,25,8,255,8,6,3,184,8,
+6,3,85,8,6,3,142,23,16,6,255,130,66,15,255,145,77,16,255,87,
+44,12,255,10,8,5,142,0,20,11,9,8,164,53,31,14,255,150,74,19,
+255,154,78,17,255,148,76,17,255,65,33,10,255,10,8,5,184,6,5,5,
+28,0,16,11,9,6,142,175,102,30,255,207,123,32,255,208,114,31,255,196,
+114,33,255,89,56,26,255,17,13,10,255,11,8,6,170,9,7,6,170,11,
+8,6,170,15,11,8,170,18,13,9,142,8,6,5,28,0,8,10,8,5,
+93,102,53,17,255,159,81,18,255,154,78,17,255,72,37,11,255,11,8,6,
+227,9,7,6,170,11,8,6,198,61,36,20,255,196,107,27,255,204,114,27,
+255,182,102,31,255,19,14,10,170,0,8,6,6,5,20,26,19,11,198,28,
+20,11,255,22,16,9,255,23,16,8,255,27,18,8,255,24,16,7,255,24,
+16,7,255,74,39,11,255,139,68,16,255,143,70,16,255,143,70,16,255,20,
+13,5,170,0,8,7,6,4,74,87,44,12,255,155,79,18,255,151,73,16,
+255,67,34,10,255,9,7,4,198,9,7,4,96,8,6,5,159,27,17,8,
+255,137,67,16,255,158,80,17,255,112,56,15,255,10,8,5,167,0,8,7,
+5,4,85,74,36,11,255,150,83,17,255,145,77,16,255,55,29,10,255,8,
+6,3,198,8,6,3,88,7,6,4,153,39,24,12,255,199,112,28,255,210,
+115,31,255,184,108,33,255,17,14,10,198,0,24,11,9,6,170,139,69,18,
+255,168,86,19,255,154,78,17,255,17,12,6,235,0,24,7,6,4,85,64,
+32,11,255,162,80,19,255,198,96,21,255,109,63,26,255,15,11,8,227,10,
+8,7,170,8,7,5,195,29,18,8,255,137,67,16,255,154,78,17,255,114,
+59,15,255,11,10,6,164,0,8,9,7,6,85,97,50,16,255,159,81,18,
+255,152,77,17,255,74,36,11,255,10,8,5,198,7,6,4,125,10,8,5,
+198,61,36,20,255,200,105,29,255,209,122,28,255,180,104,29,255,16,12,9,
+170,0,8,12,10,7,170,160,83,21,255,183,89,19,255,174,88,19,255,28,
+19,9,187,0,8,14,10,7,85,143,75,20,255,195,98,20,255,189,92,20,
+255,21,15,8,224,0,24,7,6,4,85,26,16,7,255,111,55,14,255,132,
+67,15,255,39,23,8,255,8,6,3,113,0,68,9,7,6,85,32,22,13,
+255,188,112,31,255,193,114,30,255,94,57,25,255,17,13,10,170,0,44,9,
+7,4,142,10,8,5,255,10,8,5,198,6,5,3,28,0,24,8,7,5,
+85,88,48,19,255,204,114,27,255,208,118,31,255,111,62,26,255,11,8,6,
+227,8,7,5,150,10,8,5,116,10,8,5,88,9,7,4,85,6,5,3,
+74,0,16,10,8,5,99,114,56,13,255,143,70,16,255,143,70,16,255,18,
+12,5,215,0,12,8,7,3,130,118,60,13,255,148,76,17,255,150,76,17,
+255,24,16,7,170,0,8,9,7,4,85,114,56,13,255,145,74,16,255,143,
+70,16,255,52,28,9,255,8,6,3,198,8,6,3,88,8,6,3,144,23,
+15,6,255,130,66,15,255,151,80,16,255,111,55,14,255,10,8,5,144,0,
+8,6,5,3,59,59,32,10,255,157,83,18,255,185,90,20,255,97,54,22,
+255,14,10,7,227,13,10,6,170,13,10,6,255,84,41,13,255,148,76,17,
+255,155,82,18,255,135,66,16,255,14,10,5,159,0,8,9,7,4,85,114,
+56,13,255,145,77,16,255,145,74,16,255,55,28,10,255,9,7,4,198,8,
+6,3,93,8,6,3,147,25,16,6,255,130,64,15,255,151,80,16,255,111,
+55,14,255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,145,77,16,
+255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3,102,8,6,3,
+139,8,6,3,170,9,8,4,113,0,12,10,8,5,91,114,56,13,255,150,
+76,17,255,150,76,17,255,17,12,6,252,0,32,7,6,4,85,64,33,11,
+255,145,77,16,255,143,70,16,255,56,29,9,255,8,6,3,198,8,6,3,
+85,6,5,3,119,14,11,5,255,128,66,15,255,151,73,16,255,143,76,16,
+255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,
+70,16,255,18,12,5,215,0,12,8,7,3,130,114,56,13,255,143,70,16,
+255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,
+70,16,255,143,70,16,255,20,13,5,170,0,8,7,6,4,71,87,44,12,
+255,158,87,17,255,161,85,17,255,103,53,20,255,15,11,8,227,10,8,7,
+170,10,8,7,195,33,20,10,255,137,67,16,255,151,73,16,255,111,55,14,
+255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,146,
+75,17,255,18,13,7,255,0,8,7,6,6,74,24,16,7,255,132,67,15,
+255,145,77,16,255,135,72,16,255,14,10,5,170,0,8,9,7,4,85,114,
+56,13,255,145,77,16,255,143,70,16,255,58,31,11,255,11,8,6,227,11,
+9,6,170,11,8,6,170,10,7,5,170,9,8,4,113,0,12,11,9,6,
+161,175,92,24,255,203,108,24,255,198,101,23,255,25,18,10,255,0,20,8,
+6,3,147,114,56,13,255,143,70,16,255,143,70,16,255,20,13,5,170,0,
+8,9,7,4,85,114,56,13,255,170,87,19,255,199,106,24,255,24,17,11,
+255,0,8,6,6,5,28,15,12,6,255,128,66,15,255,145,74,16,255,143,
+70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145,77,16,
+255,143,70,16,255,90,44,13,255,19,13,6,255,10,8,5,255,13,10,6,
+255,62,33,11,255,135,72,16,255,151,73,16,255,108,53,13,255,10,8,5,
+142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18,
+12,5,215,0,40,7,6,4,85,64,33,11,255,145,77,16,255,143,70,16,
+255,67,34,10,255,14,10,5,255,49,27,9,255,140,72,17,255,160,85,19,
+255,160,85,19,255,110,55,15,255,31,20,8,255,9,7,4,57,0,8,9,
+8,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18,12,5,215,0,
+12,8,7,3,136,118,60,13,255,154,75,17,255,172,87,19,255,24,17,9,
+204,0,8,8,7,5,85,95,49,16,255,161,85,17,255,152,77,17,255,71,
+34,10,255,9,7,4,198,8,6,3,88,8,6,3,142,23,15,6,255,130,
+66,15,255,151,80,16,255,111,55,14,255,14,10,5,170,0,24,9,7,4,
+164,118,56,15,255,145,74,16,255,143,70,16,255,16,12,5,224,0,24,9,
+7,4,85,85,43,12,255,151,80,16,255,143,70,16,255,55,29,10,255,8,
+6,3,198,8,6,3,93,8,6,5,173,45,27,14,255,199,112,28,255,210,
+124,31,255,199,119,34,255,19,15,10,221,0,20,13,11,8,170,46,28,11,
+255,131,65,16,255,145,74,16,255,137,67,16,255,70,35,11,255,12,10,5,
+224,7,6,4,28,0,16,8,6,5,34,37,25,14,255,181,100,28,255,206,
+113,31,255,207,123,32,255,199,119,34,255,107,67,28,255,28,20,11,255,28,
+19,9,255,84,41,13,255,141,75,16,255,145,74,16,255,159,82,20,255,88,
+53,25,255,13,11,8,99,0,8,13,10,6,85,114,60,17,255,148,76,17,
+255,143,70,16,255,21,14,6,255,0,12,10,8,5,170,119,61,14,255,145,
+77,16,255,135,72,16,255,19,13,6,170,0,24,8,7,3,142,114,56,13,
+255,143,70,16,255,143,70,16,255,16,12,5,218,0,24,11,8,6,170,126,
+62,15,255,151,80,16,255,112,57,13,255,19,13,6,255,8,6,3,144,8,
+6,3,85,9,7,4,113,8,6,3,167,8,6,3,170,8,6,3,170,9,
+8,4,113,0,12,10,8,5,91,114,56,13,255,145,74,16,255,143,70,16,
+255,61,32,10,255,9,8,4,170,0,32,12,10,7,207,74,36,11,255,139,
+74,16,255,79,40,12,255,10,8,5,210,0,16,9,7,4,85,27,17,6,
+255,130,66,15,255,143,70,16,255,143,76,16,255,16,12,5,221,0,140,8,
+6,3,85,74,39,11,255,145,77,16,255,143,70,16,255,41,23,8,255,7,
+6,4,173,5,5,2,85,6,5,3,113,14,10,5,255,129,65,14,255,145,
+74,16,255,145,74,16,255,24,16,7,170,0,8,10,8,5,85,112,57,13,
+255,145,77,16,255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3,
+88,8,6,3,144,23,15,6,255,130,66,15,255,151,80,16,255,111,55,14,
+255,10,8,5,144,0,8,6,5,3,59,63,34,10,255,145,77,16,255,143,
+70,16,255,55,29,10,255,8,6,3,198,8,6,3,85,8,6,3,144,32,
+19,7,255,139,74,16,255,155,79,18,255,135,66,16,255,14,10,5,170,0,
+8,6,5,3,57,57,31,10,255,145,77,16,255,143,70,16,255,55,29,10,
+255,8,6,3,198,8,6,3,88,8,6,3,144,21,15,6,255,130,66,15,
+255,143,76,16,255,146,75,17,255,24,15,7,184,0,8,7,6,4,71,66,
+33,11,255,148,79,17,255,143,70,16,255,45,25,8,255,7,5,4,176,7,
+5,4,85,8,6,3,85,9,7,4,85,8,6,3,82,0,28,8,7,3,
+136,114,56,13,255,143,70,16,255,143,70,16,255,16,12,5,221,0,20,7,
+6,4,28,10,8,5,130,19,13,6,170,29,19,8,173,24,16,7,212,27,
+18,8,193,20,13,7,246,55,29,10,255,139,74,16,255,143,70,16,255,143,
+70,16,255,18,13,5,170,0,8,9,7,4,85,115,54,14,255,143,70,16,
+255,143,70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143,
+70,16,255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,
+255,145,74,16,255,145,74,16,255,17,11,6,252,0,24,10,8,5,170,119,
+61,14,255,145,74,16,255,143,70,16,255,18,13,5,170,0,8,9,7,4,
+85,114,56,13,255,143,70,16,255,143,70,16,255,33,20,8,255,5,4,4,
+195,8,6,5,198,46,26,9,255,126,62,15,255,132,67,15,255,35,22,8,
+255,9,7,4,93,0,12,10,8,5,93,114,56,13,255,143,70,16,255,143,
+70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,
+255,143,70,16,255,20,13,5,170,0,4,9,7,4,125,114,56,13,255,21,
+13,6,210,0,4,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16,
+255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,
+70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143,70,16,
+255,143,70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145,
+77,16,255,143,70,16,255,90,44,13,255,17,12,6,255,12,9,5,255,20,
+15,9,255,97,51,20,255,169,87,20,255,161,85,17,255,112,54,15,255,10,
+8,5,142,0,8,9,7,4,85,121,60,16,255,174,88,19,255,176,89,19,
+255,112,59,17,255,37,23,10,255,26,16,7,255,25,18,8,255,24,15,7,
+255,23,16,8,255,18,13,9,198,10,9,7,99,0,16,9,8,6,34,12,
+10,7,167,20,14,7,210,21,15,6,255,26,17,7,255,24,16,7,255,26,
+17,7,255,70,35,11,255,142,73,17,255,148,76,17,255,152,77,17,255,24,
+15,7,170,0,8,13,10,6,96,129,65,18,255,170,87,19,255,170,87,19,
+255,24,16,9,255,0,48,5,4,2,76,8,6,3,85,8,6,3,85,8,
+6,3,85,7,5,4,85,6,5,3,119,16,11,5,255,129,65,14,255,151,
+73,16,255,118,61,15,255,14,10,5,170,0,16,8,7,3,136,114,56,13,
+255,143,70,16,255,143,70,16,255,16,12,5,221,0,16,10,8,7,113,109,
+67,26,255,184,90,21,255,148,76,17,255,52,28,9,255,8,6,3,198,8,
+6,3,88,8,6,3,144,21,15,6,255,130,66,15,255,143,76,16,255,143,
+76,16,255,16,12,5,227,0,20,9,8,6,170,67,42,20,255,202,124,31,
+255,208,128,33,255,205,106,26,255,104,58,21,255,14,11,7,218,6,5,5,
+28,0,16,7,6,4,28,27,17,8,229,102,51,13,255,139,68,16,255,143,
+73,16,255,145,74,16,255,71,37,12,255,26,18,9,255,80,50,23,255,204,
+122,33,255,208,115,33,255,202,104,25,255,149,78,20,255,52,30,11,255,10,
+8,5,85,0,12,14,10,5,170,85,43,12,255,137,73,16,255,77,39,12,
+255,14,10,5,227,10,8,5,170,10,8,5,198,46,26,9,255,137,73,16,
+255,115,59,14,255,25,16,6,232,8,6,3,31,0,12,6,5,3,28,10,
+8,5,119,19,13,6,170,29,19,8,173,26,16,7,210,27,18,8,187,17,
+12,6,246,58,30,11,255,151,77,18,255,192,97,21,255,192,97,21,255,24,
+16,9,207,0,8,4,4,3,3,25,16,6,235,115,59,14,255,143,73,16,
+255,145,77,16,255,108,53,13,255,21,14,6,255,7,6,4,164,10,7,5,
+85,8,7,5,147,9,7,4,136,8,6,5,76,0,20,8,6,5,57,58,
+33,13,255,188,107,27,255,192,111,31,255,85,51,24,255,18,13,9,187,6,
+5,5,20,0,8,11,9,6,156,139,69,18,255,158,83,17,255,148,76,17,
+255,23,15,6,170,0,12,9,7,4,85,19,13,6,255,102,51,13,255,128,
+66,15,255,81,41,12,255,12,9,5,142,0,108,13,10,8,85,115,60,24,
+255,162,75,23,255,121,60,20,255,23,15,8,142,0,60,3,3,2,6,10,
+8,5,170,93,48,12,255,123,65,14,255,123,60,14,255,14,10,5,227,3,
+3,2,85,12,10,7,170,163,83,24,255,199,99,26,255,193,96,24,255,41,
+26,14,227,6,6,5,45,0,24,3,3,2,28,11,8,6,170,106,50,13,
+255,129,63,14,255,129,63,14,255,29,18,8,227,6,5,5,31,0,20,13,
+10,8,136,144,73,21,255,182,89,21,255,99,55,19,255,14,11,7,187,4,
+4,3,3,0,16,9,7,4,113,93,46,12,255,131,66,14,255,121,62,14,
+255,16,11,5,170,0,12,7,6,4,28,14,10,5,227,100,50,13,255,110,
+59,13,255,103,52,14,255,121,59,18,255,134,69,21,255,32,21,11,255,6,
+5,5,198,10,8,7,227,46,28,13,255,104,51,15,255,96,46,13,255,14,
+10,5,139,0,44,10,8,7,108,63,37,18,255,176,88,23,255,160,80,21,
+255,20,14,9,170,0,8,8,6,5,79,85,41,12,255,131,65,16,255,66,
+34,11,255,10,8,5,170,0,144,9,7,4,167,115,56,16,255,165,85,20,
+255,112,65,23,255,18,13,9,142,0,60,13,10,8,142,132,68,21,255,162,
+80,19,255,141,70,18,255,17,12,6,181,0,12,17,12,6,255,103,54,14,
+255,130,66,15,255,31,20,8,255,6,5,3,113,0,32,8,6,3,156,35,
+22,8,255,114,58,13,255,110,59,13,255,88,45,11,255,88,42,11,255,92,
+47,11,255,104,54,13,255,119,58,14,255,61,32,10,255,10,8,5,224,5,
+4,4,20,0,16,11,8,6,85,113,58,22,255,180,90,23,255,140,69,17,
+255,123,63,14,255,123,60,14,255,119,56,14,255,120,61,17,255,24,15,9,
+167,0,16,12,10,7,133,180,88,27,255,203,107,30,255,199,100,28,255,197,
+104,28,255,191,93,28,255,167,78,24,255,132,68,21,255,121,62,18,255,117,
+60,18,255,118,57,17,255,108,50,15,255,17,12,6,113,0,12,14,10,5,
+227,65,33,10,255,115,59,14,255,115,59,14,255,109,52,14,255,116,57,17,
+255,121,59,18,255,139,68,20,255,154,73,19,255,115,62,20,255,33,23,12,
+255,9,8,6,71,0,36,2,2,1,8,8,6,3,170,93,50,12,255,125,
+64,14,255,123,60,14,255,14,10,5,159,0,12,14,10,5,224,65,33,10,
+255,115,59,14,255,115,59,14,255,109,52,14,255,119,61,18,255,129,66,20,
+255,148,75,21,255,170,84,21,255,129,67,22,255,37,25,14,255,8,7,5,
+57,0,8,5,5,4,23,24,17,9,255,103,54,18,255,132,63,17,255,120,
+62,15,255,98,49,13,255,90,45,11,255,94,45,13,255,124,60,17,255,172,
+81,21,255,150,78,25,255,44,29,17,255,9,8,6,91,0,24,8,7,3,
+102,93,46,12,255,125,64,14,255,121,62,14,255,18,12,5,170,0,28,12,
+10,5,227,64,33,11,255,132,66,17,255,158,79,21,255,151,70,22,255,130,
+67,21,255,110,53,15,255,108,53,13,255,118,60,13,255,85,43,12,255,21,
+14,6,255,7,6,4,57,0,12,14,10,5,227,65,33,10,255,131,65,16,
+255,149,72,20,255,133,68,20,255,111,54,16,255,110,53,15,255,138,72,19,
+255,163,81,20,255,112,58,19,255,28,20,9,255,8,7,5,57,0,8,9,
+7,4,91,96,48,13,255,132,70,15,255,123,60,14,255,14,10,5,161,0,
+8,13,10,6,85,148,73,23,255,202,101,27,255,129,67,26,255,18,13,9,
+142,0,28,6,5,3,48,17,12,6,227,108,55,13,255,112,55,13,255,35,
+22,8,255,9,7,4,57,0,64,32,22,13,255,137,68,22,255,154,73,19,
+255,45,26,10,255,8,6,5,144,0,44,8,6,3,68,67,34,10,255,115,
+56,16,255,109,52,14,255,16,11,5,147,0,24,5,4,4,11,22,17,11,
+227,129,76,28,255,195,95,28,255,186,84,23,255,121,59,18,255,107,51,14,
+255,96,46,13,255,90,45,11,255,88,45,11,255,41,24,8,255,12,10,5,
+176,0,12,8,6,3,76,88,44,11,255,125,66,14,255,123,60,14,255,18,
+12,5,170,0,12,9,7,4,85,92,47,11,255,125,64,14,255,123,60,14,
+255,16,11,5,150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123,
+60,14,255,114,58,13,255,93,50,12,255,88,44,11,255,92,47,11,255,104,
+54,13,255,119,58,14,255,85,43,12,255,21,15,6,255,7,6,4,51,0,
+12,12,10,5,221,61,32,10,255,120,62,15,255,123,61,16,255,109,52,14,
+255,96,46,13,255,102,51,13,255,115,59,14,255,123,65,14,255,85,43,12,
+255,25,16,6,255,7,6,4,51,0,8,8,6,3,74,88,45,11,255,125,
+64,14,255,123,60,14,255,114,58,13,255,93,50,12,255,88,45,11,255,92,
+47,11,255,104,52,13,255,118,60,13,255,85,43,12,255,21,15,6,255,7,
+5,4,40,0,8,8,6,3,74,88,45,11,255,125,64,14,255,123,60,14,
+255,114,58,13,255,93,50,12,255,88,45,11,255,92,43,11,255,93,50,12,
+255,93,50,12,255,20,13,5,85,0,8,8,6,3,65,88,45,11,255,125,
+64,14,255,121,62,14,255,18,13,5,170,0,36,12,10,5,227,59,31,10,
+255,115,62,14,255,114,58,13,255,93,50,12,255,88,44,11,255,88,44,11,
+255,104,54,13,255,118,60,13,255,123,60,14,255,123,60,14,255,14,10,5,
+150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18,
+12,5,170,0,12,9,7,4,85,92,47,11,255,125,66,14,255,123,65,14,
+255,14,10,5,150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123,
+65,14,255,14,10,5,159,0,12,14,10,5,221,70,35,11,255,155,74,20,
+255,193,89,26,255,185,91,28,255,172,85,27,255,165,80,24,255,155,78,22,
+255,132,66,17,255,90,44,13,255,21,15,6,255,7,5,4,40,0,8,8,
+6,3,74,88,45,11,255,125,64,14,255,121,62,14,255,19,13,6,176,0,
+12,9,6,4,133,93,50,12,255,131,66,14,255,123,65,14,255,14,11,5,
+150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123,60,14,255,118,
+56,15,255,120,61,17,255,136,67,21,255,118,57,17,255,96,48,13,255,92,
+47,11,255,18,12,5,85,0,8,9,7,4,79,104,51,15,255,140,66,17,
+255,135,66,16,255,17,12,6,198,0,20,9,7,4,85,92,47,11,255,125,
+66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3,65,88,45,11,
+255,135,66,16,255,136,67,17,255,22,14,7,198,0,12,8,6,3,119,88,
+45,11,255,125,64,14,255,123,60,14,255,14,10,5,159,0,12,12,10,5,
+210,59,31,10,255,115,62,14,255,118,60,13,255,104,54,13,255,100,50,13,
+255,100,50,13,255,114,58,13,255,119,63,14,255,85,43,12,255,21,15,6,
+255,7,5,4,40,0,8,8,6,3,74,88,45,11,255,125,66,14,255,123,
+60,14,255,18,12,5,170,0,44,12,10,5,227,59,31,10,255,115,62,14,
+255,114,58,13,255,100,50,13,255,114,56,13,255,133,66,16,255,160,80,21,
+255,176,83,21,255,45,27,12,255,6,5,3,170,0,12,8,6,3,82,88,
+45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9,7,4,
+85,92,47,11,255,131,61,14,255,126,62,15,255,17,11,6,170,0,12,14,
+10,5,227,65,33,10,255,115,59,14,255,115,62,14,255,93,50,12,255,88,
+44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12,255,21,
+15,6,255,7,6,4,57,0,24,9,7,4,85,92,47,11,255,125,66,14,
+255,123,60,14,255,18,12,5,170,0,24,5,5,4,28,19,13,6,255,84,
+42,11,255,115,62,14,255,110,59,13,255,93,50,12,255,84,44,11,255,106,
+54,15,255,176,84,23,255,199,100,28,255,188,101,31,255,90,54,25,255,13,
+10,8,142,0,24,8,6,3,164,72,37,11,255,131,66,14,255,110,54,13,
+255,12,9,5,224,3,3,2,17,0,24,7,6,6,85,30,20,13,255,190,
+96,27,255,199,98,24,255,121,69,22,255,13,10,6,190,4,3,3,28,5,
+4,2,105,27,17,6,255,114,56,13,255,125,64,14,255,45,26,10,255,8,
+7,5,153,0,12,10,7,5,85,96,48,13,255,125,64,14,255,123,60,14,
+255,16,11,5,195,0,12,8,6,3,110,92,47,11,255,131,66,14,255,123,
+65,14,255,18,13,5,170,0,24,9,7,4,85,92,47,11,255,125,66,14,
+255,123,60,14,255,18,12,5,170,0,24,8,7,3,99,93,50,12,255,125,
+66,14,255,115,59,14,255,104,54,13,255,88,45,11,255,88,44,11,255,92,
+43,11,255,92,43,11,255,92,43,11,255,93,50,12,255,93,50,12,255,20,
+13,5,85,0,8,8,6,3,65,88,45,11,255,125,64,14,255,123,60,14,
+255,115,62,14,255,93,46,12,255,16,11,5,127,0,28,5,4,4,28,12,
+10,5,246,104,54,13,255,115,59,14,255,39,23,8,255,8,6,3,82,0,
+12,58,31,9,255,114,58,13,255,119,63,14,255,123,60,14,255,123,65,14,
+255,18,12,5,170,0,144,14,10,5,227,59,31,10,255,115,62,14,255,110,
+59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,104,54,13,255,115,
+59,14,255,123,60,14,255,123,60,14,255,16,11,5,150,0,8,8,6,3,
+65,88,44,11,255,125,64,14,255,123,60,14,255,114,58,13,255,93,50,12,
+255,88,44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12,
+255,21,15,6,255,7,6,4,51,0,12,12,9,5,224,63,32,10,255,115,
+62,14,255,114,56,13,255,93,50,12,255,88,44,11,255,88,45,11,255,110,
+59,13,255,119,61,14,255,85,43,12,255,25,16,6,255,7,6,4,57,0,
+12,12,10,5,221,59,31,10,255,115,62,14,255,114,56,13,255,93,50,12,
+255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14,
+255,121,62,14,255,16,11,5,167,0,12,12,10,5,218,59,31,10,255,115,
+62,14,255,110,59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,88,
+45,11,255,88,44,11,255,16,11,5,105,0,24,9,7,4,85,92,47,11,
+255,125,66,14,255,123,60,14,255,18,12,5,170,0,48,7,5,4,198,93,
+50,12,255,125,66,14,255,123,60,14,255,12,10,5,170,0,8,8,6,3,
+65,88,45,11,255,125,66,14,255,123,65,14,255,18,12,5,170,0,12,9,
+7,4,85,92,47,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,
+8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18,13,5,
+170,0,20,3,3,2,11,9,7,4,227,100,50,13,255,123,60,14,255,123,
+60,14,255,12,10,5,170,0,8,8,6,3,62,88,45,11,255,125,66,14,
+255,123,60,14,255,14,10,5,198,0,8,8,6,3,170,35,22,8,255,115,
+59,14,255,112,55,13,255,33,21,8,255,8,6,3,37,0,8,8,6,3,
+74,88,45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8,
+6,3,65,88,45,11,255,125,66,14,255,123,65,14,255,14,11,5,147,0,
+4,9,7,4,85,92,47,11,255,20,13,5,170,0,4,8,6,3,62,88,
+45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3,
+65,88,45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9,
+7,4,85,92,47,11,255,125,66,14,255,123,60,14,255,14,10,5,159,0,
+12,12,10,5,210,59,31,10,255,115,59,14,255,118,60,13,255,104,54,13,
+255,102,51,13,255,112,53,13,255,122,63,15,255,123,58,14,255,85,43,12,
+255,21,15,6,255,7,5,4,45,0,8,8,6,3,85,113,55,16,255,196,
+92,23,255,195,96,24,255,25,17,10,255,4,3,3,79,0,64,3,2,2,
+28,10,8,5,227,138,71,21,255,177,87,20,255,174,86,21,255,24,16,9,
+170,0,8,13,10,8,85,142,73,23,255,195,96,24,255,194,91,23,255,24,
+17,11,227,0,44,12,9,5,150,35,22,8,255,80,42,11,255,84,44,11,
+255,88,44,11,255,80,42,11,255,88,44,11,255,97,50,12,255,118,60,13,
+255,85,43,12,255,21,15,6,255,8,6,3,57,0,16,9,7,4,85,92,
+47,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,16,6,5,5,
+28,17,13,8,227,68,34,11,255,115,59,14,255,110,59,13,255,93,50,12,
+255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14,
+255,123,65,14,255,18,12,5,170,0,24,12,9,7,170,131,69,24,255,191,
+90,22,255,136,71,19,255,15,11,6,227,4,3,3,17,0,24,7,6,4,
+31,16,11,5,227,104,52,13,255,131,66,14,255,98,49,13,255,10,8,5,
+193,3,2,2,68,8,7,5,170,121,66,26,255,195,96,24,255,156,74,19,
+255,34,21,9,255,9,7,4,85,0,12,8,6,3,51,69,35,10,255,121,
+62,14,255,123,60,14,255,16,11,5,227,4,3,3,28,0,8,8,6,3,
+170,92,47,11,255,125,64,14,255,108,55,13,255,14,10,5,164,0,40,7,
+5,4,198,96,48,13,255,134,65,15,255,133,66,16,255,15,11,6,170,0,
+8,7,5,4,85,78,39,11,255,130,64,15,255,130,64,15,255,134,65,15,
+255,136,67,17,255,124,62,17,255,114,56,17,255,113,55,16,255,118,60,17,
+255,107,55,20,255,48,29,15,255,12,10,7,85,0,20,9,8,6,170,45,
+27,12,255,139,70,20,255,131,66,18,255,107,53,14,255,19,13,6,99,0,
+8,8,6,5,85,92,46,13,255,131,61,14,255,125,64,14,255,14,10,5,
+170,0,12,58,31,9,255,110,59,13,255,115,59,14,255,56,29,9,255,10,
+8,5,227,5,4,4,23,0,108,10,8,7,28,28,18,11,212,49,28,16,
+255,35,21,12,241,13,10,6,85,0,68,14,10,5,142,20,14,5,170,16,
+12,5,164,8,6,3,28,0,8,24,16,9,142,21,15,8,252,23,15,8,
+184,11,8,6,34,0,36,14,10,5,142,20,14,5,170,16,11,5,170,10,
+8,5,28,0,24,7,6,4,25,20,13,7,147,22,15,7,170,10,8,5,
+142,5,4,4,3,0,24,14,10,5,142,20,13,5,170,16,11,5,170,9,
+7,4,28,0,16,7,5,4,28,14,10,5,156,14,10,5,229,24,15,9,
+255,32,20,11,255,28,18,11,244,12,9,7,108,0,8,10,8,5,142,19,
+13,8,235,24,15,7,227,10,8,5,59,0,48,10,8,5,93,23,15,8,
+170,28,18,9,173,15,11,6,28,0,12,18,12,5,142,21,14,6,170,9,
+7,4,133,0,148,8,6,5,113,89,44,14,255,100,51,21,255,13,10,8,
+227,6,5,5,28,0,60,6,5,5,8,17,12,6,142,26,16,7,170,18,
+12,5,170,9,7,4,28,0,8,6,5,3,85,54,28,11,255,136,66,19,
+255,121,59,18,255,15,10,6,241,0,40,8,6,3,57,12,9,5,170,18,
+13,5,178,14,10,5,241,14,10,5,255,14,10,5,252,16,11,5,195,16,
+11,5,170,8,6,3,113,0,24,8,6,5,28,24,16,9,204,24,17,9,
+255,17,12,6,210,14,10,5,170,16,11,5,170,17,11,6,246,27,17,10,
+246,14,10,7,85,0,16,8,6,5,28,21,14,10,195,22,15,11,255,18,
+13,9,255,18,13,9,255,22,15,9,255,19,13,8,255,17,12,6,255,17,
+11,6,255,15,11,6,255,17,12,6,255,19,13,6,204,12,9,5,28,0,
+12,5,4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5,
+235,15,11,6,255,15,11,6,255,19,12,6,204,19,13,6,170,10,8,5,
+170,8,6,5,57,0,48,14,10,5,142,21,13,6,170,16,11,5,170,9,
+7,4,28,0,12,5,4,2,25,8,6,3,125,14,10,5,170,14,10,5,
+210,23,15,8,255,30,20,11,255,30,20,11,255,23,17,10,255,20,14,9,
+244,16,12,9,170,9,8,6,79,0,16,9,7,6,65,15,11,8,170,17,
+12,8,232,21,14,8,255,26,16,9,255,23,15,8,255,21,14,8,255,15,
+11,6,255,22,15,7,178,11,9,6,170,10,8,7,57,0,32,12,10,5,
+142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,5,5,4,28,8,
+6,3,133,15,11,6,193,20,15,9,255,28,18,11,255,30,20,11,255,26,
+16,9,255,14,10,5,238,16,11,5,170,9,7,4,153,7,5,4,57,0,
+16,5,4,2,28,8,6,3,142,18,12,7,207,22,15,9,255,28,18,11,
+255,27,18,10,255,18,13,7,255,15,11,6,227,21,13,6,170,10,7,5,
+164,7,6,4,57,0,16,14,10,5,142,20,13,5,170,16,12,5,170,9,
+7,4,28,0,8,10,8,7,119,149,64,26,255,131,63,26,255,14,11,7,
+227,6,5,5,28,0,32,7,5,4,28,14,10,5,156,20,13,5,170,12,
+9,5,142,6,5,3,6,0,64,12,10,7,142,24,15,7,170,21,13,6,
+170,8,6,3,76,0,48,9,7,6,85,83,43,16,255,176,88,23,255,130,
+62,21,255,16,11,7,170,0,28,9,8,6,28,13,10,8,164,23,16,10,
+190,16,11,7,252,15,11,6,255,14,10,5,255,14,10,5,255,14,10,5,
+255,16,11,5,232,14,10,5,170,8,6,3,85,0,16,14,10,5,142,21,
+13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,142,20,13,5,
+170,16,11,5,170,9,7,4,28,0,12,14,10,5,136,16,12,5,170,16,
+11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5,249,16,
+12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5,5,4,
+28,8,6,3,125,14,10,5,170,18,12,5,176,14,10,5,238,14,10,5,
+246,16,12,5,195,18,13,5,170,16,11,5,170,9,7,4,150,7,5,4,
+54,0,16,14,10,5,142,16,12,5,170,16,11,5,170,18,12,5,170,16,
+11,5,210,14,10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9,
+7,4,153,7,6,4,57,0,16,14,10,5,142,16,12,5,170,16,11,5,
+170,18,12,5,170,16,11,5,210,14,10,5,252,12,9,5,255,16,11,5,
+255,20,13,5,201,11,9,4,28,0,12,14,10,5,139,20,13,5,170,16,
+11,5,170,9,7,4,28,0,36,5,5,4,28,8,6,3,125,14,10,5,
+170,18,13,5,176,14,10,5,238,14,10,5,255,16,11,5,235,18,13,5,
+173,16,11,5,170,16,12,5,170,16,11,5,164,9,7,4,28,0,12,12,
+9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,
+142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,
+13,6,170,16,11,5,170,9,7,4,28,0,12,6,5,3,28,8,7,5,
+139,19,13,8,193,21,15,10,255,31,21,12,255,32,21,13,255,31,20,12,
+255,23,17,10,255,18,12,7,212,10,8,5,159,7,6,4,57,0,16,14,
+10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,
+142,21,13,6,170,16,12,5,170,9,7,4,28,0,12,14,10,5,136,16,
+12,5,170,16,11,5,170,18,12,5,176,17,12,6,252,21,14,8,255,17,
+12,6,255,16,11,5,255,20,13,5,204,11,9,4,28,0,12,14,10,5,
+142,21,14,6,170,18,12,5,170,9,8,4,28,0,24,14,10,5,142,20,
+13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6,
+170,16,12,5,170,10,8,5,28,0,16,12,9,5,142,20,13,5,170,16,
+11,5,170,9,7,4,28,0,12,5,5,4,28,8,6,3,125,14,10,5,
+170,18,12,5,170,20,14,5,173,16,12,5,193,20,13,5,178,20,13,5,
+170,16,11,5,170,9,7,4,153,7,6,4,57,0,16,14,10,5,142,21,
+13,6,170,16,11,5,170,9,7,4,28,0,44,5,5,4,28,8,6,3,
+125,14,10,5,170,18,13,5,170,20,14,5,170,18,12,5,170,13,10,6,
+227,72,38,19,255,185,86,32,255,144,64,29,255,20,15,11,232,8,7,7,
+28,0,12,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,
+16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,5,
+4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5,238,14,
+10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9,7,4,153,7,
+5,4,57,0,32,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,
+28,0,28,8,6,3,57,9,7,4,164,14,10,5,170,18,13,5,173,14,
+10,5,229,14,10,5,255,17,12,6,255,22,15,9,255,20,14,9,252,21,
+15,10,176,11,9,6,139,0,32,11,8,4,122,18,12,5,170,14,10,5,
+150,7,5,4,28,0,32,8,7,7,57,24,16,11,173,26,18,9,190,13,
+10,6,142,5,4,4,11,0,8,8,7,3,68,14,10,5,170,16,11,5,
+170,9,7,4,74,0,20,14,10,5,142,20,14,5,170,16,11,5,170,9,
+7,4,28,0,16,14,10,5,142,20,14,5,170,16,11,5,170,9,8,4,
+28,0,28,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,
+28,14,10,5,142,18,13,5,170,16,12,5,170,18,13,5,173,14,10,5,
+227,14,10,5,255,14,10,5,252,12,9,5,255,12,9,5,255,16,11,5,
+255,20,13,5,201,11,9,4,28,0,12,12,10,5,136,16,12,5,170,16,
+11,5,170,16,11,5,193,21,15,6,184,14,10,5,31,0,32,8,6,3,
+139,54,30,9,255,107,50,12,255,78,39,11,255,9,7,4,161,0,12,20,
+13,5,142,18,12,5,210,16,11,5,170,16,11,5,170,16,11,5,170,9,
+7,4,28,0,64,13,10,8,57,9,7,6,159,8,6,5,159,10,8,7,
+130,10,8,7,119,9,7,6,133,9,7,6,167,10,8,7,170,11,9,8,
+113,0,44,5,4,2,28,8,6,3,125,14,10,5,170,18,13,5,176,14,
+10,5,238,14,10,5,255,16,11,5,235,18,13,5,173,16,11,5,170,16,
+12,5,170,16,11,5,164,9,7,4,28,0,12,14,10,5,136,16,12,5,
+170,16,11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5,
+249,16,12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5,
+5,4,28,8,6,3,125,14,10,5,170,18,13,5,176,14,10,5,238,14,
+10,5,255,14,10,5,249,16,11,5,193,16,11,5,170,9,7,4,150,7,
+5,4,57,0,16,5,5,4,28,8,6,3,125,14,10,5,170,18,13,5,
+176,14,10,5,238,14,10,5,255,14,10,5,235,18,13,5,173,16,11,5,
+170,16,12,5,170,16,11,5,170,9,7,4,28,0,12,5,5,4,28,8,
+6,3,125,14,10,5,170,18,13,5,176,14,10,5,235,14,10,5,255,14,
+10,5,255,16,11,5,255,20,13,5,207,12,9,5,34,0,28,14,10,5,
+142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,6,5,3,85,7,
+5,4,85,6,5,3,85,5,4,4,85,5,4,4,105,9,8,4,241,72,
+37,11,255,110,54,13,255,67,34,10,255,8,6,3,144,0,12,14,10,5,
+142,21,14,6,170,16,12,5,170,9,8,4,28,0,16,14,10,5,142,21,
+13,6,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6,
+170,16,11,5,170,9,7,4,28,0,12,7,5,2,37,8,6,3,142,8,
+6,3,227,25,15,6,255,75,36,10,255,99,51,12,255,66,33,9,255,8,
+6,3,130,0,12,14,10,5,139,21,13,6,170,16,11,5,170,9,7,4,
+28,0,12,8,6,3,79,14,10,5,170,18,13,5,170,12,9,5,142,0,
+16,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,12,12,
+9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,8,20,13,5,
+85,11,8,4,28,0,8,12,9,5,142,21,13,6,170,16,11,5,170,9,
+7,4,28,0,12,12,9,5,142,21,13,6,170,16,11,5,170,9,7,4,
+28,0,16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,
+12,5,5,4,28,8,6,3,125,14,10,5,170,18,12,5,170,20,14,5,
+173,16,12,5,193,20,13,5,178,20,13,5,170,16,11,5,170,9,7,4,
+161,7,6,4,57,0,12,8,6,3,85,84,40,13,255,164,73,23,255,184,
+79,27,255,15,11,8,246,0,72,11,10,10,170,176,83,37,255,196,87,33,
+255,192,88,31,255,22,15,11,193,0,12,21,15,10,159,26,17,11,255,24,
+17,11,221,10,8,7,85,0,44,8,7,3,59,12,9,5,170,16,11,5,
+210,14,10,5,255,14,10,5,255,14,10,5,255,14,10,5,246,16,12,5,
+193,16,11,5,170,9,7,4,153,6,5,3,57,0,24,14,10,5,142,20,
+13,5,170,16,11,5,170,9,7,4,28,0,20,6,5,3,28,8,6,3,
+127,14,10,5,170,18,13,5,176,14,10,5,238,14,10,5,255,14,10,5,
+235,18,13,5,173,16,11,5,170,16,12,5,170,16,11,5,170,9,7,4,
+28,0,28,14,11,7,142,29,19,8,170,17,11,6,159,8,6,3,28,0,
+32,7,5,4,28,14,10,5,150,20,13,5,170,12,9,5,142,5,4,2,
+14,0,8,15,11,8,142,26,18,9,178,19,13,6,170,8,6,3,68,0,
+20,18,12,5,142,16,11,5,238,16,11,5,170,9,7,4,28,0,16,12,
+9,5,142,16,11,5,215,18,13,5,187,11,9,4,28,0,16,4,4,3,
+6,5,4,2,82,5,4,2,85,5,4,2,85,5,4,2,85,5,4,2,
+99,9,7,4,241,72,37,11,255,112,53,13,255,77,39,12,255,10,8,5,
+170,0,12,19,13,8,184,20,14,9,255,16,11,7,255,14,11,7,255,17,
+12,8,255,22,15,9,255,27,17,10,255,30,19,11,255,28,18,11,255,21,
+15,10,255,15,12,8,198,9,7,6,28,0,24,8,6,5,91,15,11,6,
+170,14,11,5,238,19,13,6,198,12,9,5,28,0,8,6,5,3,85,54,
+29,9,255,100,48,13,255,109,52,14,255,15,11,6,170,0,12,19,13,6,
+144,14,10,5,255,16,11,5,178,8,6,3,119,0,255,0,255,0,174,12,
+9,7,88,99,44,20,255,26,16,11,232,5,4,4,28,0,92,6,5,3,
+57,60,28,11,255,158,67,23,255,88,44,23,255,11,9,6,142,0,255,0,
+255,0,150,12,9,7,110,126,51,25,255,25,17,12,232,5,4,4,28,0,
+184,6,5,5,28,19,14,10,227,52,29,17,255,30,20,13,255,9,8,6,
+82,0,255,0,255,0,255,0,255,0,8,12,10,9,170,172,81,49,255,213,
+125,94,255,185,88,58,255,23,16,14,159,0,255,0,255,0,106,5,4,2,
+28,16,11,5,244,68,34,9,255,62,33,9,255,9,8,4,139,0,96,10,
+8,7,48,71,33,18,255,108,47,23,255,107,48,22,255,113,51,24,255,109,
+50,24,255,104,45,21,255,104,45,21,255,113,49,24,255,115,50,24,255,18,
+13,9,136,0,255,0,129,9,7,6,34,18,13,9,244,66,31,15,255,84,
+37,17,255,83,36,16,255,75,34,14,255,73,35,14,255,91,41,16,255,110,
+47,19,255,79,40,16,255,24,16,9,255,8,6,5,57,0,100,22,14,5,
+244,40,23,7,255,42,23,7,255,54,28,9,255,60,31,9,255,36,22,7,
+255,12,9,5,244,6,5,3,28,0,255,0,29,9,7,6,85,72,34,13,
+255,126,56,21,255,148,63,25,255,25,17,14,190,0,72,15,12,12,133,178,
+86,57,255,200,89,55,255,194,82,47,255,30,20,17,187,0,255,0,169,9,
+7,4,99,17,12,6,255,42,22,9,255,49,25,9,255,54,26,11,255,52,
+26,11,255,59,28,12,255,82,37,15,255,111,49,18,255,84,39,17,255,25,
+17,10,255,8,7,5,57,0,112,6,5,3,57,38,22,7,255,85,39,12,
+255,124,52,21,255,20,13,9,170,0,255,0,255,0,202,8,6,5,28,26,
+16,11,170,11,8,6,85,0,100,12,8,5,119,20,14,9,170,12,9,7,
+142,0,255,0,255,0,154,9,7,6,28,27,17,12,170,11,9,8,85,0,
+192,7,6,6,28,8,7,5,85,8,6,5,57,0,255,0,255,0,255,0,
+255,0,16,25,17,16,161,41,27,26,255,40,26,23,235,14,12,11,82,0,
+255,0,255,0,110,8,6,3,37,9,7,4,142,9,7,4,136,6,5,3,
+6,0,100,23,15,10,153,19,13,10,255,16,11,9,255,16,11,9,255,16,
+11,9,255,16,11,9,255,16,11,9,255,18,13,9,255,24,16,11,204,16,
+11,9,31,0,255,0,133,10,8,7,142,18,12,9,207,18,13,9,255,16,
+11,9,255,15,11,8,255,15,11,8,252,18,13,9,195,18,12,9,170,11,
+8,6,167,8,7,5,57,0,104,9,8,4,142,14,10,5,170,13,10,6,
+170,13,9,6,170,11,8,6,170,7,6,4,130,6,5,3,28,0,255,0,
+37,14,10,7,142,21,14,10,170,19,13,10,170,14,11,9,31,0,72,8,
+7,8,14,25,17,16,142,27,18,16,193,26,18,15,170,15,11,10,34,0,
+255,0,169,9,7,4,28,11,8,6,170,14,10,7,232,15,10,8,255,15,
+10,8,255,15,10,8,255,15,10,8,252,18,12,9,195,18,12,9,170,11,
+8,6,167,9,7,6,57,0,120,9,7,4,91,16,11,7,170,20,13,9,
+170,13,10,8,28,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,
+255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,
+255,0,255,0,255}};
+ /* Created by MiniCompress.. an iOS RLE compressor.
+ * Compress Rate : 46.36 %
+ */
diff --git a/src/visualizations/Goom/goom2k4-0/src/gfontrle.h b/src/visualizations/Goom/goom2k4-0/src/gfontrle.h
new file mode 100644
index 0000000000..41e2462fdb
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/gfontrle.h
@@ -0,0 +1,7 @@
+extern const struct {
+ unsigned int width;
+ unsigned int height;
+ unsigned int bytes_per_pixel;
+ unsigned int rle_size;
+ unsigned char rle_pixel [49725];
+} the_font ;
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom.h b/src/visualizations/Goom/goom2k4-0/src/goom.h
new file mode 100644
index 0000000000..b0ddab17e3
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom.h
@@ -0,0 +1,30 @@
+#ifndef _GOOMCORE_H
+#define _GOOMCORE_H
+
+#include "goom_config.h"
+#include "goom_plugin_info.h"
+#include "goomsl.h"
+
+#define NB_FX 10
+
+PluginInfo *goom_init (guint32 resx, guint32 resy);
+void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy);
+
+/*
+ * forceMode == 0 : do nothing
+ * forceMode == -1 : lock the FX
+ * forceMode == 1..NB_FX : force a switch to FX n# forceMode
+ *
+ * songTitle = pointer to the title of the song...
+ * - NULL if it is not the start of the song
+ * - only have a value at the start of the song
+ */
+guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], int forceMode, float fps,
+ char *songTitle, char *message);
+
+/* returns 0 if the buffer wasn't accepted */
+int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer);
+
+void goom_close (PluginInfo *goomInfo);
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_config.h b/src/visualizations/Goom/goom2k4-0/src/goom_config.h
new file mode 100644
index 0000000000..84630ff74c
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_config.h
@@ -0,0 +1,28 @@
+#if WORDS_BIGENDIAN
+#define COLOR_ARGB
+#else
+#define COLOR_BGRA
+#endif
+
+#if 1
+/* ndef COLOR_BGRA */
+/** position des composantes **/
+ #define BLEU 2
+ #define VERT 1
+ #define ROUGE 0
+ #define ALPHA 3
+#else
+ #define ROUGE 1
+ #define BLEU 3
+ #define VERT 2
+ #define ALPHA 0
+#endif
+
+#ifndef guint32
+#define guint8 unsigned char
+#define guin16 unsigned short
+#define guint32 unsigned int
+#define gint8 signed char
+#define gint16 signed short int
+#define gint32 signed int
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_config_param.h b/src/visualizations/Goom/goom2k4-0/src/goom_config_param.h
new file mode 100644
index 0000000000..3c6838d307
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_config_param.h
@@ -0,0 +1,115 @@
+#ifndef _CONFIG_PARAM_H
+#define _CONFIG_PARAM_H
+
+#include <stdlib.h>
+
+/**
+ * File created on 2003-05-24 by Jeko.
+ * (c)2003, JC Hoelt for iOS-software.
+ *
+ * LGPL Licence.
+ */
+
+typedef enum {
+ PARAM_INTVAL,
+ PARAM_FLOATVAL,
+ PARAM_BOOLVAL,
+ PARAM_STRVAL,
+ PARAM_LISTVAL,
+} ParamType;
+
+struct IntVal {
+ int value;
+ int min;
+ int max;
+ int step;
+};
+struct FloatVal {
+ float value;
+ float min;
+ float max;
+ float step;
+};
+struct StrVal {
+ char *value;
+};
+struct ListVal {
+ char *value;
+ int nbChoices;
+ char **choices;
+};
+struct BoolVal {
+ int value;
+};
+
+
+typedef struct _PARAM {
+ char *name;
+ char *desc;
+ char rw;
+ ParamType type;
+ union {
+ struct IntVal ival;
+ struct FloatVal fval;
+ struct StrVal sval;
+ struct ListVal slist;
+ struct BoolVal bval;
+ } param;
+
+ /* used by the core to inform the GUI of a change */
+ void (*change_listener)(struct _PARAM *_this);
+
+ /* used by the GUI to inform the core of a change */
+ void (*changed)(struct _PARAM *_this);
+
+ void *user_data; /* can be used by the GUI */
+} PluginParam;
+
+#define IVAL(p) ((p).param.ival.value)
+#define SVAL(p) ((p).param.sval.value)
+#define FVAL(p) ((p).param.fval.value)
+#define BVAL(p) ((p).param.bval.value)
+#define LVAL(p) ((p).param.slist.value)
+
+#define FMIN(p) ((p).param.fval.min)
+#define FMAX(p) ((p).param.fval.max)
+#define FSTEP(p) ((p).param.fval.step)
+
+#define IMIN(p) ((p).param.ival.min)
+#define IMAX(p) ((p).param.ival.max)
+#define ISTEP(p) ((p).param.ival.step)
+
+PluginParam goom_secure_param(void);
+
+PluginParam goom_secure_f_param(char *name);
+PluginParam goom_secure_i_param(char *name);
+PluginParam goom_secure_b_param(char *name, int value);
+PluginParam goom_secure_s_param(char *name);
+
+PluginParam goom_secure_f_feedback(char *name);
+PluginParam goom_secure_i_feedback(char *name);
+
+void goom_set_str_param_value(PluginParam *p, const char *str);
+void goom_set_list_param_value(PluginParam *p, const char *str);
+
+typedef struct _PARAMETERS {
+ char *name;
+ char *desc;
+ int nbParams;
+ PluginParam **params;
+} PluginParameters;
+
+PluginParameters goom_plugin_parameters(const char *name, int nb);
+
+#define secure_param goom_secure_param
+#define secure_f_param goom_secure_f_param
+#define secure_i_param goom_secure_i_param
+#define secure_b_param goom_secure_b_param
+#define secure_s_param goom_secure_s_param
+#define secure_f_feedback goom_secure_f_feedback
+#define secure_i_feedback goom_secure_i_feedback
+#define set_list_param_value goom_set_list_param_value
+#define set_str_param_value goom_set_str_param_value
+#define plugin_parameters goom_plugin_parameters
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_core.c b/src/visualizations/Goom/goom2k4-0/src/goom_core.c
new file mode 100644
index 0000000000..836e1c3046
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_core.c
@@ -0,0 +1,895 @@
+/**
+* file: goom_core.c
+ * author: Jean-Christophe Hoelt (which is not so proud of it)
+ *
+ * Contains the core of goom's work.
+ *
+ * (c)2000-2003, by iOS-software.
+ */
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
+
+#include "goom.h"
+#include "goom_tools.h"
+#include "goom_filters.h"
+#include "lines.h"
+#include "ifs.h"
+#include "tentacle3d.h"
+#include "gfontlib.h"
+
+#include "sound_tester.h"
+#include "goom_plugin_info.h"
+#include "goom_fx.h"
+#include "goomsl.h"
+
+/* #define VERBOSE */
+
+#define STOP_SPEED 128
+/* TODO: put that as variable in PluginInfo */
+#define TIME_BTW_CHG 300
+
+static void choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur,
+ int *mode, float *amplitude, int far);
+
+static void update_message (PluginInfo *goomInfo, char *message);
+
+static void init_buffers(PluginInfo *goomInfo, int buffsize)
+{
+ goomInfo->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128);
+ bzero (goomInfo->pixel, buffsize * sizeof (guint32) + 128);
+ goomInfo->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128);
+ bzero (goomInfo->back, buffsize * sizeof (guint32) + 128);
+ goomInfo->conv = (Pixel *) malloc (buffsize * sizeof (guint32) + 128);
+ bzero (goomInfo->conv, buffsize * sizeof (guint32) + 128);
+
+ goomInfo->outputBuf = goomInfo->conv;
+
+ goomInfo->p1 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->pixel)) / 128) * 128);
+ goomInfo->p2 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->back)) / 128) * 128);
+}
+
+/**************************
+* INIT *
+**************************/
+PluginInfo *goom_init (guint32 resx, guint32 resy)
+{
+ PluginInfo *goomInfo = (PluginInfo*)malloc(sizeof(PluginInfo));
+
+#ifdef VERBOSE
+ printf ("GOOM: init (%d, %d);\n", resx, resy);
+#endif
+
+ plugin_info_init(goomInfo,4);
+
+ goomInfo->star_fx = flying_star_create();
+ goomInfo->star_fx.init(&goomInfo->star_fx, goomInfo);
+
+ goomInfo->zoomFilter_fx = zoomFilterVisualFXWrapper_create ();
+ goomInfo->zoomFilter_fx.init(&goomInfo->zoomFilter_fx, goomInfo);
+
+ goomInfo->tentacles_fx = tentacle_fx_create();
+ goomInfo->tentacles_fx.init(&goomInfo->tentacles_fx, goomInfo);
+
+ goomInfo->convolve_fx = convolve_create();
+ goomInfo->convolve_fx.init(&goomInfo->convolve_fx, goomInfo);
+
+ plugin_info_add_visual (goomInfo, 0, &goomInfo->zoomFilter_fx);
+ plugin_info_add_visual (goomInfo, 1, &goomInfo->tentacles_fx);
+ plugin_info_add_visual (goomInfo, 2, &goomInfo->star_fx);
+ plugin_info_add_visual (goomInfo, 3, &goomInfo->convolve_fx);
+
+ goomInfo->screen.width = resx;
+ goomInfo->screen.height = resy;
+ goomInfo->screen.size = resx * resy;
+
+ init_buffers(goomInfo, goomInfo->screen.size);
+ goomInfo->gRandom = goom_random_init((uintptr_t)goomInfo->pixel);
+
+ goomInfo->cycle = 0;
+
+ goomInfo->ifs_fx = ifs_visualfx_create();
+ goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo);
+
+ goomInfo->gmline1 = goom_lines_init (goomInfo, resx, goomInfo->screen.height,
+ GML_HLINE, goomInfo->screen.height, GML_BLACK,
+ GML_CIRCLE, 0.4f * (float) goomInfo->screen.height, GML_VERT);
+ goomInfo->gmline2 = goom_lines_init (goomInfo, resx, goomInfo->screen.height,
+ GML_HLINE, 0, GML_BLACK,
+ GML_CIRCLE, 0.2f * (float) goomInfo->screen.height, GML_RED);
+
+ gfont_load ();
+
+ /* goom_set_main_script(goomInfo, goomInfo->main_script_str); */
+
+ return goomInfo;
+}
+
+
+
+void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy)
+{
+ free (goomInfo->pixel);
+ free (goomInfo->back);
+ free (goomInfo->conv);
+
+ goomInfo->screen.width = resx;
+ goomInfo->screen.height = resy;
+ goomInfo->screen.size = resx * resy;
+
+ init_buffers(goomInfo, goomInfo->screen.size);
+
+ /* init_ifs (goomInfo, resx, goomInfo->screen.height); */
+ goomInfo->ifs_fx.free(&goomInfo->ifs_fx);
+ goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo);
+
+ goom_lines_set_res (goomInfo->gmline1, resx, goomInfo->screen.height);
+ goom_lines_set_res (goomInfo->gmline2, resx, goomInfo->screen.height);
+}
+
+int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer)
+{
+ goomInfo->outputBuf = (Pixel*)buffer;
+ return 1;
+}
+
+/********************************************
+* UPDATE *
+********************************************
+
+* WARNING: this is a 600 lines function ! (21-11-2003)
+*/
+guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512],
+ int forceMode, float fps, char *songTitle, char *message)
+{
+ Pixel *return_val;
+ guint32 pointWidth;
+ guint32 pointHeight;
+ int i;
+ float largfactor; /* elargissement de l'intervalle d'évolution des points */
+ Pixel *tmp;
+
+ ZoomFilterData *pzfd;
+
+ /* test if the config has changed, update it if so */
+ pointWidth = (goomInfo->screen.width * 2) / 5;
+ pointHeight = ((goomInfo->screen.height) * 2) / 5;
+
+ /* ! etude du signal ... */
+ evaluate_sound (data, &(goomInfo->sound));
+
+ /* goom_execute_main_script(goomInfo); */
+
+ /* ! calcul du deplacement des petits points ... */
+ largfactor = goomInfo->sound.speedvar / 150.0f + goomInfo->sound.volume / 1.5f;
+
+ if (largfactor > 1.5f)
+ largfactor = 1.5f;
+
+ goomInfo->update.decay_ifs--;
+ if (goomInfo->update.decay_ifs > 0)
+ goomInfo->update.ifs_incr += 2;
+ if (goomInfo->update.decay_ifs == 0)
+ goomInfo->update.ifs_incr = 0;
+
+ if (goomInfo->update.recay_ifs) {
+ goomInfo->update.ifs_incr -= 2;
+ goomInfo->update.recay_ifs--;
+ if ((goomInfo->update.recay_ifs == 0)&&(goomInfo->update.ifs_incr<=0))
+ goomInfo->update.ifs_incr = 1;
+ }
+
+ if (goomInfo->update.ifs_incr > 0)
+ goomInfo->ifs_fx.apply(&goomInfo->ifs_fx, goomInfo->p2, goomInfo->p1, goomInfo);
+
+ if (goomInfo->curGState->drawPoints) {
+ for (i = 1; i * 15 <= goomInfo->sound.speedvar*80.0f + 15; i++) {
+ goomInfo->update.loopvar += goomInfo->sound.speedvar*50 + 1;
+
+ pointFilter (goomInfo, goomInfo->p1,
+ YELLOW,
+ ((pointWidth - 6.0f) * largfactor + 5.0f),
+ ((pointHeight - 6.0f) * largfactor + 5.0f),
+ i * 152.0f, 128.0f, goomInfo->update.loopvar + i * 2032);
+ pointFilter (goomInfo, goomInfo->p1, ORANGE,
+ ((pointWidth / 2) * largfactor) / i + 10.0f * i,
+ ((pointHeight / 2) * largfactor) / i + 10.0f * i,
+ 96.0f, i * 80.0f, goomInfo->update.loopvar / i);
+ pointFilter (goomInfo, goomInfo->p1, VIOLET,
+ ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i,
+ ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i,
+ i + 122.0f, 134.0f, goomInfo->update.loopvar / i);
+ pointFilter (goomInfo, goomInfo->p1, BLACK,
+ ((pointHeight / 3) * largfactor + 20.0f),
+ ((pointHeight / 3) * largfactor + 20.0f),
+ 58.0f, i * 66.0f, goomInfo->update.loopvar / i);
+ pointFilter (goomInfo, goomInfo->p1, WHITE,
+ (pointHeight * largfactor + 10.0f * i) / i,
+ (pointHeight * largfactor + 10.0f * i) / i,
+ 66.0f, 74.0f, goomInfo->update.loopvar + i * 500);
+ }
+ }
+
+ /* par défaut pas de changement de zoom */
+ pzfd = NULL;
+
+ /*
+ * Test forceMode
+ */
+#ifdef VERBOSE
+ if (forceMode != 0) {
+ printf ("forcemode = %d\n", forceMode);
+ }
+#endif
+
+
+ /* diminuer de 1 le temps de lockage */
+ /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */
+ /* changement d'etat du plugin juste apres un autre changement d'etat. oki */
+ if (--goomInfo->update.lockvar < 0)
+ goomInfo->update.lockvar = 0;
+
+ /* on verifie qu'il ne se pas un truc interressant avec le son. */
+ if ((goomInfo->sound.timeSinceLastGoom == 0)
+ || (forceMode > 0)
+ || (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG)) {
+
+ /* changement eventuel de mode */
+ if (goom_irand(goomInfo->gRandom,16) == 0)
+ switch (goom_irand(goomInfo->gRandom,34)) {
+ case 0:
+ case 10:
+ goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2);
+ case 13:
+ case 20:
+ case 21:
+ goomInfo->update.zoomFilterData.mode = WAVE_MODE;
+ goomInfo->update.zoomFilterData.reverse = 0;
+ goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,3) == 0);
+ if (goom_irand(goomInfo->gRandom,2))
+ goomInfo->update.zoomFilterData.vitesse = (goomInfo->update.zoomFilterData.vitesse + 127) >> 1;
+ break;
+ case 1:
+ case 11:
+ goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE;
+ goomInfo->update.zoomFilterData.waveEffect = 0;
+ goomInfo->update.zoomFilterData.hypercosEffect = 0;
+ break;
+ case 2:
+ case 12:
+ goomInfo->update.zoomFilterData.mode = AMULETTE_MODE;
+ goomInfo->update.zoomFilterData.waveEffect = 0;
+ goomInfo->update.zoomFilterData.hypercosEffect = 0;
+ break;
+ case 3:
+ goomInfo->update.zoomFilterData.mode = WATER_MODE;
+ goomInfo->update.zoomFilterData.waveEffect = 0;
+ goomInfo->update.zoomFilterData.hypercosEffect = 0;
+ break;
+ case 4:
+ case 14:
+ goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE;
+ goomInfo->update.zoomFilterData.waveEffect = 0;
+ goomInfo->update.zoomFilterData.hypercosEffect = 0;
+ break;
+ case 5:
+ case 15:
+ case 22:
+ goomInfo->update.zoomFilterData.mode = HYPERCOS1_MODE;
+ goomInfo->update.zoomFilterData.waveEffect = 0;
+ goomInfo->update.zoomFilterData.hypercosEffect = (goom_irand(goomInfo->gRandom,3) == 0);
+ break;
+ case 6:
+ case 16:
+ goomInfo->update.zoomFilterData.mode = HYPERCOS2_MODE;
+ goomInfo->update.zoomFilterData.waveEffect = 0;
+ goomInfo->update.zoomFilterData.hypercosEffect = 0;
+ break;
+ case 7:
+ case 17:
+ goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE;
+ goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,4) == 0);
+ goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2);
+ break;
+ case 8:
+ case 18:
+ case 19:
+ goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE;
+ goomInfo->update.zoomFilterData.waveEffect = 1;
+ goomInfo->update.zoomFilterData.hypercosEffect = 1;
+ break;
+ case 29:
+ case 30:
+ goomInfo->update.zoomFilterData.mode = YONLY_MODE;
+ break;
+ case 31:
+ case 32:
+ case 33:
+ goomInfo->update.zoomFilterData.mode = SPEEDWAY_MODE;
+ break;
+ default:
+ goomInfo->update.zoomFilterData.mode = NORMAL_MODE;
+ goomInfo->update.zoomFilterData.waveEffect = 0;
+ goomInfo->update.zoomFilterData.hypercosEffect = 0;
+ }
+ }
+
+ /* tout ceci ne sera fait qu'en cas de non-blocage */
+ if (goomInfo->update.lockvar == 0) {
+ /* reperage de goom (acceleration forte de l'acceleration du volume) */
+ /* -> coup de boost de la vitesse si besoin.. */
+ if (goomInfo->sound.timeSinceLastGoom == 0) {
+
+ int i;
+ goomInfo->update.goomvar++;
+
+ /* SELECTION OF THE GOOM STATE */
+ if ((!goomInfo->update.stateSelectionBlocker)&&(goom_irand(goomInfo->gRandom,3))) {
+ goomInfo->update.stateSelectionRnd = goom_irand(goomInfo->gRandom,goomInfo->statesRangeMax);
+ goomInfo->update.stateSelectionBlocker = 3;
+ }
+ else if (goomInfo->update.stateSelectionBlocker) goomInfo->update.stateSelectionBlocker--;
+
+ for (i=0;i<goomInfo->statesNumber;i++)
+ if ((goomInfo->update.stateSelectionRnd >= goomInfo->states[i].rangemin)
+ && (goomInfo->update.stateSelectionRnd <= goomInfo->states[i].rangemax))
+ goomInfo->curGState = &(goomInfo->states[i]);
+
+ if ((goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr<=0)) {
+ goomInfo->update.recay_ifs = 5;
+ goomInfo->update.ifs_incr = 11;
+ }
+
+ if ((!goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr>0) && (goomInfo->update.decay_ifs<=0))
+ goomInfo->update.decay_ifs = 100;
+
+ if (!goomInfo->curGState->drawScope)
+ goomInfo->update.stop_lines = 0xf000 & 5;
+
+ if (!goomInfo->curGState->drawScope) {
+ goomInfo->update.stop_lines = 0;
+ goomInfo->update.lineMode = goomInfo->update.drawLinesDuration;
+ }
+
+ /* if (goomInfo->update.goomvar % 1 == 0) */
+ {
+ guint32 vtmp;
+ guint32 newvit;
+
+ goomInfo->update.lockvar = 50;
+ newvit = STOP_SPEED + 1 - ((float)3.5f * log10(goomInfo->sound.speedvar * 60 + 1));
+ /* retablir le zoom avant.. */
+ if ((goomInfo->update.zoomFilterData.reverse) && (!(goomInfo->cycle % 13)) && (rand () % 5 == 0)) {
+ goomInfo->update.zoomFilterData.reverse = 0;
+ goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 2;
+ goomInfo->update.lockvar = 75;
+ }
+ if (goom_irand(goomInfo->gRandom,10) == 0) {
+ goomInfo->update.zoomFilterData.reverse = 1;
+ goomInfo->update.lockvar = 100;
+ }
+
+ if (goom_irand(goomInfo->gRandom,10) == 0)
+ goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1;
+ if (goom_irand(goomInfo->gRandom,12) == 0)
+ goomInfo->update.zoomFilterData.vitesse = STOP_SPEED + 1;
+
+ /* changement de milieu.. */
+ switch (goom_irand(goomInfo->gRandom,25)) {
+ case 0:
+ case 3:
+ case 6:
+ goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height - 1;
+ goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2;
+ break;
+ case 1:
+ case 4:
+ goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width - 1;
+ break;
+ case 2:
+ case 5:
+ goomInfo->update.zoomFilterData.middleX = 1;
+ break;
+ default:
+ goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2;
+ goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2;
+ }
+
+ if ((goomInfo->update.zoomFilterData.mode == WATER_MODE)
+ || (goomInfo->update.zoomFilterData.mode == YONLY_MODE)
+ || (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE)) {
+ goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2;
+ goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2;
+ }
+
+ switch (vtmp = (goom_irand(goomInfo->gRandom,15))) {
+ case 0:
+ goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,3)
+ - goom_irand(goomInfo->gRandom,3);
+ goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,3)
+ - goom_irand(goomInfo->gRandom,3);
+ break;
+ case 3:
+ goomInfo->update.zoomFilterData.vPlaneEffect = 0;
+ goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,8)
+ - goom_irand(goomInfo->gRandom,8);
+ break;
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,5)
+ - goom_irand(goomInfo->gRandom,5);
+ goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.vPlaneEffect;
+ break;
+ case 8:
+ goomInfo->update.zoomFilterData.hPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8);
+ goomInfo->update.zoomFilterData.vPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect;
+ break;
+ case 9:
+ goomInfo->update.zoomFilterData.vPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8);
+ goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect;
+ break;
+ case 13:
+ goomInfo->update.zoomFilterData.hPlaneEffect = 0;
+ goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10)
+ - goom_irand(goomInfo->gRandom,10);
+ break;
+ case 14:
+ goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,10)
+ - goom_irand(goomInfo->gRandom,10);
+ goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10)
+ - goom_irand(goomInfo->gRandom,10);
+ break;
+ default:
+ if (vtmp < 10) {
+ goomInfo->update.zoomFilterData.vPlaneEffect = 0;
+ goomInfo->update.zoomFilterData.hPlaneEffect = 0;
+ }
+ }
+
+ if (goom_irand(goomInfo->gRandom,5) != 0)
+ goomInfo->update.zoomFilterData.noisify = 0;
+ else {
+ goomInfo->update.zoomFilterData.noisify = goom_irand(goomInfo->gRandom,2) + 1;
+ goomInfo->update.lockvar *= 2;
+ }
+
+ if (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE) {
+ goomInfo->update.zoomFilterData.vPlaneEffect = 0;
+ goomInfo->update.zoomFilterData.hPlaneEffect = 0;
+ goomInfo->update.zoomFilterData.noisify = 0;
+ }
+
+ if ((goomInfo->update.zoomFilterData.middleX == 1) || (goomInfo->update.zoomFilterData.middleX == (signed int)goomInfo->screen.width - 1)) {
+ goomInfo->update.zoomFilterData.vPlaneEffect = 0;
+ if (goom_irand(goomInfo->gRandom,2))
+ goomInfo->update.zoomFilterData.hPlaneEffect = 0;
+ }
+
+ if ((signed int)newvit < goomInfo->update.zoomFilterData.vitesse) /* on accelere */
+ {
+ pzfd = &goomInfo->update.zoomFilterData;
+ if (((newvit < STOP_SPEED - 7) &&
+ (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 6) &&
+ (goomInfo->cycle % 3 == 0)) || (goom_irand(goomInfo->gRandom,40) == 0)) {
+ goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - goom_irand(goomInfo->gRandom,2)
+ + goom_irand(goomInfo->gRandom,2);
+ goomInfo->update.zoomFilterData.reverse = !goomInfo->update.zoomFilterData.reverse;
+ }
+ else {
+ goomInfo->update.zoomFilterData.vitesse = (newvit + goomInfo->update.zoomFilterData.vitesse * 7) / 8;
+ }
+ goomInfo->update.lockvar += 50;
+ }
+ }
+
+ if (goomInfo->update.lockvar > 150) {
+ goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount;
+ goomInfo->update.switchMult = 1.0f;
+ }
+ }
+ /* mode mega-lent */
+ if (goom_irand(goomInfo->gRandom,700) == 0) {
+ /*
+ * printf ("coup du sort...\n") ;
+ */
+ pzfd = &goomInfo->update.zoomFilterData;
+ goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1;
+ goomInfo->update.zoomFilterData.pertedec = 8;
+ goomInfo->update.zoomFilterData.sqrtperte = 16;
+ goomInfo->update.goomvar = 1;
+ goomInfo->update.lockvar += 50;
+ goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount;
+ goomInfo->update.switchMult = 1.0f;
+ }
+ }
+
+ /*
+ * gros frein si la musique est calme
+ */
+ if ((goomInfo->sound.speedvar < 0.01f)
+ && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 4)
+ && (goomInfo->cycle % 16 == 0)) {
+ pzfd = &goomInfo->update.zoomFilterData;
+ goomInfo->update.zoomFilterData.vitesse += 3;
+ goomInfo->update.zoomFilterData.pertedec = 8;
+ goomInfo->update.zoomFilterData.sqrtperte = 16;
+ goomInfo->update.goomvar = 0;
+ }
+
+ /*
+ * baisser regulierement la vitesse...
+ */
+ if ((goomInfo->cycle % 73 == 0) && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 5)) {
+ pzfd = &goomInfo->update.zoomFilterData;
+ goomInfo->update.zoomFilterData.vitesse++;
+ }
+
+ /*
+ * arreter de decrémenter au bout d'un certain temps
+ */
+ if ((goomInfo->cycle % 101 == 0) && (goomInfo->update.zoomFilterData.pertedec == 7)) {
+ pzfd = &goomInfo->update.zoomFilterData;
+ goomInfo->update.zoomFilterData.pertedec = 8;
+ goomInfo->update.zoomFilterData.sqrtperte = 16;
+ }
+
+ /*
+ * Permet de forcer un effet.
+ */
+ if ((forceMode > 0) && (forceMode <= NB_FX)) {
+ pzfd = &goomInfo->update.zoomFilterData;
+ pzfd->mode = forceMode - 1;
+ }
+
+ if (forceMode == -1) {
+ pzfd = NULL;
+ }
+
+ /*
+ * Changement d'effet de zoom !
+ */
+ if (pzfd != NULL) {
+ int dif;
+
+ goomInfo->update.cyclesSinceLastChange = 0;
+
+ goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount;
+
+ dif = goomInfo->update.zoomFilterData.vitesse - goomInfo->update.previousZoomSpeed;
+ if (dif < 0)
+ dif = -dif;
+
+ if (dif > 2) {
+ goomInfo->update.switchIncr *= (dif + 2) / 2;
+ }
+ goomInfo->update.previousZoomSpeed = goomInfo->update.zoomFilterData.vitesse;
+ goomInfo->update.switchMult = 1.0f;
+
+ if (((goomInfo->sound.timeSinceLastGoom == 0)
+ && (goomInfo->sound.totalgoom < 2)) || (forceMode > 0)) {
+ goomInfo->update.switchIncr = 0;
+ goomInfo->update.switchMult = goomInfo->update.switchMultAmount;
+ }
+ }
+ else {
+ if (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG) {
+ pzfd = &goomInfo->update.zoomFilterData;
+ goomInfo->update.cyclesSinceLastChange = 0;
+ }
+ else
+ goomInfo->update.cyclesSinceLastChange++;
+ }
+
+#ifdef VERBOSE
+ if (pzfd) {
+ printf ("GOOM: pzfd->mode = %d\n", pzfd->mode);
+ }
+#endif
+
+ /* Zoom here ! */
+ zoomFilterFastRGB (goomInfo, goomInfo->p1, goomInfo->p2, pzfd, goomInfo->screen.width, goomInfo->screen.height,
+ goomInfo->update.switchIncr, goomInfo->update.switchMult);
+
+ /*
+ * Affichage tentacule
+ */
+
+ goomInfo->tentacles_fx.apply(&goomInfo->tentacles_fx, goomInfo->p1, goomInfo->p2, goomInfo);
+ goomInfo->star_fx.apply (&goomInfo->star_fx,goomInfo->p2,goomInfo->p1,goomInfo);
+
+ /*
+ * Affichage de texte
+ */
+ {
+ /*char title[1024];*/
+ char text[64];
+
+ /*
+ * Le message
+ */
+ update_message (goomInfo, message);
+
+ if (fps > 0) {
+ sprintf (text, "%2.0f fps", fps);
+ goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height,
+ 10, 24, text, 1, 0);
+ }
+
+ /*
+ * Le titre
+ */
+ if (songTitle != NULL) {
+ strncpy (goomInfo->update.titleText, songTitle, 1023);
+ goomInfo->update.titleText[1023]=0;
+ goomInfo->update.timeOfTitleDisplay = 200;
+ }
+
+ if (goomInfo->update.timeOfTitleDisplay) {
+ goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height,
+ goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText,
+ ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1);
+ goomInfo->update.timeOfTitleDisplay--;
+ if (goomInfo->update.timeOfTitleDisplay < 4)
+ goom_draw_text (goomInfo->p2,goomInfo->screen.width,goomInfo->screen.height,
+ goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText,
+ ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1);
+ }
+ }
+
+ /*
+ * Gestion du Scope
+ */
+
+ /*
+ * arret demande
+ */
+ if ((goomInfo->update.stop_lines & 0xf000)||(!goomInfo->curGState->drawScope)) {
+ float param1, param2, amplitude;
+ int couleur;
+ int mode;
+
+ choose_a_goom_line (goomInfo, &param1, &param2, &couleur, &mode, &amplitude,1);
+ couleur = GML_BLACK;
+
+ goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur);
+ goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur);
+ goomInfo->update.stop_lines &= 0x0fff;
+ }
+
+ /*
+ * arret aleatore.. changement de mode de ligne..
+ */
+ if (goomInfo->update.lineMode != goomInfo->update.drawLinesDuration) {
+ goomInfo->update.lineMode--;
+ if (goomInfo->update.lineMode == -1)
+ goomInfo->update.lineMode = 0;
+ }
+ else
+ if ((goomInfo->cycle%80==0)&&(goom_irand(goomInfo->gRandom,5)==0)&&goomInfo->update.lineMode)
+ goomInfo->update.lineMode--;
+
+ if ((goomInfo->cycle % 120 == 0)
+ && (goom_irand(goomInfo->gRandom,4) == 0)
+ && (goomInfo->curGState->drawScope)) {
+ if (goomInfo->update.lineMode == 0)
+ goomInfo->update.lineMode = goomInfo->update.drawLinesDuration;
+ else if (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration) {
+ float param1, param2, amplitude;
+ int couleur1,couleur2;
+ int mode;
+
+ goomInfo->update.lineMode--;
+ choose_a_goom_line (goomInfo, &param1, &param2, &couleur1,
+ &mode, &amplitude,goomInfo->update.stop_lines);
+
+ couleur2 = 5-couleur1;
+ if (goomInfo->update.stop_lines) {
+ goomInfo->update.stop_lines--;
+ if (goom_irand(goomInfo->gRandom,2))
+ couleur2=couleur1 = GML_BLACK;
+ }
+
+ goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1);
+ goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2);
+ }
+ }
+
+ /*
+ * si on est dans un goom : afficher les lignes...
+ */
+ if ((goomInfo->update.lineMode != 0) || (goomInfo->sound.timeSinceLastGoom < 5)) {
+ goomInfo->gmline2->power = goomInfo->gmline1->power;
+
+ goom_lines_draw (goomInfo, goomInfo->gmline1, data[0], goomInfo->p2);
+ goom_lines_draw (goomInfo, goomInfo->gmline2, data[1], goomInfo->p2);
+
+ if (((goomInfo->cycle % 121) == 9) && (goom_irand(goomInfo->gRandom,3) == 1)
+ && ((goomInfo->update.lineMode == 0) || (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration))) {
+ float param1, param2, amplitude;
+ int couleur1,couleur2;
+ int mode;
+
+ choose_a_goom_line (goomInfo, &param1, &param2, &couleur1,
+ &mode, &amplitude, goomInfo->update.stop_lines);
+ couleur2 = 5-couleur1;
+
+ if (goomInfo->update.stop_lines) {
+ goomInfo->update.stop_lines--;
+ if (goom_irand(goomInfo->gRandom,2))
+ couleur2=couleur1 = GML_BLACK;
+ }
+ goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1);
+ goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2);
+ }
+ }
+
+ return_val = goomInfo->p1;
+ tmp = goomInfo->p1;
+ goomInfo->p1 = goomInfo->p2;
+ goomInfo->p2 = tmp;
+
+ /* affichage et swappage des buffers.. */
+ goomInfo->cycle++;
+
+ goomInfo->convolve_fx.apply(&goomInfo->convolve_fx,return_val,goomInfo->outputBuf,goomInfo);
+
+ return (guint32*)goomInfo->outputBuf;
+}
+
+/****************************************
+* CLOSE *
+****************************************/
+void goom_close (PluginInfo *goomInfo)
+{
+ if (goomInfo->pixel != NULL)
+ free (goomInfo->pixel);
+ if (goomInfo->back != NULL)
+ free (goomInfo->back);
+ if (goomInfo->conv != NULL)
+ free (goomInfo->conv);
+
+ goomInfo->pixel = goomInfo->back = NULL;
+ goomInfo->conv = NULL;
+ goom_random_free(goomInfo->gRandom);
+ goom_lines_free (&goomInfo->gmline1);
+ goom_lines_free (&goomInfo->gmline2);
+
+ /* release_ifs (); */
+ goomInfo->ifs_fx.free(&goomInfo->ifs_fx);
+ goomInfo->convolve_fx.free(&goomInfo->convolve_fx);
+ goomInfo->star_fx.free(&goomInfo->star_fx);
+ goomInfo->tentacles_fx.free(&goomInfo->tentacles_fx);
+ goomInfo->zoomFilter_fx.free(&goomInfo->zoomFilter_fx);
+
+ // Release info visual
+ free (goomInfo->params);
+ free (goomInfo->sound.params.params);
+
+ // Release PluginInfo
+ free (goomInfo->visuals);
+ gsl_free (goomInfo->scanner);
+ gsl_free (goomInfo->main_scanner);
+
+ free(goomInfo);
+}
+
+
+/* *** */
+void
+choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, int *mode,
+ float *amplitude, int far)
+{
+ *mode = goom_irand(goomInfo->gRandom,3);
+ *amplitude = 1.0f;
+ switch (*mode) {
+ case GML_CIRCLE:
+ if (far) {
+ *param1 = *param2 = 0.47f;
+ *amplitude = 0.8f;
+ break;
+ }
+ if (goom_irand(goomInfo->gRandom,3) == 0) {
+ *param1 = *param2 = 0;
+ *amplitude = 3.0f;
+ }
+ else if (goom_irand(goomInfo->gRandom,2)) {
+ *param1 = 0.40f * goomInfo->screen.height;
+ *param2 = 0.22f * goomInfo->screen.height;
+ }
+ else {
+ *param1 = *param2 = goomInfo->screen.height * 0.35;
+ }
+ break;
+ case GML_HLINE:
+ if (goom_irand(goomInfo->gRandom,4) || far) {
+ *param1 = goomInfo->screen.height / 7;
+ *param2 = 6.0f * goomInfo->screen.height / 7.0f;
+ }
+ else {
+ *param1 = *param2 = goomInfo->screen.height / 2.0f;
+ *amplitude = 2.0f;
+ }
+ break;
+ case GML_VLINE:
+ if (goom_irand(goomInfo->gRandom,3) || far) {
+ *param1 = goomInfo->screen.width / 7.0f;
+ *param2 = 6.0f * goomInfo->screen.width / 7.0f;
+ }
+ else {
+ *param1 = *param2 = goomInfo->screen.width / 2.0f;
+ *amplitude = 1.5f;
+ }
+ break;
+ }
+
+ *couleur = goom_irand(goomInfo->gRandom,6);
+}
+
+#define ECART_VARIATION 1.5
+#define POS_VARIATION 3.0
+#define SCROLLING_SPEED 80
+
+/*
+ * Met a jour l'affichage du message defilant
+ */
+void update_message (PluginInfo *goomInfo, char *message) {
+
+ int fin = 0;
+
+ if (message) {
+ int i=1,j=0;
+ strcpy (goomInfo->update_message.message, message);
+ for (j=0;goomInfo->update_message.message[j];j++)
+ if (goomInfo->update_message.message[j]=='\n')
+ i++;
+ goomInfo->update_message.numberOfLinesInMessage = i;
+ goomInfo->update_message.affiche = goomInfo->screen.height + goomInfo->update_message.numberOfLinesInMessage * 25 + 105;
+ goomInfo->update_message.longueur = strlen(goomInfo->update_message.message);
+ }
+ if (goomInfo->update_message.affiche) {
+ int i = 0;
+ char *msg = malloc(goomInfo->update_message.longueur + 1);
+ char *ptr = msg;
+ int pos;
+ float ecart;
+ message = msg;
+ strcpy (msg, goomInfo->update_message.message);
+
+ while (!fin) {
+ while (1) {
+ if (*ptr == 0) {
+ fin = 1;
+ break;
+ }
+ if (*ptr == '\n') {
+ *ptr = 0;
+ break;
+ }
+ ++ptr;
+ }
+ pos = goomInfo->update_message.affiche - (goomInfo->update_message.numberOfLinesInMessage - i)*25;
+ pos += POS_VARIATION * (cos((double)pos / 20.0));
+ pos -= SCROLLING_SPEED;
+ ecart = (ECART_VARIATION * sin((double)pos / 20.0));
+ if ((fin) && (2 * pos < (int)goomInfo->screen.height))
+ pos = (int)goomInfo->screen.height / 2;
+ pos += 7;
+
+ goom_draw_text(goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height,
+ goomInfo->screen.width/2, pos,
+ message,
+ ecart,
+ 1);
+ message = ++ptr;
+ i++;
+ }
+ goomInfo->update_message.affiche --;
+ free (msg);
+ }
+}
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_filters.h b/src/visualizations/Goom/goom2k4-0/src/goom_filters.h
new file mode 100644
index 0000000000..f015499a87
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_filters.h
@@ -0,0 +1,52 @@
+#ifndef FILTERS_H
+#define FILTERS_H
+
+#include "goom_config.h"
+#include "goom_typedefs.h"
+#include "goom_visual_fx.h"
+#include "goom_graphic.h"
+
+VisualFX zoomFilterVisualFXWrapper_create(void);
+
+struct _ZOOM_FILTER_DATA
+{
+ int vitesse; /* 128 = vitesse nule... * * 256 = en arriere
+ * hyper vite.. * * 0 = en avant hype vite. */
+ unsigned char pertedec;
+ unsigned char sqrtperte;
+ int middleX, middleY; /* milieu de l'effet */
+ char reverse; /* inverse la vitesse */
+ char mode; /* type d'effet à appliquer (cf les #define) */
+ /** @since June 2001 */
+ int hPlaneEffect; /* deviation horitontale */
+ int vPlaneEffect; /* deviation verticale */
+ /** @since April 2002 */
+ int waveEffect; /* applique une "surcouche" de wave effect */
+ int hypercosEffect; /* applique une "surcouche de hypercos effect */
+
+ char noisify; /* ajoute un bruit a la transformation */
+};
+
+#define NORMAL_MODE 0
+#define WAVE_MODE 1
+#define CRYSTAL_BALL_MODE 2
+#define SCRUNCH_MODE 3
+#define AMULETTE_MODE 4
+#define WATER_MODE 5
+#define HYPERCOS1_MODE 6
+#define HYPERCOS2_MODE 7
+#define YONLY_MODE 8
+#define SPEEDWAY_MODE 9
+
+void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c,
+ float t1, float t2, float t3, float t4, guint32 cycle);
+
+/* filtre de zoom :
+ * le contenu de pix1 est copie dans pix2.
+ * zf : si non NULL, configure l'effet.
+ * resx,resy : taille des buffers.
+ */
+void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, guint32 resx,
+ guint32 resy, int switchIncr, float switchMult);
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_fx.h b/src/visualizations/Goom/goom2k4-0/src/goom_fx.h
new file mode 100644
index 0000000000..e672ece3de
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_fx.h
@@ -0,0 +1,12 @@
+#ifndef _GOOM_FX_H
+#define _GOOM_FX_H
+
+#include "goom_visual_fx.h"
+#include "goom_plugin_info.h"
+
+VisualFX convolve_create ();
+VisualFX flying_star_create (void);
+
+void zoom_filter_c(int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_graphic.h b/src/visualizations/Goom/goom2k4-0/src/goom_graphic.h
new file mode 100644
index 0000000000..2568396ecf
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_graphic.h
@@ -0,0 +1,74 @@
+#ifndef GRAPHIC_H
+#define GRAPHIC_H
+
+typedef unsigned int Uint;
+
+typedef struct
+{
+ unsigned short r, v, b;
+}
+Color;
+
+extern const Color BLACK;
+extern const Color WHITE;
+extern const Color RED;
+extern const Color BLUE;
+extern const Color GREEN;
+extern const Color YELLOW;
+extern const Color ORANGE;
+extern const Color VIOLET;
+
+
+#ifdef COLOR_BGRA
+
+#define R_CHANNEL 0xFF000000
+#define G_CHANNEL 0x00FF0000
+#define B_CHANNEL 0x0000FF00
+#define A_CHANNEL 0x000000FF
+#define R_OFFSET 24
+#define G_OFFSET 16
+#define B_OFFSET 8
+#define A_OFFSET 0
+
+typedef union _PIXEL {
+ struct {
+ unsigned char r;
+ unsigned char g;
+ unsigned char b;
+ unsigned char a;
+ } channels;
+ unsigned int val;
+ unsigned char cop[4];
+} Pixel;
+
+#else
+
+#define A_CHANNEL 0xFF000000
+#define R_CHANNEL 0x00FF0000
+#define G_CHANNEL 0x0000FF00
+#define B_CHANNEL 0x000000FF
+#define A_OFFSET 24
+#define R_OFFSET 16
+#define G_OFFSET 8
+#define B_OFFSET 0
+
+typedef union _PIXEL {
+ struct {
+ unsigned char a;
+ unsigned char r;
+ unsigned char g;
+ unsigned char b;
+ } channels;
+ unsigned int val;
+ unsigned char cop[4];
+} Pixel;
+
+#endif /* COLOR_BGRA */
+
+/*
+inline void setPixelRGB (Pixel * buffer, Uint x, Uint y, Color c);
+inline void getPixelRGB (Pixel * buffer, Uint x, Uint y, Color * c);
+*/
+
+
+#endif /* GRAPHIC_H */
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_hash.c b/src/visualizations/Goom/goom2k4-0/src/goom_hash.c
new file mode 100644
index 0000000000..f21a6d6c32
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_hash.c
@@ -0,0 +1,100 @@
+#include "goom_hash.h"
+#include <string.h>
+#include <stdlib.h>
+
+static GoomHashEntry *entry_new(const char *key, HashValue value) {
+
+ GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry));
+
+ entry->key = (char *)malloc(strlen(key)+1);
+ strcpy(entry->key,key);
+ entry->value = value;
+ entry->lower = NULL;
+ entry->upper = NULL;
+
+ return entry;
+}
+
+static void entry_free(GoomHashEntry *entry) {
+ if (entry!=NULL) {
+ entry_free(entry->lower);
+ entry_free(entry->upper);
+ free(entry->key);
+ free(entry);
+ }
+}
+
+static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) {
+ int cmp = strcmp(key,entry->key);
+ if (cmp==0) {
+ entry->value = value;
+ }
+ else if (cmp > 0) {
+ if (entry->upper == NULL)
+ entry->upper = entry_new(key,value);
+ else
+ entry_put(entry->upper, key, value);
+ }
+ else {
+ if (entry->lower == NULL)
+ entry->lower = entry_new(key,value);
+ else
+ entry_put(entry->lower, key, value);
+ }
+}
+
+static HashValue *entry_get(GoomHashEntry *entry, const char *key) {
+
+ int cmp;
+ if (entry==NULL)
+ return NULL;
+ cmp = strcmp(key,entry->key);
+ if (cmp > 0)
+ return entry_get(entry->upper, key);
+ else if (cmp < 0)
+ return entry_get(entry->lower, key);
+ else
+ return &(entry->value);
+}
+
+GoomHash *goom_hash_new(void) {
+ GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash));
+ _this->root = NULL;
+ return _this;
+}
+
+void goom_hash_free(GoomHash *_this) {
+ entry_free(_this->root);
+ free(_this);
+}
+
+void goom_hash_put(GoomHash *_this, const char *key, HashValue value) {
+ if (_this->root == NULL)
+ _this->root = entry_new(key,value);
+ else
+ entry_put(_this->root,key,value);
+}
+
+HashValue *goom_hash_get(GoomHash *_this, const char *key) {
+ return entry_get(_this->root,key);
+}
+
+void goom_hash_put_int(GoomHash *_this, const char *key, int i) {
+ HashValue value;
+ value.i = i;
+ goom_hash_put(_this,key,value);
+}
+
+void goom_hash_put_float(GoomHash *_this, const char *key, float f) {
+ HashValue value;
+ value.f = f;
+ goom_hash_put(_this,key,value);
+}
+
+void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) {
+ HashValue value;
+ value.ptr = ptr;
+ goom_hash_put(_this,key,value);
+}
+
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_hash.h b/src/visualizations/Goom/goom2k4-0/src/goom_hash.h
new file mode 100644
index 0000000000..c8eae37ed9
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_hash.h
@@ -0,0 +1,34 @@
+#ifndef _GOOM_HASH_H
+#define _GOOM_HASH_H
+
+typedef struct GOOM_HASH_ENTRY GoomHashEntry;
+typedef struct GOOM_HASH GoomHash;
+
+typedef union {
+ void *ptr;
+ int i;
+ float f;
+} HashValue;
+
+struct GOOM_HASH_ENTRY {
+ char *key;
+ HashValue value;
+ GoomHashEntry *lower;
+ GoomHashEntry *upper;
+};
+
+struct GOOM_HASH {
+ GoomHashEntry *root;
+};
+
+GoomHash *goom_hash_new(void);
+void goom_hash_free(GoomHash *gh);
+
+void goom_hash_put(GoomHash *gh, const char *key, HashValue value);
+HashValue *goom_hash_get(GoomHash *gh, const char *key);
+
+void goom_hash_put_int(GoomHash *_this, const char *key, int i);
+void goom_hash_put_float(GoomHash *_this, const char *key, float f);
+void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr);
+
+#endif /* _GOOM_HASH_H */
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_plugin_info.h b/src/visualizations/Goom/goom2k4-0/src/goom_plugin_info.h
new file mode 100644
index 0000000000..8d5d098bab
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_plugin_info.h
@@ -0,0 +1,176 @@
+#ifndef _PLUGIN_INFO_H
+#define _PLUGIN_INFO_H
+
+#include "goom_typedefs.h"
+
+#include "goom_config.h"
+
+#include "goom_graphic.h"
+#include "goom_config_param.h"
+#include "goom_visual_fx.h"
+#include "goom_filters.h"
+#include "goom_tools.h"
+#include "goomsl.h"
+
+typedef struct {
+ char drawIFS;
+ char drawPoints;
+ char drawTentacle;
+
+ char drawScope;
+ int farScope;
+
+ int rangemin;
+ int rangemax;
+} GoomState;
+
+#define STATES_MAX_NB 128
+
+/**
+ * Gives informations about the sound.
+ */
+struct _SOUND_INFO {
+
+ /* nota : a Goom is just a sound event... */
+
+ int timeSinceLastGoom; /* >= 0 */
+ float goomPower; /* power of the last Goom [0..1] */
+
+ int timeSinceLastBigGoom; /* >= 0 */
+
+ float volume; /* [0..1] */
+ short samples[2][512];
+
+ /* other "internal" datas for the sound_tester */
+ float goom_limit; /* auto-updated limit of goom_detection */
+ float bigGoomLimit;
+ float accelvar; /* acceleration of the sound - [0..1] */
+ float speedvar; /* speed of the sound - [0..100] */
+ int allTimesMax;
+ int totalgoom; /* number of goom since last reset
+ * (a reset every 64 cycles) */
+
+ float prov_max; /* accel max since last reset */
+
+ int cycle;
+
+ /* private */
+ PluginParam volume_p;
+ PluginParam speed_p;
+ PluginParam accel_p;
+ PluginParam goom_limit_p;
+ PluginParam goom_power_p;
+ PluginParam last_goom_p;
+ PluginParam last_biggoom_p;
+ PluginParam biggoom_speed_limit_p;
+ PluginParam biggoom_factor_p;
+
+ PluginParameters params; /* contains the previously defined parameters. */
+};
+
+
+/**
+ * Allows FXs to know the current state of the plugin.
+ */
+struct _PLUGIN_INFO {
+
+ /* public datas */
+
+ int nbParams;
+ PluginParameters *params;
+
+ /* private datas */
+
+ struct _SIZE_TYPE {
+ int width;
+ int height;
+ int size; /* == screen.height * screen.width. */
+ } screen;
+
+ SoundInfo sound;
+
+ int nbVisuals;
+ VisualFX **visuals; /* pointers on all the visual fx */
+
+ /** The known FX */
+ VisualFX convolve_fx;
+ VisualFX star_fx;
+ VisualFX zoomFilter_fx;
+ VisualFX tentacles_fx;
+ VisualFX ifs_fx;
+
+ /** image buffers */
+ guint32 *pixel;
+ guint32 *back;
+ Pixel *p1, *p2;
+ Pixel *conv;
+ Pixel *outputBuf;
+
+ /** state of goom */
+ guint32 cycle;
+ GoomState states[STATES_MAX_NB];
+ int statesNumber;
+ int statesRangeMax;
+
+ GoomState *curGState;
+
+ /** effet de ligne.. */
+ GMLine *gmline1;
+ GMLine *gmline2;
+
+ /** sinus table */
+ int sintable[0x10000];
+
+ /* INTERNALS */
+
+ /** goom_update internals.
+ * I took all static variables from goom_update and put them here.. for the moment.
+ */
+ struct {
+ int lockvar; /* pour empecher de nouveaux changements */
+ int goomvar; /* boucle des gooms */
+ int loopvar; /* mouvement des points */
+ int stop_lines;
+ int ifs_incr; /* dessiner l'ifs (0 = non: > = increment) */
+ int decay_ifs; /* disparition de l'ifs */
+ int recay_ifs; /* dedisparition de l'ifs */
+ int cyclesSinceLastChange; /* nombre de Cycle Depuis Dernier Changement */
+ int drawLinesDuration; /* duree de la transition entre afficher les lignes ou pas */
+ int lineMode; /* l'effet lineaire a dessiner */
+ float switchMultAmount; /* SWITCHMULT (29.0f/30.0f) */
+ int switchIncrAmount; /* 0x7f */
+ float switchMult; /* 1.0f */
+ int switchIncr; /* = SWITCHINCR; */
+ int stateSelectionRnd;
+ int stateSelectionBlocker;
+ int previousZoomSpeed;
+ int timeOfTitleDisplay;
+ char titleText[1024];
+ ZoomFilterData zoomFilterData;
+ } update;
+
+ struct {
+ int numberOfLinesInMessage;
+ char message[0x800];
+ int affiche;
+ int longueur;
+ } update_message;
+
+ struct {
+ void (*draw_line) (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny);
+ void (*zoom_filter) (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
+ } methods;
+
+ GoomRandom *gRandom;
+
+ GoomSL *scanner;
+ GoomSL *main_scanner;
+ const char *main_script_str;
+};
+
+void plugin_info_init(PluginInfo *p, int nbVisual);
+
+/* i = [0..p->nbVisual-1] */
+void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual);
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_tools.c b/src/visualizations/Goom/goom2k4-0/src/goom_tools.c
new file mode 100644
index 0000000000..8bd6202fff
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_tools.c
@@ -0,0 +1,25 @@
+#include "goom_tools.h"
+#include <stdlib.h>
+
+GoomRandom *goom_random_init(int i) {
+ GoomRandom *grandom = (GoomRandom*)malloc(sizeof(GoomRandom));
+ srand (i);
+ grandom->pos = 1;
+ goom_random_update_array(grandom, GOOM_NB_RAND);
+ return grandom;
+}
+
+void goom_random_free(GoomRandom *grandom) {
+ free(grandom);
+}
+
+void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange) {
+ while (numberOfValuesToChange > 0) {
+#if RAND_MAX < 0x10000
+ grandom->array[grandom->pos++] = ((rand()<<16)+rand()) / 127;
+#else
+ grandom->array[grandom->pos++] = rand() / 127;
+#endif
+ numberOfValuesToChange--;
+ }
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_tools.h b/src/visualizations/Goom/goom2k4-0/src/goom_tools.h
new file mode 100644
index 0000000000..500bfa5672
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_tools.h
@@ -0,0 +1,42 @@
+#ifndef _GOOMTOOLS_H
+#define _GOOMTOOLS_H
+
+/**
+ * Random number generator wrapper for faster random number.
+ */
+
+#ifdef _WIN32PC
+#define inline __inline
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+#define random rand
+#define bzero(x,y) memset(x,0,y)
+#endif
+
+#define GOOM_NB_RAND 0x10000
+
+typedef struct _GOOM_RANDOM {
+ int array[GOOM_NB_RAND];
+ unsigned short pos;
+} GoomRandom;
+
+GoomRandom *goom_random_init(int i);
+void goom_random_free(GoomRandom *grandom);
+
+inline static int goom_random(GoomRandom *grandom) {
+
+ grandom->pos++; /* works because pos is an unsigned short */
+ return grandom->array[grandom->pos];
+}
+
+inline static int goom_irand(GoomRandom *grandom, int i) {
+
+ grandom->pos++;
+ return grandom->array[grandom->pos] % i;
+}
+
+/* called to change the specified number of value in the array, so that the array does not remain the same*/
+void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange);
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_typedefs.h b/src/visualizations/Goom/goom2k4-0/src/goom_typedefs.h
new file mode 100644
index 0000000000..76036504b3
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_typedefs.h
@@ -0,0 +1,11 @@
+#ifndef _GOOM_TYPEDEFS_H
+#define _GOOM_TYPEDEFS_H
+
+typedef struct _PLUGIN_INFO PluginInfo;
+typedef struct _SOUND_INFO SoundInfo;
+typedef struct _GMLINE GMLine;
+typedef struct _GMUNITPOINTER GMUnitPointer;
+typedef struct _ZOOM_FILTER_DATA ZoomFilterData;
+typedef struct _VISUAL_FX VisualFX;
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_visual_fx.h b/src/visualizations/Goom/goom2k4-0/src/goom_visual_fx.h
new file mode 100644
index 0000000000..6939ac8041
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goom_visual_fx.h
@@ -0,0 +1,26 @@
+#ifndef _VISUAL_FX_H
+#define _VISUAL_FX_H
+
+/**
+ * File created on 2003-05-21 by Jeko.
+ * (c)2003, JC Hoelt for iOS-software.
+ *
+ * LGPL Licence.
+ * If you use this file on a visual program,
+ * please make my name being visible on it.
+ */
+
+#include "goom_config_param.h"
+#include "goom_graphic.h"
+#include "goom_typedefs.h"
+
+struct _VISUAL_FX {
+ void (*init) (struct _VISUAL_FX *_this, PluginInfo *info);
+ void (*free) (struct _VISUAL_FX *_this);
+ void (*apply) (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info);
+ void *fx_data;
+
+ PluginParameters *params;
+};
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl.c b/src/visualizations/Goom/goom2k4-0/src/goomsl.c
new file mode 100644
index 0000000000..7bf61ab03c
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goomsl.c
@@ -0,0 +1,1514 @@
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "goomsl.h"
+#include "goomsl_private.h"
+#include "goomsl_yacc.h"
+
+/*#define TRACE_SCRIPT*/
+
+ /* {{{ definition of the instructions number */
+#define INSTR_SETI_VAR_INTEGER 1
+#define INSTR_SETI_VAR_VAR 2
+#define INSTR_SETF_VAR_FLOAT 3
+#define INSTR_SETF_VAR_VAR 4
+#define INSTR_NOP 5
+/* #define INSTR_JUMP 6 */
+#define INSTR_SETP_VAR_PTR 7
+#define INSTR_SETP_VAR_VAR 8
+#define INSTR_SUBI_VAR_INTEGER 9
+#define INSTR_SUBI_VAR_VAR 10
+#define INSTR_SUBF_VAR_FLOAT 11
+#define INSTR_SUBF_VAR_VAR 12
+#define INSTR_ISLOWERF_VAR_VAR 13
+#define INSTR_ISLOWERF_VAR_FLOAT 14
+#define INSTR_ISLOWERI_VAR_VAR 15
+#define INSTR_ISLOWERI_VAR_INTEGER 16
+#define INSTR_ADDI_VAR_INTEGER 17
+#define INSTR_ADDI_VAR_VAR 18
+#define INSTR_ADDF_VAR_FLOAT 19
+#define INSTR_ADDF_VAR_VAR 20
+#define INSTR_MULI_VAR_INTEGER 21
+#define INSTR_MULI_VAR_VAR 22
+#define INSTR_MULF_VAR_FLOAT 23
+#define INSTR_MULF_VAR_VAR 24
+#define INSTR_DIVI_VAR_INTEGER 25
+#define INSTR_DIVI_VAR_VAR 26
+#define INSTR_DIVF_VAR_FLOAT 27
+#define INSTR_DIVF_VAR_VAR 28
+/* #define INSTR_JZERO 29 */
+#define INSTR_ISEQUALP_VAR_VAR 30
+#define INSTR_ISEQUALP_VAR_PTR 31
+#define INSTR_ISEQUALI_VAR_VAR 32
+#define INSTR_ISEQUALI_VAR_INTEGER 33
+#define INSTR_ISEQUALF_VAR_VAR 34
+#define INSTR_ISEQUALF_VAR_FLOAT 35
+/* #define INSTR_CALL 36 */
+/* #define INSTR_RET 37 */
+/* #define INSTR_EXT_CALL 38 */
+#define INSTR_NOT_VAR 39
+/* #define INSTR_JNZERO 40 */
+#define INSTR_SETS_VAR_VAR 41
+#define INSTR_ISEQUALS_VAR_VAR 42
+#define INSTR_ADDS_VAR_VAR 43
+#define INSTR_SUBS_VAR_VAR 44
+#define INSTR_MULS_VAR_VAR 45
+#define INSTR_DIVS_VAR_VAR 46
+
+ /* }}} */
+/* {{{ definition of the validation error types */
+static const char *VALIDATE_OK = "ok";
+#define VALIDATE_ERROR "error while validating "
+#define VALIDATE_TODO "todo"
+#define VALIDATE_SYNTHAX_ERROR "synthax error"
+#define VALIDATE_NO_SUCH_INT "no such integer variable"
+#define VALIDATE_NO_SUCH_VAR "no such variable"
+#define VALIDATE_NO_SUCH_DEST_VAR "no such destination variable"
+#define VALIDATE_NO_SUCH_SRC_VAR "no such src variable"
+/* }}} */
+
+ /***********************************/
+ /* PROTOTYPE OF INTERNAL FUNCTIONS */
+/***********************************/
+
+/* {{{ */
+static void gsl_instr_free(Instruction *_this);
+static const char *gsl_instr_validate(Instruction *_this);
+static void gsl_instr_display(Instruction *_this);
+
+static InstructionFlow *iflow_new(void);
+static void iflow_add_instr(InstructionFlow *_this, Instruction *instr);
+static void iflow_clean(InstructionFlow *_this);
+static void iflow_free(InstructionFlow *_this);
+static void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl);
+/* }}} */
+
+ /************************************/
+ /* DEFINITION OF INTERNAL FUNCTIONS */
+/************************************/
+
+void iflow_free(InstructionFlow *_this)
+{ /* {{{ */
+ free(_this->instr);
+ goom_hash_free(_this->labels);
+ free(_this); /*TODO: finir cette fonction */
+} /* }}} */
+
+void iflow_clean(InstructionFlow *_this)
+{ /* {{{ */
+ /* TODO: clean chaque instruction du flot */
+ _this->number = 0;
+ goom_hash_free(_this->labels);
+ _this->labels = goom_hash_new();
+} /* }}} */
+
+InstructionFlow *iflow_new(void)
+{ /* {{{ */
+ InstructionFlow *_this = (InstructionFlow*)malloc(sizeof(InstructionFlow));
+ _this->number = 0;
+ _this->tabsize = 6;
+ _this->instr = (Instruction**)malloc(_this->tabsize * sizeof(Instruction*));
+ _this->labels = goom_hash_new();
+
+ return _this;
+} /* }}} */
+
+void iflow_add_instr(InstructionFlow *_this, Instruction *instr)
+{ /* {{{ */
+ if (_this->number == _this->tabsize) {
+ _this->tabsize *= 2;
+ _this->instr = (Instruction**)realloc(_this->instr, _this->tabsize * sizeof(Instruction*));
+ }
+ _this->instr[_this->number] = instr;
+ instr->address = _this->number;
+ _this->number++;
+} /* }}} */
+
+void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns)
+{ /* {{{ */
+ if (_this->cur_param <= 0) {
+ fprintf(stderr, "ERROR: Line %d, No more params to instructions\n", _this->line_number);
+ exit(1);
+ }
+ _this->vnamespace[_this->cur_param-1] = ns;
+} /* }}} */
+
+void gsl_instr_add_param(Instruction *instr, char *param, int type)
+{ /* {{{ */
+ int len;
+ if (instr==NULL)
+ return;
+ if (instr->cur_param==0)
+ return;
+ --instr->cur_param;
+ len = strlen(param);
+ instr->params[instr->cur_param] = (char*)malloc(len+1);
+ strcpy(instr->params[instr->cur_param], param);
+ instr->types[instr->cur_param] = type;
+ if (instr->cur_param == 0) {
+
+ const char *result = gsl_instr_validate(instr);
+ if (result != VALIDATE_OK) {
+ printf("ERROR: Line %d: ", instr->parent->num_lines + 1);
+ gsl_instr_display(instr);
+ printf("... %s\n", result);
+ instr->parent->compilationOK = 0;
+ exit(1);
+ }
+
+#if USE_JITC_X86
+ iflow_add_instr(instr->parent->iflow, instr);
+#else
+ if (instr->id != INSTR_NOP)
+ iflow_add_instr(instr->parent->iflow, instr);
+ else
+ gsl_instr_free(instr);
+#endif
+ }
+} /* }}} */
+
+Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number)
+{ /* {{{ */
+ Instruction *instr = (Instruction*)malloc(sizeof(Instruction));
+ instr->params = (char**)malloc(nb_param*sizeof(char*));
+ instr->vnamespace = (GoomHash**)malloc(nb_param*sizeof(GoomHash*));
+ instr->types = (int*)malloc(nb_param*sizeof(int));
+ instr->cur_param = instr->nb_param = nb_param;
+ instr->parent = parent;
+ instr->id = id;
+ instr->name = name;
+ instr->jump_label = NULL;
+ instr->line_number = line_number;
+ return instr;
+} /* }}} */
+
+void gsl_instr_free(Instruction *_this)
+{ /* {{{ */
+ int i;
+ free(_this->types);
+ for (i=_this->cur_param; i<_this->nb_param; ++i)
+ free(_this->params[i]);
+ free(_this->params);
+ free(_this);
+} /* }}} */
+
+void gsl_instr_display(Instruction *_this)
+{ /* {{{ */
+ int i=_this->nb_param-1;
+ printf("%s", _this->name);
+ while(i>=_this->cur_param) {
+ printf(" %s", _this->params[i]);
+ --i;
+ }
+} /* }}} */
+
+ /****************************************/
+ /* VALIDATION OF INSTRUCTION PARAMETERS */
+/****************************************/
+
+static const char *validate_v_v(Instruction *_this)
+{ /* {{{ */
+ HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]);
+ HashValue *src = goom_hash_get(_this->vnamespace[0], _this->params[0]);
+
+ if (dest == NULL) {
+ return VALIDATE_NO_SUCH_DEST_VAR;
+ }
+ if (src == NULL) {
+ return VALIDATE_NO_SUCH_SRC_VAR;
+ }
+ _this->data.udest.var = dest->ptr;
+ _this->data.usrc.var = src->ptr;
+ return VALIDATE_OK;
+} /* }}} */
+
+static const char *validate_v_i(Instruction *_this)
+{ /* {{{ */
+ HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]);
+ _this->data.usrc.value_int = strtol(_this->params[0],NULL,0);
+
+ if (dest == NULL) {
+ return VALIDATE_NO_SUCH_INT;
+ }
+ _this->data.udest.var = dest->ptr;
+ return VALIDATE_OK;
+} /* }}} */
+
+static const char *validate_v_p(Instruction *_this)
+{ /* {{{ */
+ HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]);
+ _this->data.usrc.value_ptr = strtol(_this->params[0],NULL,0);
+
+ if (dest == NULL) {
+ return VALIDATE_NO_SUCH_INT;
+ }
+ _this->data.udest.var = dest->ptr;
+ return VALIDATE_OK;
+} /* }}} */
+
+static const char *validate_v_f(Instruction *_this)
+{ /* {{{ */
+ HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]);
+ _this->data.usrc.value_float = atof(_this->params[0]);
+
+ if (dest == NULL) {
+ return VALIDATE_NO_SUCH_VAR;
+ }
+ _this->data.udest.var = dest->ptr;
+ return VALIDATE_OK;
+} /* }}} */
+
+static const char *validate(Instruction *_this,
+ int vf_f_id, int vf_v_id,
+ int vi_i_id, int vi_v_id,
+ int vp_p_id, int vp_v_id,
+ int vs_v_id)
+{ /* {{{ */
+ if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FLOAT)) {
+ _this->id = vf_f_id;
+ return validate_v_f(_this);
+ }
+ else if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FVAR)) {
+ _this->id = vf_v_id;
+ return validate_v_v(_this);
+ }
+ else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_INTEGER)) {
+ _this->id = vi_i_id;
+ return validate_v_i(_this);
+ }
+ else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_IVAR)) {
+ _this->id = vi_v_id;
+ return validate_v_v(_this);
+ }
+ else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PTR)) {
+ if (vp_p_id == INSTR_NOP) return VALIDATE_ERROR;
+ _this->id = vp_p_id;
+ return validate_v_p(_this);
+ }
+ else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PVAR)) {
+ _this->id = vp_v_id;
+ if (vp_v_id == INSTR_NOP) return VALIDATE_ERROR;
+ return validate_v_v(_this);
+ }
+ else if ((_this->types[1] < FIRST_RESERVED) && (_this->types[1] >= 0) && (_this->types[0] == _this->types[1])) {
+ _this->id = vs_v_id;
+ if (vs_v_id == INSTR_NOP) return "Impossible operation to perform between two structs";
+ return validate_v_v(_this);
+ }
+ return VALIDATE_ERROR;
+} /* }}} */
+
+const char *gsl_instr_validate(Instruction *_this)
+{ /* {{{ */
+ if (_this->id != INSTR_EXT_CALL) {
+ int i = _this->nb_param;
+ while (i>0)
+ {
+ i--;
+ if (_this->types[i] == TYPE_VAR) {
+ int type = gsl_type_of_var(_this->vnamespace[i], _this->params[i]);
+
+ if (type == INSTR_INT)
+ _this->types[i] = TYPE_IVAR;
+ else if (type == INSTR_FLOAT)
+ _this->types[i] = TYPE_FVAR;
+ else if (type == INSTR_PTR)
+ _this->types[i] = TYPE_PVAR;
+ else if ((type >= 0) && (type < FIRST_RESERVED))
+ _this->types[i] = type;
+ else fprintf(stderr,"WARNING: Line %d, %s has no namespace\n", _this->line_number, _this->params[i]);
+ }
+ }
+ }
+
+ switch (_this->id) {
+
+ /* set */
+ case INSTR_SET:
+ return validate(_this,
+ INSTR_SETF_VAR_FLOAT, INSTR_SETF_VAR_VAR,
+ INSTR_SETI_VAR_INTEGER, INSTR_SETI_VAR_VAR,
+ INSTR_SETP_VAR_PTR, INSTR_SETP_VAR_VAR,
+ INSTR_SETS_VAR_VAR);
+
+ /* extcall */
+ case INSTR_EXT_CALL:
+ if (_this->types[0] == TYPE_VAR) {
+ HashValue *fval = goom_hash_get(_this->parent->functions, _this->params[0]);
+ if (fval) {
+ _this->data.udest.external_function = (struct _ExternalFunctionStruct*)fval->ptr;
+ return VALIDATE_OK;
+ }
+ }
+ return VALIDATE_ERROR;
+
+ /* call */
+ case INSTR_CALL:
+ if (_this->types[0] == TYPE_LABEL) {
+ _this->jump_label = _this->params[0];
+ return VALIDATE_OK;
+ }
+ return VALIDATE_ERROR;
+
+ /* ret */
+ case INSTR_RET:
+ return VALIDATE_OK;
+
+ /* jump */
+ case INSTR_JUMP:
+
+ if (_this->types[0] == TYPE_LABEL) {
+ _this->jump_label = _this->params[0];
+ return VALIDATE_OK;
+ }
+ return VALIDATE_ERROR;
+
+ /* jzero / jnzero */
+ case INSTR_JZERO:
+ case INSTR_JNZERO:
+
+ if (_this->types[0] == TYPE_LABEL) {
+ _this->jump_label = _this->params[0];
+ return VALIDATE_OK;
+ }
+ return VALIDATE_ERROR;
+
+ /* label */
+ case INSTR_LABEL:
+
+ if (_this->types[0] == TYPE_LABEL) {
+ _this->id = INSTR_NOP;
+ _this->nop_label = _this->params[0];
+ goom_hash_put_int(_this->parent->iflow->labels, _this->params[0], _this->parent->iflow->number);
+ return VALIDATE_OK;
+ }
+ return VALIDATE_ERROR;
+
+ /* isequal */
+ case INSTR_ISEQUAL:
+ return validate(_this,
+ INSTR_ISEQUALF_VAR_FLOAT, INSTR_ISEQUALF_VAR_VAR,
+ INSTR_ISEQUALI_VAR_INTEGER, INSTR_ISEQUALI_VAR_VAR,
+ INSTR_ISEQUALP_VAR_PTR, INSTR_ISEQUALP_VAR_VAR,
+ INSTR_ISEQUALS_VAR_VAR);
+
+ /* not */
+ case INSTR_NOT:
+ _this->id = INSTR_NOT_VAR;
+ return VALIDATE_OK;
+
+ /* islower */
+ case INSTR_ISLOWER:
+ return validate(_this,
+ INSTR_ISLOWERF_VAR_FLOAT, INSTR_ISLOWERF_VAR_VAR,
+ INSTR_ISLOWERI_VAR_INTEGER, INSTR_ISLOWERI_VAR_VAR,
+ INSTR_NOP, INSTR_NOP, INSTR_NOP);
+
+ /* add */
+ case INSTR_ADD:
+ return validate(_this,
+ INSTR_ADDF_VAR_FLOAT, INSTR_ADDF_VAR_VAR,
+ INSTR_ADDI_VAR_INTEGER, INSTR_ADDI_VAR_VAR,
+ INSTR_NOP, INSTR_NOP,
+ INSTR_ADDS_VAR_VAR);
+
+ /* mul */
+ case INSTR_MUL:
+ return validate(_this,
+ INSTR_MULF_VAR_FLOAT, INSTR_MULF_VAR_VAR,
+ INSTR_MULI_VAR_INTEGER, INSTR_MULI_VAR_VAR,
+ INSTR_NOP, INSTR_NOP,
+ INSTR_MULS_VAR_VAR);
+
+ /* sub */
+ case INSTR_SUB:
+ return validate(_this,
+ INSTR_SUBF_VAR_FLOAT, INSTR_SUBF_VAR_VAR,
+ INSTR_SUBI_VAR_INTEGER, INSTR_SUBI_VAR_VAR,
+ INSTR_NOP, INSTR_NOP,
+ INSTR_SUBS_VAR_VAR);
+
+ /* div */
+ case INSTR_DIV:
+ return validate(_this,
+ INSTR_DIVF_VAR_FLOAT, INSTR_DIVF_VAR_VAR,
+ INSTR_DIVI_VAR_INTEGER, INSTR_DIVI_VAR_VAR,
+ INSTR_NOP,INSTR_NOP,
+ INSTR_DIVS_VAR_VAR);
+
+ default:
+ return VALIDATE_TODO;
+ }
+ return VALIDATE_ERROR;
+} /* }}} */
+
+ /*************/
+ /* EXECUTION */
+/*************/
+void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl)
+{ /* {{{ */
+ int flag = 0;
+ int ip = 0;
+ FastInstruction *instr = _this->instr;
+ int stack[0x10000];
+ int stack_pointer = 0;
+
+ stack[stack_pointer++] = -1;
+
+ /* Quelques Macro pour rendre le code plus lisible */
+#define pSRC_VAR instr[ip].data.usrc.var
+#define SRC_VAR_INT *instr[ip].data.usrc.var_int
+#define SRC_VAR_FLOAT *instr[ip].data.usrc.var_float
+#define SRC_VAR_PTR *instr[ip].data.usrc.var_ptr
+
+#define pDEST_VAR instr[ip].data.udest.var
+#define DEST_VAR_INT *instr[ip].data.udest.var_int
+#define DEST_VAR_FLOAT *instr[ip].data.udest.var_float
+#define DEST_VAR_PTR *instr[ip].data.udest.var_ptr
+
+#define VALUE_INT instr[ip].data.usrc.value_int
+#define VALUE_FLOAT instr[ip].data.usrc.value_float
+#define VALUE_PTR instr[ip].data.usrc.value_ptr
+
+#define JUMP_OFFSET instr[ip].data.udest.jump_offset
+
+#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1]
+#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1]
+#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i]
+#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i]
+#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i]
+#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i]
+#define DEST_STRUCT_IBLOCK_VAR(i,j) \
+ ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j]
+#define DEST_STRUCT_FBLOCK_VAR(i,j) \
+ ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j]
+#define SRC_STRUCT_IBLOCK_VAR(i,j) \
+ ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j]
+#define SRC_STRUCT_FBLOCK_VAR(i,j) \
+ ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j]
+#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size
+
+ while (1)
+ {
+ int i;
+#ifdef TRACE_SCRIPT
+ printf("execute "); gsl_instr_display(instr[ip].proto); printf("\n");
+#endif
+ switch (instr[ip].id) {
+
+ /* SET.I */
+ case INSTR_SETI_VAR_INTEGER:
+ DEST_VAR_INT = VALUE_INT;
+ ++ip; break;
+
+ case INSTR_SETI_VAR_VAR:
+ DEST_VAR_INT = SRC_VAR_INT;
+ ++ip; break;
+
+ /* SET.F */
+ case INSTR_SETF_VAR_FLOAT:
+ DEST_VAR_FLOAT = VALUE_FLOAT;
+ ++ip; break;
+
+ case INSTR_SETF_VAR_VAR:
+ DEST_VAR_FLOAT = SRC_VAR_FLOAT;
+ ++ip; break;
+
+ /* SET.P */
+ case INSTR_SETP_VAR_VAR:
+ DEST_VAR_PTR = SRC_VAR_PTR;
+ ++ip; break;
+
+ case INSTR_SETP_VAR_PTR:
+ DEST_VAR_PTR = VALUE_PTR;
+ ++ip; break;
+
+ /* JUMP */
+ case INSTR_JUMP:
+ ip += JUMP_OFFSET; break;
+
+ /* JZERO */
+ case INSTR_JZERO:
+ ip += (flag ? 1 : JUMP_OFFSET); break;
+
+ case INSTR_NOP:
+ ++ip; break;
+
+ /* ISEQUAL.P */
+ case INSTR_ISEQUALP_VAR_VAR:
+ flag = (DEST_VAR_PTR == SRC_VAR_PTR);
+ ++ip; break;
+
+ case INSTR_ISEQUALP_VAR_PTR:
+ flag = (DEST_VAR_PTR == VALUE_PTR);
+ ++ip; break;
+
+ /* ISEQUAL.I */
+ case INSTR_ISEQUALI_VAR_VAR:
+ flag = (DEST_VAR_INT == SRC_VAR_INT);
+ ++ip; break;
+
+ case INSTR_ISEQUALI_VAR_INTEGER:
+ flag = (DEST_VAR_INT == VALUE_INT);
+ ++ip; break;
+
+ /* ISEQUAL.F */
+ case INSTR_ISEQUALF_VAR_VAR:
+ flag = (DEST_VAR_FLOAT == SRC_VAR_FLOAT);
+ ++ip; break;
+
+ case INSTR_ISEQUALF_VAR_FLOAT:
+ flag = (DEST_VAR_FLOAT == VALUE_FLOAT);
+ ++ip; break;
+
+ /* ISLOWER.I */
+ case INSTR_ISLOWERI_VAR_VAR:
+ flag = (DEST_VAR_INT < SRC_VAR_INT);
+ ++ip; break;
+
+ case INSTR_ISLOWERI_VAR_INTEGER:
+ flag = (DEST_VAR_INT < VALUE_INT);
+ ++ip; break;
+
+ /* ISLOWER.F */
+ case INSTR_ISLOWERF_VAR_VAR:
+ flag = (DEST_VAR_FLOAT < SRC_VAR_FLOAT);
+ ++ip; break;
+
+ case INSTR_ISLOWERF_VAR_FLOAT:
+ flag = (DEST_VAR_FLOAT < VALUE_FLOAT);
+ ++ip; break;
+
+ /* ADD.I */
+ case INSTR_ADDI_VAR_VAR:
+ DEST_VAR_INT += SRC_VAR_INT;
+ ++ip; break;
+
+ case INSTR_ADDI_VAR_INTEGER:
+ DEST_VAR_INT += VALUE_INT;
+ ++ip; break;
+
+ /* ADD.F */
+ case INSTR_ADDF_VAR_VAR:
+ DEST_VAR_FLOAT += SRC_VAR_FLOAT;
+ ++ip; break;
+
+ case INSTR_ADDF_VAR_FLOAT:
+ DEST_VAR_FLOAT += VALUE_FLOAT;
+ ++ip; break;
+
+ /* MUL.I */
+ case INSTR_MULI_VAR_VAR:
+ DEST_VAR_INT *= SRC_VAR_INT;
+ ++ip; break;
+
+ case INSTR_MULI_VAR_INTEGER:
+ DEST_VAR_INT *= VALUE_INT;
+ ++ip; break;
+
+ /* MUL.F */
+ case INSTR_MULF_VAR_FLOAT:
+ DEST_VAR_FLOAT *= VALUE_FLOAT;
+ ++ip; break;
+
+ case INSTR_MULF_VAR_VAR:
+ DEST_VAR_FLOAT *= SRC_VAR_FLOAT;
+ ++ip; break;
+
+ /* DIV.I */
+ case INSTR_DIVI_VAR_VAR:
+ DEST_VAR_INT /= SRC_VAR_INT;
+ ++ip; break;
+
+ case INSTR_DIVI_VAR_INTEGER:
+ DEST_VAR_INT /= VALUE_INT;
+ ++ip; break;
+
+ /* DIV.F */
+ case INSTR_DIVF_VAR_FLOAT:
+ DEST_VAR_FLOAT /= VALUE_FLOAT;
+ ++ip; break;
+
+ case INSTR_DIVF_VAR_VAR:
+ DEST_VAR_FLOAT /= SRC_VAR_FLOAT;
+ ++ip; break;
+
+ /* SUB.I */
+ case INSTR_SUBI_VAR_VAR:
+ DEST_VAR_INT -= SRC_VAR_INT;
+ ++ip; break;
+
+ case INSTR_SUBI_VAR_INTEGER:
+ DEST_VAR_INT -= VALUE_INT;
+ ++ip; break;
+
+ /* SUB.F */
+ case INSTR_SUBF_VAR_FLOAT:
+ DEST_VAR_FLOAT -= VALUE_FLOAT;
+ ++ip; break;
+
+ case INSTR_SUBF_VAR_VAR:
+ DEST_VAR_FLOAT -= SRC_VAR_FLOAT;
+ ++ip; break;
+
+ /* CALL */
+ case INSTR_CALL:
+ stack[stack_pointer++] = ip + 1;
+ ip += JUMP_OFFSET; break;
+
+ /* RET */
+ case INSTR_RET:
+ ip = stack[--stack_pointer];
+ if (ip<0) return;
+ break;
+
+ /* EXT_CALL */
+ case INSTR_EXT_CALL:
+ instr[ip].data.udest.external_function->function(gsl, gsl->vars, instr[ip].data.udest.external_function->vars);
+ ++ip; break;
+
+ /* NOT */
+ case INSTR_NOT_VAR:
+ flag = !flag;
+ ++ip; break;
+
+ /* JNZERO */
+ case INSTR_JNZERO:
+ ip += (flag ? JUMP_OFFSET : 1); break;
+
+ case INSTR_SETS_VAR_VAR:
+ memcpy(pDEST_VAR, pSRC_VAR, DEST_STRUCT_SIZE);
+ ++ip; break;
+
+ case INSTR_ISEQUALS_VAR_VAR:
+ break;
+
+ case INSTR_ADDS_VAR_VAR:
+ /* process integers */
+ i=0;
+ while (DEST_STRUCT_IBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_IBLOCK(i).size;
+ while (j--) {
+ DEST_STRUCT_IBLOCK_VAR(i,j) += SRC_STRUCT_IBLOCK_VAR(i,j);
+ }
+ ++i;
+ }
+ /* process floats */
+ i=0;
+ while (DEST_STRUCT_FBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_FBLOCK(i).size;
+ while (j--) {
+ DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j);
+ }
+ ++i;
+ }
+ ++ip; break;
+
+ case INSTR_SUBS_VAR_VAR:
+ /* process integers */
+ i=0;
+ while (DEST_STRUCT_IBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_IBLOCK(i).size;
+ while (j--) {
+ DEST_STRUCT_IBLOCK_VAR(i,j) -= SRC_STRUCT_IBLOCK_VAR(i,j);
+ }
+ ++i;
+ }
+ /* process floats */
+ i=0;
+ while (DEST_STRUCT_FBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_FBLOCK(i).size;
+ while (j--) {
+ DEST_STRUCT_FBLOCK_VAR(i,j) -= SRC_STRUCT_FBLOCK_VAR(i,j);
+ }
+ ++i;
+ }
+ ++ip; break;
+
+ case INSTR_MULS_VAR_VAR:
+ /* process integers */
+ i=0;
+ while (DEST_STRUCT_IBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_IBLOCK(i).size;
+ while (j--) {
+ DEST_STRUCT_IBLOCK_VAR(i,j) *= SRC_STRUCT_IBLOCK_VAR(i,j);
+ }
+ ++i;
+ }
+ /* process floats */
+ i=0;
+ while (DEST_STRUCT_FBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_FBLOCK(i).size;
+ while (j--) {
+ DEST_STRUCT_FBLOCK_VAR(i,j) *= SRC_STRUCT_FBLOCK_VAR(i,j);
+ }
+ ++i;
+ }
+ ++ip; break;
+
+ case INSTR_DIVS_VAR_VAR:
+ /* process integers */
+ i=0;
+ while (DEST_STRUCT_IBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_IBLOCK(i).size;
+ while (j--) {
+ DEST_STRUCT_IBLOCK_VAR(i,j) /= SRC_STRUCT_IBLOCK_VAR(i,j);
+ }
+ ++i;
+ }
+ /* process floats */
+ i=0;
+ while (DEST_STRUCT_FBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_FBLOCK(i).size;
+ while (j--) {
+ DEST_STRUCT_FBLOCK_VAR(i,j) /= SRC_STRUCT_FBLOCK_VAR(i,j);
+ }
+ ++i;
+ }
+ ++ip; break;
+
+ default:
+ printf("NOT IMPLEMENTED : %d\n", instr[ip].id);
+ ++ip;
+ exit(1);
+ }
+ }
+} /* }}} */
+
+int gsl_malloc(GoomSL *_this, int size)
+{ /* {{{ */
+ if (_this->nbPtr >= _this->ptrArraySize) {
+ _this->ptrArraySize *= 2;
+ _this->ptrArray = (void**)realloc(_this->ptrArray, sizeof(void*) * _this->ptrArraySize);
+ }
+ _this->ptrArray[_this->nbPtr] = malloc(size);
+ return _this->nbPtr++;
+} /* }}} */
+
+void *gsl_get_ptr(GoomSL *_this, int id)
+{ /* {{{ */
+ if ((id>=0)&&(id<_this->nbPtr))
+ return _this->ptrArray[id];
+ fprintf(stderr,"INVALID GET PTR 0x%08x\n", id);
+ return NULL;
+} /* }}} */
+
+void gsl_free_ptr(GoomSL *_this, int id)
+{ /* {{{ */
+ if ((id>=0)&&(id<_this->nbPtr)) {
+ free(_this->ptrArray[id]);
+ _this->ptrArray[id] = 0;
+ }
+} /* }}} */
+
+void gsl_enternamespace(const char *name)
+{ /* {{{ */
+ HashValue *val = goom_hash_get(currentGoomSL->functions, name);
+ if (val) {
+ ExternalFunctionStruct *function = (ExternalFunctionStruct*)val->ptr;
+ currentGoomSL->currentNS++;
+ currentGoomSL->namespaces[currentGoomSL->currentNS] = function->vars;
+ }
+ else {
+ fprintf(stderr, "ERROR: Line %d, Could not find namespace: %s\n", currentGoomSL->num_lines, name);
+ exit(1);
+ }
+} /* }}} */
+
+void gsl_reenternamespace(GoomHash *nsinfo) {
+ currentGoomSL->currentNS++;
+ currentGoomSL->namespaces[currentGoomSL->currentNS] = nsinfo;
+}
+
+GoomHash *gsl_leavenamespace(void)
+{ /* {{{ */
+ currentGoomSL->currentNS--;
+ return currentGoomSL->namespaces[currentGoomSL->currentNS+1];
+} /* }}} */
+
+GoomHash *gsl_find_namespace(const char *name)
+{ /* {{{ */
+ int i;
+ for (i=currentGoomSL->currentNS;i>=0;--i) {
+ if (goom_hash_get(currentGoomSL->namespaces[i], name))
+ return currentGoomSL->namespaces[i];
+ }
+ return NULL;
+} /* }}} */
+
+void gsl_declare_task(const char *name)
+{ /* {{{ */
+ if (goom_hash_get(currentGoomSL->functions, name)) {
+ return;
+ }
+ else {
+ ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct));
+ gef->function = 0;
+ gef->vars = goom_hash_new();
+ gef->is_extern = 0;
+ goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef);
+ }
+} /* }}} */
+
+void gsl_declare_external_task(const char *name)
+{ /* {{{ */
+ if (goom_hash_get(currentGoomSL->functions, name)) {
+ fprintf(stderr, "ERROR: Line %d, Duplicate declaration of %s\n", currentGoomSL->num_lines, name);
+ return;
+ }
+ else {
+ ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct));
+ gef->function = 0;
+ gef->vars = goom_hash_new();
+ gef->is_extern = 1;
+ goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef);
+ }
+} /* }}} */
+
+static void reset_scanner(GoomSL *gss)
+{ /* {{{ */
+ gss->num_lines = 0;
+ gss->instr = NULL;
+ iflow_clean(gss->iflow);
+
+ /* reset variables */
+ goom_hash_free(gss->vars);
+ gss->vars = goom_hash_new();
+ gss->currentNS = 0;
+ gss->namespaces[0] = gss->vars;
+
+ goom_hash_free(gss->structIDS);
+ gss->structIDS = goom_hash_new();
+
+ while (gss->nbStructID > 0) {
+ int i;
+ gss->nbStructID--;
+ for(i=0;i<gss->gsl_struct[gss->nbStructID]->nbFields;++i)
+ free(gss->gsl_struct[gss->nbStructID]->fields[i]);
+ free(gss->gsl_struct[gss->nbStructID]);
+ }
+
+ gss->compilationOK = 1;
+
+ goom_heap_delete(gss->data_heap);
+ gss->data_heap = goom_heap_new();
+} /* }}} */
+
+static void calculate_labels(InstructionFlow *iflow)
+{ /* {{{ */
+ int i = 0;
+ while (i < iflow->number) {
+ Instruction *instr = iflow->instr[i];
+ if (instr->jump_label) {
+ HashValue *label = goom_hash_get(iflow->labels,instr->jump_label);
+ if (label) {
+ instr->data.udest.jump_offset = -instr->address + label->i;
+ }
+ else {
+ fprintf(stderr, "ERROR: Line %d, Could not find label %s\n", instr->line_number, instr->jump_label);
+ instr->id = INSTR_NOP;
+ instr->nop_label = 0;
+ exit(1);
+ }
+ }
+ ++i;
+ }
+} /* }}} */
+
+static int powerOfTwo(int i)
+{
+ int b;
+ for (b=0;b<31;b++)
+ if (i == (1<<b))
+ return b;
+ return 0;
+}
+
+/* Cree un flow d'instruction optimise */
+static void gsl_create_fast_iflow(void)
+{ /* {{{ */
+ int number = currentGoomSL->iflow->number;
+ int i;
+#ifdef USE_JITC_X86
+
+ /* pour compatibilite avec les MACROS servant a execution */
+ int ip = 0;
+ GoomSL *gsl = currentGoomSL;
+
+ JitcX86Env *jitc;
+
+ if (currentGoomSL->jitc != NULL)
+ jitc_x86_delete(currentGoomSL->jitc);
+ jitc = currentGoomSL->jitc = jitc_x86_env_new(0xffff);
+ currentGoomSL->jitc_func = jitc_prepare_func(jitc);
+
+#if 0
+#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1]
+#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1]
+#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i]
+#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i]
+#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i]
+#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i]
+#define DEST_STRUCT_IBLOCK_VAR(i,j) \
+ ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j]
+#define DEST_STRUCT_FBLOCK_VAR(i,j) \
+ ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j]
+#define SRC_STRUCT_IBLOCK_VAR(i,j) \
+ ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j]
+#define SRC_STRUCT_FBLOCK_VAR(i,j) \
+ ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j]
+#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size
+#endif
+
+ JITC_JUMP_LABEL(jitc, "__very_end__");
+ JITC_ADD_LABEL (jitc, "__very_start__");
+
+ for (i=0;i<number;++i) {
+ Instruction *instr = currentGoomSL->iflow->instr[i];
+ switch (instr->id) {
+ case INSTR_SETI_VAR_INTEGER :
+ jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int);
+ break;
+ case INSTR_SETI_VAR_VAR :
+ jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_int);
+ jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+ break;
+ /* SET.F */
+ case INSTR_SETF_VAR_FLOAT :
+ jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_float, *(int*)(&instr->data.usrc.value_float));
+ break;
+ case INSTR_SETF_VAR_VAR :
+ jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_float);
+ jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_float);
+ break;
+ case INSTR_NOP :
+ if (instr->nop_label != 0)
+ JITC_ADD_LABEL(jitc, instr->nop_label);
+ break;
+ case INSTR_JUMP :
+ JITC_JUMP_LABEL(jitc,instr->jump_label);
+ break;
+ case INSTR_SETP_VAR_PTR :
+ jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_ptr, instr->data.usrc.value_ptr);
+ break;
+ case INSTR_SETP_VAR_VAR :
+ jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_ptr);
+ jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_ptr);
+ break;
+ case INSTR_SUBI_VAR_INTEGER :
+ jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, -instr->data.usrc.value_int);
+ break;
+ case INSTR_SUBI_VAR_VAR :
+ jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+ jitc_add(jitc, "sub eax, [$d]", instr->data.usrc.var_int);
+ jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+ break;
+ case INSTR_SUBF_VAR_FLOAT :
+ printf("NOT IMPLEMENTED : %d\n", instr->id);
+ break;
+ case INSTR_SUBF_VAR_VAR :
+ printf("NOT IMPLEMENTED : %d\n", instr->id);
+ break;
+ case INSTR_ISLOWERF_VAR_VAR:
+ printf("NOT IMPLEMENTED : %d\n", instr->id);
+ break;
+ case INSTR_ISLOWERF_VAR_FLOAT:
+ printf("NOT IMPLEMENTED : %d\n", instr->id);
+ break;
+ case INSTR_ISLOWERI_VAR_VAR:
+ jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int);
+ jitc_add(jitc,"sub edx, [$d]", instr->data.usrc.var_int);
+ jitc_add(jitc,"shr edx, $d", 31);
+ break;
+ case INSTR_ISLOWERI_VAR_INTEGER:
+ jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int);
+ jitc_add(jitc,"sub edx, $d", instr->data.usrc.value_int);
+ jitc_add(jitc,"shr edx, $d", 31);
+ break;
+ case INSTR_ADDI_VAR_INTEGER:
+ jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int);
+ break;
+ case INSTR_ADDI_VAR_VAR:
+ jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+ jitc_add(jitc, "add eax, [$d]", instr->data.usrc.var_int);
+ jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+ break;
+ case INSTR_ADDF_VAR_FLOAT:
+ printf("NOT IMPLEMENTED : %d\n", instr->id);
+ break;
+ case INSTR_ADDF_VAR_VAR:
+ printf("NOT IMPLEMENTED : %d\n", instr->id);
+ break;
+ case INSTR_MULI_VAR_INTEGER:
+ if (instr->data.usrc.value_int != 1)
+ {
+ int po2 = powerOfTwo(instr->data.usrc.value_int);
+ if (po2) {
+ /* performs (V / 2^n) by doing V >> n */
+ jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+ jitc_add(jitc, "sal eax, $d", po2);
+ jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+ }
+ else {
+ jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+ jitc_add(jitc, "imul eax, $d", instr->data.usrc.value_int);
+ jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+ }
+ }
+ break;
+ case INSTR_MULI_VAR_VAR:
+ jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+ jitc_add(jitc, "imul eax, [$d]", instr->data.usrc.var_int);
+ jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+ break;
+ case INSTR_MULF_VAR_FLOAT:
+ printf("NOT IMPLEMENTED : %d\n", instr->id);
+ break;
+ case INSTR_MULF_VAR_VAR:
+ printf("NOT IMPLEMENTED : %d\n", instr->id);
+ break;
+ case INSTR_DIVI_VAR_INTEGER:
+ if ((instr->data.usrc.value_int != 1) && (instr->data.usrc.value_int != 0))
+ {
+ int po2 = powerOfTwo(instr->data.usrc.value_int);
+ if (po2) {
+ /* performs (V / 2^n) by doing V >> n */
+ jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+ jitc_add(jitc, "sar eax, $d", po2);
+ jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+ }
+ else {
+ /* performs (V/n) by doing (V*(32^2/n)) */
+ long coef;
+ double dcoef = (double)4294967296.0 / (double)instr->data.usrc.value_int;
+ if (dcoef < 0.0) dcoef = -dcoef;
+ coef = (long)floor(dcoef);
+ dcoef -= floor(dcoef);
+ if (dcoef < 0.5) coef += 1;
+
+ jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+ jitc_add(jitc, "mov edx, $d", coef);
+ jitc_add(jitc, "imul edx");
+ if (instr->data.usrc.value_int < 0)
+ jitc_add(jitc, "neg edx");
+ jitc_add(jitc, "mov [$d], edx", instr->data.udest.var_int);
+ }
+ }
+ break;
+ case INSTR_DIVI_VAR_VAR :
+ jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+ jitc_add(jitc, "cdq"); /* sign extend eax into edx */
+ jitc_add(jitc, "idiv [$d]", instr->data.usrc.var_int);
+ jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int);
+ break;
+ case INSTR_DIVF_VAR_FLOAT:
+ printf("NOT IMPLEMENTED : %d\n", instr->id);
+ break;
+ case INSTR_DIVF_VAR_VAR:
+ printf("NOT IMPLEMENTED : %d\n", instr->id);
+ break;
+ case INSTR_JZERO:
+ jitc_add(jitc, "cmp edx, $d", 0);
+ jitc_add(jitc, "je $s", instr->jump_label);
+ break;
+ case INSTR_ISEQUALP_VAR_VAR :
+ jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr);
+ jitc_add(jitc, "mov edx, $d", 0);
+ jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_ptr);
+ jitc_add(jitc, "jne $d", 1);
+ jitc_add(jitc, "inc edx");
+ break;
+ case INSTR_ISEQUALP_VAR_PTR :
+ jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr);
+ jitc_add(jitc, "mov edx, $d", 0);
+ jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_ptr);
+ jitc_add(jitc, "jne $d", 1);
+ jitc_add(jitc, "inc edx");
+ break;
+ case INSTR_ISEQUALI_VAR_VAR :
+ jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+ jitc_add(jitc, "mov edx, $d", 0);
+ jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_int);
+ jitc_add(jitc, "jne $d", 1);
+ jitc_add(jitc, "inc edx");
+ break;
+ case INSTR_ISEQUALI_VAR_INTEGER :
+ jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int);
+ jitc_add(jitc, "mov edx, $d", 0);
+ jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_int);
+ jitc_add(jitc, "jne $d", 1);
+ jitc_add(jitc, "inc edx");
+ break;
+ case INSTR_ISEQUALF_VAR_VAR :
+ printf("NOT IMPLEMENTED : %d\n", instr->id);
+ break;
+ case INSTR_ISEQUALF_VAR_FLOAT :
+ printf("NOT IMPLEMENTED : %d\n", instr->id);
+ break;
+ case INSTR_CALL:
+ jitc_add(jitc, "call $s", instr->jump_label);
+ break;
+ case INSTR_RET:
+ jitc_add(jitc, "ret");
+ break;
+ case INSTR_EXT_CALL:
+ jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function->vars));
+ jitc_add(jitc, "push eax");
+ jitc_add(jitc, "mov edx, [$d]", &(currentGoomSL->vars));
+ jitc_add(jitc, "push edx");
+ jitc_add(jitc, "mov eax, [$d]", &(currentGoomSL));
+ jitc_add(jitc, "push eax");
+
+ jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function));
+ jitc_add(jitc, "mov eax, [eax]");
+ jitc_add(jitc, "call [eax]");
+ jitc_add(jitc, "add esp, $d", 12);
+ break;
+ case INSTR_NOT_VAR:
+ jitc_add(jitc, "mov eax, edx");
+ jitc_add(jitc, "mov edx, $d", 1);
+ jitc_add(jitc, "sub edx, eax");
+ break;
+ case INSTR_JNZERO:
+ jitc_add(jitc, "cmp edx, $d", 0);
+ jitc_add(jitc, "jne $s", instr->jump_label);
+ break;
+ case INSTR_SETS_VAR_VAR:
+ {
+ int loop = DEST_STRUCT_SIZE / sizeof(int);
+ int dst = (int)pDEST_VAR;
+ int src = (int)pSRC_VAR;
+
+ while (loop--) {
+ jitc_add(jitc,"mov eax, [$d]", src);
+ jitc_add(jitc,"mov [$d], eax", dst);
+ src += 4;
+ dst += 4;
+ }
+ }
+ break;
+ case INSTR_ISEQUALS_VAR_VAR:
+ break;
+ case INSTR_ADDS_VAR_VAR:
+ {
+ /* process integers */
+ int i=0;
+ while (DEST_STRUCT_IBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_IBLOCK(i).size;
+ while (j--) { /* TODO interlace 2 */
+ jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j));
+ jitc_add(jitc, "add eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j));
+ jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j));
+ }
+ ++i;
+ }
+ /* process floats */
+ i=0;
+ while (DEST_STRUCT_FBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_FBLOCK(i).size;
+ while (j--) {
+ /* DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); */
+ /* TODO */
+ }
+ ++i;
+ }
+ break;
+ }
+ case INSTR_SUBS_VAR_VAR:
+ {
+ /* process integers */
+ int i=0;
+ while (DEST_STRUCT_IBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_IBLOCK(i).size;
+ while (j--) {
+ jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j));
+ jitc_add(jitc, "sub eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j));
+ jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j));
+ }
+ ++i;
+ }
+ break;
+ }
+ case INSTR_MULS_VAR_VAR:
+ {
+ /* process integers */
+ int i=0;
+ while (DEST_STRUCT_IBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_IBLOCK(i).size;
+ while (j--) {
+ jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j));
+ jitc_add(jitc, "imul eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j));
+ jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j));
+ }
+ ++i;
+ }
+ break;
+ }
+ case INSTR_DIVS_VAR_VAR:
+ {
+ /* process integers */
+ int i=0;
+ while (DEST_STRUCT_IBLOCK(i).size > 0) {
+ int j=DEST_STRUCT_IBLOCK(i).size;
+ while (j--) {
+ jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j));
+ jitc_add(jitc, "cdq");
+ jitc_add(jitc, "idiv [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j));
+ jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j));
+ }
+ ++i;
+ }
+ break;
+ }
+ }
+ }
+
+ JITC_ADD_LABEL (jitc, "__very_end__");
+ jitc_add(jitc, "call $s", "__very_start__");
+ jitc_add(jitc, "mov eax, $d", 0);
+ jitc_validate_func(jitc);
+#else
+ InstructionFlow *iflow = currentGoomSL->iflow;
+ FastInstructionFlow *fastiflow = (FastInstructionFlow*)malloc(sizeof(FastInstructionFlow));
+ fastiflow->mallocedInstr = calloc(number*16, sizeof(FastInstruction));
+ /* fastiflow->instr = (FastInstruction*)(((int)fastiflow->mallocedInstr) + 16 - (((int)fastiflow->mallocedInstr)%16)); */
+ fastiflow->instr = (FastInstruction*)fastiflow->mallocedInstr;
+ fastiflow->number = number;
+ for(i=0;i<number;++i) {
+ fastiflow->instr[i].id = iflow->instr[i]->id;
+ fastiflow->instr[i].data = iflow->instr[i]->data;
+ fastiflow->instr[i].proto = iflow->instr[i];
+ }
+ currentGoomSL->fastiflow = fastiflow;
+#endif
+} /* }}} */
+
+void yy_scan_string(const char *str);
+void yyparse(void);
+
+GoomHash *gsl_globals(GoomSL *_this)
+{
+ return _this->vars;
+}
+
+
+/**
+ * Some native external functions
+ */
+static void ext_charAt(GoomSL *gsl, GoomHash *global, GoomHash *local)
+{
+ char *string = GSL_LOCAL_PTR(gsl, local, "value");
+ int index = GSL_LOCAL_INT(gsl, local, "index");
+ GSL_GLOBAL_INT(gsl, "charAt") = 0;
+ if (string == NULL) {
+ return;
+ }
+ if (index < strlen(string))
+ GSL_GLOBAL_INT(gsl, "charAt") = string[index];
+}
+
+static void ext_i2f(GoomSL *gsl, GoomHash *global, GoomHash *local)
+{
+ int i = GSL_LOCAL_INT(gsl, local, "value");
+ GSL_GLOBAL_FLOAT(gsl, "i2f") = i;
+}
+
+static void ext_f2i(GoomSL *gsl, GoomHash *global, GoomHash *local)
+{
+ float f = GSL_LOCAL_FLOAT(gsl, local, "value");
+ GSL_GLOBAL_INT(gsl, "f2i") = f;
+}
+
+/**
+ *
+ */
+void gsl_compile(GoomSL *_currentGoomSL, const char *script)
+{ /* {{{ */
+ char *script_and_externals;
+ static const char *sBinds =
+ "external <charAt: string value, int index> : int\n"
+ "external <f2i: float value> : int\n"
+ "external <i2f: int value> : float\n";
+
+#ifdef VERBOSE
+ printf("\n=== Starting Compilation ===\n");
+#endif
+
+ script_and_externals = malloc(strlen(script) + strlen(sBinds) + 2);
+ strcpy(script_and_externals, sBinds);
+ strcat(script_and_externals, script);
+
+ /* 0- reset */
+ currentGoomSL = _currentGoomSL;
+ reset_scanner(currentGoomSL);
+
+ /* 1- create the syntaxic tree */
+ yy_scan_string(script_and_externals);
+ yyparse();
+
+ /* 2- generate code */
+ gsl_commit_compilation();
+
+ /* 3- resolve symbols */
+ calculate_labels(currentGoomSL->iflow);
+
+ /* 4- optimize code */
+ gsl_create_fast_iflow();
+
+ /* 5- bind a few internal functions */
+ gsl_bind_function(currentGoomSL, "charAt", ext_charAt);
+ gsl_bind_function(currentGoomSL, "f2i", ext_f2i);
+ gsl_bind_function(currentGoomSL, "i2f", ext_i2f);
+ free(script_and_externals);
+
+#ifdef VERBOSE
+ printf("=== Compilation done. # of lines: %d. # of instr: %d ===\n", currentGoomSL->num_lines, currentGoomSL->iflow->number);
+#endif
+} /* }}} */
+
+void gsl_execute(GoomSL *scanner)
+{ /* {{{ */
+ if (scanner->compilationOK) {
+#if USE_JITC_X86
+ scanner->jitc_func();
+#else
+ iflow_execute(scanner->fastiflow, scanner);
+#endif
+ }
+} /* }}} */
+
+GoomSL *gsl_new(void)
+{ /* {{{ */
+ GoomSL *gss = (GoomSL*)malloc(sizeof(GoomSL));
+
+ gss->iflow = iflow_new();
+ gss->vars = goom_hash_new();
+ gss->functions = goom_hash_new();
+ gss->nbStructID = 0;
+ gss->structIDS = goom_hash_new();
+ gss->gsl_struct_size = 32;
+ gss->gsl_struct = (GSL_Struct**)malloc(gss->gsl_struct_size * sizeof(GSL_Struct*));
+ gss->currentNS = 0;
+ gss->namespaces[0] = gss->vars;
+ gss->data_heap = goom_heap_new();
+
+ reset_scanner(gss);
+
+ gss->compilationOK = 0;
+ gss->nbPtr=0;
+ gss->ptrArraySize=256;
+ gss->ptrArray = (void**)malloc(gss->ptrArraySize * sizeof(void*));
+#ifdef USE_JITC_X86
+ gss->jitc = NULL;
+#endif
+ return gss;
+} /* }}} */
+
+void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func)
+{ /* {{{ */
+ HashValue *val = goom_hash_get(gss->functions, fname);
+ if (val) {
+ ExternalFunctionStruct *gef = (ExternalFunctionStruct*)val->ptr;
+ gef->function = func;
+ }
+ else fprintf(stderr, "Unable to bind function %s\n", fname);
+} /* }}} */
+
+int gsl_is_compiled(GoomSL *gss)
+{ /* {{{ */
+ return gss->compilationOK;
+} /* }}} */
+
+void gsl_free(GoomSL *gss)
+{ /* {{{ */
+ iflow_free(gss->iflow);
+ goom_hash_free(gss->vars);
+ goom_hash_free(gss->functions);
+ goom_hash_free(gss->structIDS);
+ free(gss->gsl_struct);
+ goom_heap_delete(gss->data_heap);
+ free(gss->ptrArray);
+ free(gss);
+} /* }}} */
+
+
+static int gsl_nb_import;
+static char gsl_already_imported[256][256];
+
+char *gsl_init_buffer(const char *fname)
+{
+ char *fbuffer;
+ fbuffer = (char*)malloc(512);
+ fbuffer[0]=0;
+ gsl_nb_import = 0;
+ if (fname)
+ gsl_append_file_to_buffer(fname,&fbuffer);
+ return fbuffer;
+}
+
+static char *gsl_read_file(const char *fname)
+{
+ FILE *f;
+ char *buffer;
+ int fsize;
+ f = fopen(fname,"rt");
+ if (!f) {
+ fprintf(stderr, "ERROR: Could not load file %s\n", fname);
+ exit(1);
+ }
+ fseek(f,0,SEEK_END);
+ fsize = ftell(f);
+ rewind(f);
+ buffer = (char*)malloc(fsize+512);
+ fread(buffer,1,fsize,f);
+ fclose(f);
+ buffer[fsize]=0;
+ return buffer;
+}
+
+void gsl_append_file_to_buffer(const char *fname, char **buffer)
+{
+ char *fbuffer;
+ int size,fsize,i=0;
+ char reset_msg[256];
+
+ /* look if the file have not been already imported */
+ for (i=0;i<gsl_nb_import;++i) {
+ if (strcmp(gsl_already_imported[i], fname) == 0)
+ return;
+ }
+
+ /* add fname to the already imported files. */
+ strcpy(gsl_already_imported[gsl_nb_import++], fname);
+
+ /* load the file */
+ fbuffer = gsl_read_file(fname);
+ fsize = strlen(fbuffer);
+
+ /* look for #import */
+ while (fbuffer[i]) {
+ if ((fbuffer[i]=='#') && (fbuffer[i+1]=='i')) {
+ char impName[256];
+ int j;
+ while (fbuffer[i] && (fbuffer[i]!=' '))
+ i++;
+ i++;
+ j=0;
+ while (fbuffer[i] && (fbuffer[i]!='\n'))
+ impName[j++] = fbuffer[i++];
+ impName[j++] = 0;
+ gsl_append_file_to_buffer(impName, buffer);
+ }
+ i++;
+ }
+
+ sprintf(reset_msg, "\n#FILE %s#\n#RST_LINE#\n", fname);
+ strcat(*buffer, reset_msg);
+ size=strlen(*buffer);
+ *buffer = (char*)realloc(*buffer, size+fsize+256);
+ strcat((*buffer)+size, fbuffer);
+ free(fbuffer);
+}
+
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl.h b/src/visualizations/Goom/goom2k4-0/src/goomsl.h
new file mode 100644
index 0000000000..b9f20d6cc4
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goomsl.h
@@ -0,0 +1,34 @@
+#ifndef _GOOMSL_H
+#define _GOOMSL_H
+
+#include "goomsl_hash.h"
+
+typedef struct _GoomSL GoomSL;
+typedef void (*GoomSL_ExternalFunction)(GoomSL *gsl, GoomHash *global_vars, GoomHash *local_vars);
+
+GoomSL*gsl_new(void);
+void gsl_free(GoomSL *gss);
+
+char *gsl_init_buffer(const char *file_name);
+void gsl_append_file_to_buffer(const char *file_name, char **buffer);
+
+void gsl_compile (GoomSL *scanner, const char *script);
+void gsl_execute (GoomSL *scanner);
+int gsl_is_compiled (GoomSL *gss);
+void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func);
+
+int gsl_malloc (GoomSL *_this, int size);
+void *gsl_get_ptr (GoomSL *_this, int id);
+void gsl_free_ptr(GoomSL *_this, int id);
+
+GoomHash *gsl_globals(GoomSL *_this);
+
+#define GSL_LOCAL_PTR(gsl,local,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(local,name)->ptr)
+#define GSL_LOCAL_INT(gsl,local,name) (*(int*)goom_hash_get(local,name)->ptr)
+#define GSL_LOCAL_FLOAT(gsl,local,name) (*(float*)goom_hash_get(local,name)->ptr)
+
+#define GSL_GLOBAL_PTR(gsl,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(gsl_globals(gsl),name)->ptr)
+#define GSL_GLOBAL_INT(gsl,name) (*(int*)goom_hash_get(gsl_globals(gsl),name)->ptr)
+#define GSL_GLOBAL_FLOAT(gsl,name) (*(float*)goom_hash_get(gsl_globals(gsl),name)->ptr)
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_hash.c b/src/visualizations/Goom/goom2k4-0/src/goomsl_hash.c
new file mode 100644
index 0000000000..af2ec44a66
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_hash.c
@@ -0,0 +1,120 @@
+#include "goomsl_hash.h"
+#include <string.h>
+#include <stdlib.h>
+
+static GoomHashEntry *entry_new(const char *key, HashValue value) {
+
+ int len = strlen(key);
+ GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry));
+
+ entry->key = (char *)malloc(len+1);
+ memcpy(entry->key,key,len+1);
+ entry->value = value;
+ entry->lower = NULL;
+ entry->upper = NULL;
+
+ return entry;
+}
+
+static void entry_free(GoomHashEntry *entry) {
+ if (entry!=NULL) {
+ entry_free(entry->lower);
+ entry_free(entry->upper);
+ free(entry->key);
+ free(entry);
+ }
+}
+
+static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) {
+ int cmp = strcmp(key,entry->key);
+ if (cmp==0) {
+ entry->value = value;
+ }
+ else if (cmp > 0) {
+ if (entry->upper == NULL)
+ entry->upper = entry_new(key,value);
+ else
+ entry_put(entry->upper, key, value);
+ }
+ else {
+ if (entry->lower == NULL)
+ entry->lower = entry_new(key,value);
+ else
+ entry_put(entry->lower, key, value);
+ }
+}
+
+static HashValue *entry_get(GoomHashEntry *entry, const char *key) {
+
+ int cmp;
+ if (entry==NULL)
+ return NULL;
+ cmp = strcmp(key,entry->key);
+ if (cmp > 0)
+ return entry_get(entry->upper, key);
+ else if (cmp < 0)
+ return entry_get(entry->lower, key);
+ else
+ return &(entry->value);
+}
+
+GoomHash *goom_hash_new() {
+ GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash));
+ _this->root = NULL;
+ _this->number_of_puts = 0;
+ return _this;
+}
+
+void goom_hash_free(GoomHash *_this) {
+ entry_free(_this->root);
+ free(_this);
+}
+
+void goom_hash_put(GoomHash *_this, const char *key, HashValue value) {
+ _this->number_of_puts += 1;
+ if (_this->root == NULL)
+ _this->root = entry_new(key,value);
+ else
+ entry_put(_this->root,key,value);
+}
+
+HashValue *goom_hash_get(GoomHash *_this, const char *key) {
+ if (_this == NULL) return NULL;
+ return entry_get(_this->root,key);
+}
+
+void goom_hash_put_int(GoomHash *_this, const char *key, int i) {
+ HashValue value;
+ value.i = i;
+ goom_hash_put(_this,key,value);
+}
+
+void goom_hash_put_float(GoomHash *_this, const char *key, float f) {
+ HashValue value;
+ value.f = f;
+ goom_hash_put(_this,key,value);
+}
+
+void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) {
+ HashValue value;
+ value.ptr = ptr;
+ goom_hash_put(_this,key,value);
+}
+
+/* FOR EACH */
+
+static void _goom_hash_for_each(GoomHash *_this, GoomHashEntry *entry, GH_Func func)
+{
+ if (entry == NULL) return;
+ func(_this, entry->key, &(entry->value));
+ _goom_hash_for_each(_this, entry->lower, func);
+ _goom_hash_for_each(_this, entry->upper, func);
+}
+
+void goom_hash_for_each(GoomHash *_this, GH_Func func) {
+ _goom_hash_for_each(_this, _this->root, func);
+}
+
+int goom_hash_number_of_puts(GoomHash *_this) {
+ return _this->number_of_puts;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_hash.h b/src/visualizations/Goom/goom2k4-0/src/goomsl_hash.h
new file mode 100644
index 0000000000..26f4516738
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_hash.h
@@ -0,0 +1,40 @@
+#ifndef _GOOMSL_HASH_H
+#define _GOOMSL_HASH_H
+
+typedef struct GOOM_HASH_ENTRY GoomHashEntry;
+typedef struct GOOM_HASH GoomHash;
+
+typedef union {
+ void *ptr;
+ int i;
+ float f;
+} HashValue;
+
+struct GOOM_HASH_ENTRY {
+ char *key;
+ HashValue value;
+ GoomHashEntry *lower;
+ GoomHashEntry *upper;
+};
+
+struct GOOM_HASH {
+ GoomHashEntry *root;
+ int number_of_puts;
+};
+
+GoomHash *goom_hash_new();
+void goom_hash_free(GoomHash *gh);
+
+void goom_hash_put(GoomHash *gh, const char *key, HashValue value);
+HashValue *goom_hash_get(GoomHash *gh, const char *key);
+
+void goom_hash_put_int (GoomHash *_this, const char *key, int i);
+void goom_hash_put_float(GoomHash *_this, const char *key, float f);
+void goom_hash_put_ptr (GoomHash *_this, const char *key, void *ptr);
+
+typedef void (*GH_Func)(GoomHash *caller, const char *key, HashValue *value);
+
+void goom_hash_for_each(GoomHash *_this, GH_Func func);
+int goom_hash_number_of_puts(GoomHash *_this);
+
+#endif /* _GOOM_HASH_H */
diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_heap.c b/src/visualizations/Goom/goom2k4-0/src/goomsl_heap.c
new file mode 100644
index 0000000000..73943bf952
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_heap.c
@@ -0,0 +1,105 @@
+#include "goomsl_heap.h"
+#include <stdlib.h>
+
+struct _GOOM_HEAP {
+ void **arrays;
+ int number_of_arrays;
+ int size_of_each_array;
+ int consumed_in_last_array;
+};
+
+/* Constructors / Destructor */
+GoomHeap *goom_heap_new(void)
+{
+ return goom_heap_new_with_granularity(4096);
+}
+
+GoomHeap *goom_heap_new_with_granularity(int granularity)
+{
+ GoomHeap *_this;
+ _this = (GoomHeap*)malloc(sizeof(GoomHeap));
+ _this->number_of_arrays = 0;
+ _this->size_of_each_array = granularity;
+ _this->consumed_in_last_array = 0;
+ _this->arrays = (void**)malloc(sizeof(void*));
+ return _this;
+}
+
+void goom_heap_delete(GoomHeap *_this)
+{
+ int i;
+ for (i=0;i<_this->number_of_arrays;++i) {
+ free(_this->arrays[i]);
+ }
+ free(_this->arrays);
+ free(_this);
+}
+
+static void align_it(GoomHeap *_this, int alignment)
+{
+ if ((alignment > 1) && (_this->number_of_arrays>0)) {
+ void *last_array = _this->arrays[_this->number_of_arrays - 1];
+ int last_address = (int)last_array + _this->consumed_in_last_array;
+ int decal = (last_address % alignment);
+ if (decal != 0) {
+ _this->consumed_in_last_array += alignment - decal;
+ }
+ }
+}
+
+void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes,
+ int alignment, int prefix_bytes)
+{
+ void *retval = NULL;
+
+ /* d'abord on gere les problemes d'alignement */
+ _this->consumed_in_last_array += prefix_bytes;
+ align_it(_this, alignment);
+
+ /* ensuite on verifie que la quantite de memoire demandee tient dans le buffer */
+ if ((_this->consumed_in_last_array + nb_bytes >= _this->size_of_each_array)
+ || (_this->number_of_arrays == 0)) {
+
+ if (prefix_bytes + nb_bytes + alignment >= _this->size_of_each_array) {
+
+ /* Si la zone demandee est plus grosse que la granularitee */
+ /* On alloue un buffer plus gros que les autres */
+ _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * (_this->number_of_arrays+2));
+
+ _this->number_of_arrays += 1;
+ _this->consumed_in_last_array = prefix_bytes;
+
+ _this->arrays[_this->number_of_arrays - 1] = malloc(prefix_bytes + nb_bytes + alignment);
+ align_it(_this,alignment);
+ retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array);
+
+ /* puis on repart sur un nouveau buffer vide */
+ _this->number_of_arrays += 1;
+ _this->consumed_in_last_array = 0;
+ _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array);
+ return retval;
+ }
+ else {
+ _this->number_of_arrays += 1;
+ _this->consumed_in_last_array = prefix_bytes;
+ _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * _this->number_of_arrays);
+
+ _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array);
+ align_it(_this,alignment);
+ }
+ }
+ retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array);
+ _this->consumed_in_last_array += nb_bytes;
+ return retval;
+}
+
+void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment)
+{
+ return goom_heap_malloc_with_alignment_prefixed(_this, nb_bytes, alignment, 0);
+}
+
+void *goom_heap_malloc(GoomHeap *_this, int nb_bytes)
+{
+ return goom_heap_malloc_with_alignment(_this,nb_bytes,1);
+}
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_heap.h b/src/visualizations/Goom/goom2k4-0/src/goomsl_heap.h
new file mode 100644
index 0000000000..a22bac695a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_heap.h
@@ -0,0 +1,29 @@
+#ifndef GOOMSL_HEAP
+#define GOOMSL_HEAP
+
+/**
+ * Resizable Array that guarranty that resizes don't change address of
+ * the stored datas.
+ *
+ * This is implemented as an array of arrays... granularity is the size
+ * of each arrays.
+ */
+
+typedef struct _GOOM_HEAP GoomHeap;
+
+/* Constructors / Destructor */
+GoomHeap *goom_heap_new(void);
+GoomHeap *goom_heap_new_with_granularity(int granularity);
+void goom_heap_delete(GoomHeap *_this);
+
+/* This method behaves like malloc. */
+void *goom_heap_malloc(GoomHeap *_this, int nb_bytes);
+/* This adds an alignment constraint. */
+void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment);
+
+/* Returns a pointeur on the bytes... prefix is before */
+void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes,
+ int alignment, int prefix_bytes);
+
+#endif
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_lex.c b/src/visualizations/Goom/goom2k4-0/src/goomsl_lex.c
new file mode 100644
index 0000000000..e7cf569b70
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_lex.c
@@ -0,0 +1,2110 @@
+#line 2 "goomsl_lex.c"
+
+#line 4 "goomsl_lex.c"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 31
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart(yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+extern int yyleng;
+
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
+ * access to the local variable yy_act. Since yyless() is a macro, it would break
+ * existing scanners that call yyless() from OUTSIDE yylex.
+ * One obvious solution it to make yy_act a global. I tried that, and saw
+ * a 5% performance hit in a non-yylineno scanner, because yy_act is
+ * normally declared as a register variable-- so it is not worth it.
+ */
+ #define YY_LESS_LINENO(n) \
+ do { \
+ int yyl;\
+ for ( yyl = n; yyl < yyleng; ++yyl )\
+ if ( yytext[yyl] == '\n' )\
+ --yylineno;\
+ }while(0)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef unsigned int yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart (FILE *input_file );
+void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
+void yy_delete_buffer (YY_BUFFER_STATE b );
+void yy_flush_buffer (YY_BUFFER_STATE b );
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
+void yypop_buffer_state (void );
+
+static void yyensure_buffer_stack (void );
+static void yy_load_buffer_state (void );
+static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
+
+void *yyalloc (yy_size_t );
+void *yyrealloc (void *,yy_size_t );
+void yyfree (void * );
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer(yyin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer(yyin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+typedef unsigned char YY_CHAR;
+
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+#define YY_FLEX_LEX_COMPAT
+extern int yylineno;
+
+int yylineno = 1;
+
+extern char yytext[];
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ yyleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ if ( yyleng + (yy_more_offset) >= YYLMAX ) \
+ YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \
+ yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \
+ yyleng += (yy_more_offset); \
+ (yy_prev_more_offset) = (yy_more_offset); \
+ (yy_more_offset) = 0; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 49
+#define YY_END_OF_BUFFER 50
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[214] =
+ { 0,
+ 50, 48, 49, 47, 48, 49, 4, 49, 48, 49,
+ 13, 48, 49, 10, 48, 49, 33, 48, 49, 48,
+ 49, 48, 49, 48, 49, 48, 49, 48, 49, 34,
+ 48, 49, 34, 48, 49, 48, 49, 48, 49, 33,
+ 48, 49, 33, 48, 49, 33, 48, 49, 33, 48,
+ 49, 33, 48, 49, 33, 48, 49, 33, 48, 49,
+ 33, 48, 49, 33, 48, 49, 33, 48, 49, 47,
+ 48, 49, 1, 4, 49, 48, 49, 7, 49, 6,
+ 49, 7, 49, 7, 49, 1, 6, 49, 7, 49,
+ 3, 49, 1, 3, 49, 17, 49, 49, 16, 17,
+
+ 49, 17, 49, 47, 45, 10, 10, 10, 33, 40,
+ 39, 41, 11, 12, 42, 38, 37, 34, 43, 46,
+ 44, 33, 33, 28, 33, 33, 33, 33, 33, 30,
+ 33, 33, 33, 33, 33, 33, 47, 1, 12, 5,
+ 15, 14, 10, 10, 35, 37, 36, 33, 33, 33,
+ 33, 33, 29, 33, 19, 33, 26, 33, 21, 33,
+ 33, 33, 33, 2, 10, 10, 33, 33, 33, 33,
+ 33, 33, 33, 31, 33, 33, 10, 10, 33, 33,
+ 33, 32, 33, 18, 33, 33, 33, 27, 33, 10,
+ 10, 33, 33, 33, 22, 33, 25, 33, 10, 9,
+
+ 10, 10, 20, 33, 23, 33, 33, 10, 24, 33,
+ 10, 8, 10
+ } ;
+
+static yyconst flex_int16_t yy_accept[152] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+ 4, 7, 9, 11, 14, 17, 20, 22, 24, 26,
+ 28, 30, 33, 36, 38, 40, 43, 46, 49, 52,
+ 55, 58, 61, 64, 67, 70, 73, 76, 78, 80,
+ 82, 84, 86, 89, 91, 93, 96, 98, 99, 102,
+ 104, 105, 106, 107, 108, 109, 110, 110, 111, 112,
+ 113, 114, 115, 116, 117, 118, 119, 119, 120, 121,
+ 122, 123, 124, 126, 127, 128, 129, 130, 132, 133,
+ 134, 135, 136, 137, 138, 139, 139, 140, 141, 141,
+ 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
+
+ 151, 152, 153, 155, 157, 159, 161, 162, 163, 164,
+ 164, 165, 166, 167, 168, 169, 170, 171, 172, 173,
+ 174, 176, 177, 178, 179, 180, 181, 182, 184, 186,
+ 187, 188, 190, 191, 192, 193, 194, 195, 197, 199,
+ 200, 202, 203, 205, 207, 208, 209, 211, 212, 214,
+ 214
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 4, 5, 6, 7, 1, 8, 9, 10, 1,
+ 1, 11, 12, 1, 13, 14, 15, 16, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 1, 1, 18,
+ 19, 20, 1, 9, 21, 21, 21, 21, 22, 23,
+ 21, 21, 24, 21, 21, 25, 21, 26, 21, 21,
+ 21, 27, 28, 29, 21, 21, 21, 21, 21, 21,
+ 1, 30, 1, 1, 31, 1, 32, 33, 34, 35,
+
+ 36, 37, 38, 39, 40, 21, 21, 41, 21, 42,
+ 43, 44, 21, 45, 46, 47, 48, 21, 49, 50,
+ 21, 21, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[51] =
+ { 0,
+ 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 3, 1, 4, 4, 1, 1, 1,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 1,
+ 3, 4, 4, 4, 4, 4, 4, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
+ } ;
+
+static yyconst flex_int16_t yy_base[159] =
+ { 0,
+ 0, 49, 51, 54, 221, 57, 60, 64, 223, 225,
+ 69, 225, 203, 225, 51, 0, 0, 202, 201, 200,
+ 64, 68, 72, 72, 199, 174, 57, 166, 55, 173,
+ 171, 166, 165, 166, 171, 99, 225, 93, 225, 225,
+ 194, 107, 225, 193, 225, 225, 225, 225, 225, 71,
+ 93, 225, 0, 183, 178, 0, 195, 225, 225, 225,
+ 225, 225, 225, 225, 89, 107, 0, 225, 225, 225,
+ 161, 169, 0, 155, 160, 157, 154, 151, 150, 151,
+ 150, 146, 153, 123, 225, 177, 188, 225, 126, 187,
+ 225, 225, 164, 159, 225, 100, 0, 146, 145, 149,
+
+ 138, 151, 0, 0, 0, 0, 59, 146, 140, 177,
+ 225, 157, 147, 141, 144, 130, 138, 126, 130, 137,
+ 0, 134, 165, 143, 133, 112, 109, 0, 0, 102,
+ 92, 0, 130, 112, 93, 98, 101, 0, 0, 125,
+ 124, 94, 0, 0, 78, 59, 0, 61, 0, 225,
+ 141, 145, 149, 151, 155, 51, 159, 163
+ } ;
+
+static yyconst flex_int16_t yy_def[159] =
+ { 0,
+ 150, 1, 151, 151, 151, 151, 152, 152, 150, 150,
+ 150, 150, 150, 150, 153, 154, 155, 150, 150, 150,
+ 150, 150, 150, 150, 150, 154, 154, 154, 154, 154,
+ 154, 154, 154, 154, 154, 150, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+ 150, 150, 153, 153, 153, 154, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150, 150, 156, 150, 150, 150,
+ 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+ 154, 154, 154, 150, 150, 150, 157, 150, 150, 157,
+ 150, 150, 153, 153, 150, 150, 156, 154, 154, 154,
+
+ 154, 154, 154, 154, 154, 154, 154, 154, 154, 157,
+ 150, 153, 153, 154, 154, 154, 154, 154, 154, 154,
+ 154, 154, 153, 153, 154, 154, 154, 154, 154, 154,
+ 154, 154, 158, 153, 154, 154, 154, 154, 154, 158,
+ 158, 153, 154, 154, 154, 153, 154, 153, 153, 0,
+ 150, 150, 150, 150, 150, 150, 150, 150
+ } ;
+
+static yyconst flex_int16_t yy_nxt[276] =
+ { 0,
+ 10, 11, 12, 11, 13, 14, 15, 10, 16, 17,
+ 18, 19, 20, 10, 21, 22, 23, 24, 10, 25,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 10,
+ 16, 16, 26, 16, 27, 28, 29, 16, 16, 30,
+ 16, 31, 16, 32, 16, 33, 34, 16, 35, 16,
+ 36, 37, 36, 40, 97, 42, 43, 42, 42, 46,
+ 42, 41, 48, 38, 41, 49, 48, 149, 44, 49,
+ 51, 44, 51, 54, 61, 64, 91, 55, 62, 64,
+ 148, 65, 63, 66, 66, 65, 75, 66, 66, 50,
+ 68, 69, 72, 50, 51, 76, 51, 77, 119, 73,
+
+ 84, 85, 84, 61, 96, 96, 120, 87, 89, 85,
+ 89, 63, 92, 86, 64, 96, 96, 67, 147, 146,
+ 65, 86, 66, 66, 84, 85, 84, 89, 85, 89,
+ 141, 141, 145, 144, 143, 142, 141, 86, 139, 138,
+ 86, 39, 39, 39, 39, 47, 47, 47, 47, 53,
+ 137, 53, 53, 56, 56, 57, 136, 57, 57, 110,
+ 110, 110, 110, 140, 135, 140, 140, 134, 133, 132,
+ 131, 130, 129, 128, 127, 126, 125, 124, 123, 111,
+ 122, 121, 118, 117, 116, 115, 114, 113, 112, 111,
+ 111, 90, 109, 108, 107, 106, 105, 104, 103, 102,
+
+ 101, 100, 99, 98, 95, 94, 93, 90, 88, 83,
+ 82, 81, 80, 79, 78, 74, 71, 70, 60, 59,
+ 58, 52, 150, 45, 9, 150, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150
+ } ;
+
+static yyconst flex_int16_t yy_chk[276] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 3, 156, 4, 4, 4, 6, 6,
+ 6, 3, 7, 2, 4, 7, 8, 148, 4, 8,
+ 11, 6, 11, 15, 21, 22, 50, 15, 21, 23,
+ 146, 22, 21, 22, 22, 23, 29, 23, 23, 7,
+ 24, 24, 27, 8, 51, 29, 51, 29, 107, 27,
+
+ 36, 36, 36, 38, 65, 65, 107, 38, 42, 42,
+ 42, 38, 50, 36, 66, 96, 96, 22, 145, 142,
+ 66, 42, 66, 66, 84, 84, 84, 89, 89, 89,
+ 141, 140, 137, 136, 135, 134, 133, 84, 131, 130,
+ 89, 151, 151, 151, 151, 152, 152, 152, 152, 153,
+ 127, 153, 153, 154, 154, 155, 126, 155, 155, 157,
+ 157, 157, 157, 158, 125, 158, 158, 124, 123, 122,
+ 120, 119, 118, 117, 116, 115, 114, 113, 112, 110,
+ 109, 108, 102, 101, 100, 99, 98, 94, 93, 90,
+ 87, 86, 83, 82, 81, 80, 79, 78, 77, 76,
+
+ 75, 74, 72, 71, 57, 55, 54, 44, 41, 35,
+ 34, 33, 32, 31, 30, 28, 26, 25, 20, 19,
+ 18, 13, 9, 5, 150, 150, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150
+ } ;
+
+/* Table of booleans, true if rule could match eol. */
+static yyconst flex_int32_t yy_rule_can_match_eol[50] =
+ { 0,
+1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
+
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+static int yy_more_offset = 0;
+static int yy_prev_more_offset = 0;
+#define yymore() ((yy_more_offset) = yy_flex_strlen( yytext ))
+#define YY_NEED_STRLEN
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET \
+ { \
+ (yy_more_offset) = (yy_prev_more_offset); \
+ yyleng -= (yy_more_offset); \
+ }
+#ifndef YYLMAX
+#define YYLMAX 8192
+#endif
+
+char yytext[YYLMAX];
+char *yytext_ptr;
+#line 1 "goomsl_lex.l"
+#line 2 "goomsl_lex.l"
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include "goomsl.h"
+#include "goomsl_private.h"
+#include "goomsl_yacc.h"
+void yyerror(char *);
+void yyparse(void);
+
+GoomSL *currentGoomSL;
+static int string_size;
+static char string[1024];
+
+
+
+#line 639 "goomsl_lex.c"
+
+#define INITIAL 0
+#define C_COMMENT 1
+#define LINE_COMMENT 2
+#define STRING 3
+
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#ifndef _WIN32PC
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap (void );
+#else
+extern int yywrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex (void);
+
+#define YY_DECL int yylex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( yyleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (yytext[yyleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 25 "goomsl_lex.l"
+
+
+#line 797 "goomsl_lex.c"
+
+ if ( (yy_init) )
+ {
+ (yy_init) = 0;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)yyalloc(YY_BUF_SIZE + 2 );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer(yyin,YY_BUF_SIZE );
+ }
+
+ yy_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of yytext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 151 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 225 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ {
+ (yy_full_match) = yy_cp;
+ break;
+ }
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+ if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
+ {
+ int yyl;
+ for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl )
+ if ( yytext[yyl] == '\n' )
+
+ yylineno++;
+;
+ }
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+/* rule 1 can match eol */
+YY_RULE_SETUP
+#line 27 "goomsl_lex.l"
+{ ++currentGoomSL->num_lines; /* Ignore empty lines */ }
+ YY_BREAK
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+#line 28 "goomsl_lex.l"
+{ ++currentGoomSL->num_lines; /* Ignore empty lines */ }
+ YY_BREAK
+case 3:
+/* rule 3 can match eol */
+YY_RULE_SETUP
+#line 30 "goomsl_lex.l"
+{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; }
+ YY_BREAK
+case 4:
+/* rule 4 can match eol */
+YY_RULE_SETUP
+#line 31 "goomsl_lex.l"
+{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 33 "goomsl_lex.l"
+{ BEGIN INITIAL; }
+ YY_BREAK
+case 6:
+/* rule 6 can match eol */
+YY_RULE_SETUP
+#line 34 "goomsl_lex.l"
+{ ++currentGoomSL->num_lines; }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 35 "goomsl_lex.l"
+{ /* eat up comment */ }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 37 "goomsl_lex.l"
+{ currentGoomSL->num_lines = 0; }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 38 "goomsl_lex.l"
+{ currentGoomSL->num_lines = 0; printf("%s\n", yytext); }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 39 "goomsl_lex.l"
+{ /* ignore preprocessor lines */ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 41 "goomsl_lex.l"
+{ BEGIN C_COMMENT; }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 42 "goomsl_lex.l"
+{ BEGIN LINE_COMMENT; }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 43 "goomsl_lex.l"
+{ BEGIN STRING; string_size=0; }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 45 "goomsl_lex.l"
+{ string[string_size++] = '\n'; }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 46 "goomsl_lex.l"
+{ string[string_size++] = '\"'; }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 47 "goomsl_lex.l"
+{ /* fin de la chaine: on cree le pointeur qui va bien */
+ unsigned int tmp;
+ BEGIN INITIAL;
+ string[string_size]=0;
+ tmp = gsl_malloc(currentGoomSL, string_size+1);
+ strcpy((char*)currentGoomSL->ptrArray[tmp],string);
+ sprintf(yylval.strValue, "0x%08x", tmp);
+ return LTYPE_PTR;
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 56 "goomsl_lex.l"
+{ string[string_size++] = *yytext; }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 58 "goomsl_lex.l"
+{ return FLOAT_TK; }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 59 "goomsl_lex.l"
+{ return INT_TK; }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 60 "goomsl_lex.l"
+{ return INT_TK; }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 61 "goomsl_lex.l"
+{ return PTR_TK; }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 62 "goomsl_lex.l"
+{ return PTR_TK; }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 63 "goomsl_lex.l"
+{ return DECLARE; }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 64 "goomsl_lex.l"
+{ return EXTERNAL; }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 65 "goomsl_lex.l"
+{ return STRUCT; }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 66 "goomsl_lex.l"
+{ return NOT; }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 67 "goomsl_lex.l"
+{ return WHILE; }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 68 "goomsl_lex.l"
+{ return DO; }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 69 "goomsl_lex.l"
+{ return FOR; }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 70 "goomsl_lex.l"
+{ return IN; }
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 71 "goomsl_lex.l"
+{ strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 72 "goomsl_lex.l"
+{ strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 73 "goomsl_lex.l"
+{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 74 "goomsl_lex.l"
+{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; }
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 75 "goomsl_lex.l"
+{ sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 76 "goomsl_lex.l"
+{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 77 "goomsl_lex.l"
+{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; }
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 78 "goomsl_lex.l"
+{ sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; }
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 79 "goomsl_lex.l"
+{ return PLUS_EQ; }
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 80 "goomsl_lex.l"
+{ return MUL_EQ; }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 81 "goomsl_lex.l"
+{ return SUB_EQ; }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 82 "goomsl_lex.l"
+{ return DIV_EQ; }
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 83 "goomsl_lex.l"
+{ return LOW_EQ; }
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 84 "goomsl_lex.l"
+{ return SUP_EQ; }
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 85 "goomsl_lex.l"
+{ return NOT_EQ; }
+ YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 86 "goomsl_lex.l"
+{ return NOT_EQ; }
+ YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 87 "goomsl_lex.l"
+/* eat up whitespace */
+ YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 88 "goomsl_lex.l"
+{ yylval.charValue = *yytext; return *yytext; }
+ YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 90 "goomsl_lex.l"
+ECHO;
+ YY_BREAK
+#line 1155 "goomsl_lex.c"
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(C_COMMENT):
+ case YY_STATE_EOF(LINE_COMMENT):
+ case YY_STATE_EOF(STRING):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( yywrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart(yyin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 151 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 151 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 150);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up yytext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register int number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ if ( c == '\n' ){
+ --yylineno;
+ }
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ int offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart(yyin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( ) )
+ return EOF;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve yytext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )
+
+ yylineno++;
+;
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer(yyin,YY_BUF_SIZE );
+ }
+
+ yy_init_buffer(YY_CURRENT_BUFFER,input_file );
+ yy_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void yy_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ *
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yyfree((void *) b->yy_ch_buf );
+
+ yyfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ yy_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack();
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void yypop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (void)
+{
+ int num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param str a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (yyconst char * str )
+{
+
+ return yy_scan_bytes(str,strlen(str) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = len + 2;
+ buf = (char *) yyalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < len; ++i )
+ buf[i] = bytes[i];
+
+ buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = (yy_hold_char); \
+ (yy_c_buf_p) = yytext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int yyget_lineno (void)
+{
+
+ return yylineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *yyget_in (void)
+{
+ return yyin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *yyget_out (void)
+{
+ return yyout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+int yyget_leng (void)
+{
+ return yyleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *yyget_text (void)
+{
+ return yytext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void yyset_lineno (int line_number )
+{
+
+ yylineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * in_str )
+{
+ yyin = in_str ;
+}
+
+void yyset_out (FILE * out_str )
+{
+ yyout = out_str ;
+}
+
+int yyget_debug (void)
+{
+ return yy_flex_debug;
+}
+
+void yyset_debug (int bdebug )
+{
+ yy_flex_debug = bdebug ;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ yyfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ yyfree ( (yy_state_buf) );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *yyalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *yyrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void yyfree (void * ptr )
+{
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#undef YY_NEW_FILE
+#undef YY_FLUSH_BUFFER
+#undef yy_set_bol
+#undef yy_new_buffer
+#undef yy_set_interactive
+#undef YY_DO_BEFORE_ACTION
+
+#ifdef YY_DECL_IS_OURS
+#undef YY_DECL_IS_OURS
+#undef YY_DECL
+#endif
+#line 90 "goomsl_lex.l"
+
+
+
+
+int yywrap(void) { return 1; yyunput(0,0); }
+
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_lex.l b/src/visualizations/Goom/goom2k4-0/src/goomsl_lex.l
new file mode 100644
index 0000000000..3079c022a2
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_lex.l
@@ -0,0 +1,94 @@
+%{
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include "goomsl.h"
+#include "goomsl_private.h"
+#include "goomsl_yacc.h"
+void yyerror(char *);
+void yyparse(void);
+
+GoomSL *currentGoomSL;
+static int string_size;
+static char string[1024];
+%}
+
+DIGIT [0-9]
+XDIGIT [0-9a-f]
+ID [a-zA-Z_@&][a-zA-Z0-9_\.]*
+
+%S C_COMMENT
+%S LINE_COMMENT
+%S STRING
+
+%%
+
+<LINE_COMMENT,C_COMMENT,INITIAL>^[ \t]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ }
+<LINE_COMMENT,C_COMMENT,INITIAL>^[ \t]*"//"[^\n]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ }
+
+<LINE_COMMENT>\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; }
+<INITIAL>\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; }
+
+<C_COMMENT>"*/" { BEGIN INITIAL; }
+<C_COMMENT>\n { ++currentGoomSL->num_lines; }
+<C_COMMENT,LINE_COMMENT>. { /* eat up comment */ }
+
+<INITIAL>"#RST_LINE#" { currentGoomSL->num_lines = 0; }
+<INITIAL>"#FILE ".*"#" { currentGoomSL->num_lines = 0; printf("%s\n", yytext); }
+<INITIAL>"#"[^\n]* { /* ignore preprocessor lines */ }
+
+<INITIAL>"/*" { BEGIN C_COMMENT; }
+<INITIAL>"//" { BEGIN LINE_COMMENT; }
+<INITIAL>\" { BEGIN STRING; string_size=0; }
+
+<STRING>"\\n" { string[string_size++] = '\n'; }
+<STRING>"\\\"" { string[string_size++] = '\"'; }
+<STRING>\" { /* fin de la chaine: on cree le pointeur qui va bien */
+ unsigned int tmp;
+ BEGIN INITIAL;
+ string[string_size]=0;
+ tmp = gsl_malloc(currentGoomSL, string_size+1);
+ strcpy((char*)currentGoomSL->ptrArray[tmp],string);
+ sprintf(yylval.strValue, "0x%08x", tmp);
+ return LTYPE_PTR;
+ }
+<STRING>. { string[string_size++] = *yytext; }
+
+<INITIAL>"float" { return FLOAT_TK; }
+<INITIAL>"int" { return INT_TK; }
+<INITIAL>"boolean" { return INT_TK; }
+<INITIAL>"ptr" { return PTR_TK; }
+<INITIAL>"string" { return PTR_TK; }
+<INITIAL>"declare" { return DECLARE; }
+<INITIAL>"external" { return EXTERNAL; }
+<INITIAL>"struct" { return STRUCT; }
+<INITIAL>"not" { return NOT; }
+<INITIAL>"while" { return WHILE; }
+<INITIAL>"do" { return DO; }
+<INITIAL>"for" { return FOR; }
+<INITIAL>"in" { return IN; }
+<INITIAL>"true" { strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; }
+<INITIAL>"false" { strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; }
+<INITIAL>{ID} { strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; }
+<INITIAL>{DIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; }
+<INITIAL>\'.\' { sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; }
+<INITIAL>"0x"{XDIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; }
+<INITIAL>{DIGIT}+"."{DIGIT}* { strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; }
+<INITIAL>{DIGIT}+"%" { sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; }
+<INITIAL>"+=" { return PLUS_EQ; }
+<INITIAL>"*=" { return MUL_EQ; }
+<INITIAL>"-=" { return SUB_EQ; }
+<INITIAL>"/=" { return DIV_EQ; }
+<INITIAL>"<=" { return LOW_EQ; }
+<INITIAL>">=" { return SUP_EQ; }
+<INITIAL>"!=" { return NOT_EQ; }
+<INITIAL>"<>" { return NOT_EQ; }
+<INITIAL>[ \t]+ /* eat up whitespace */
+<INITIAL>. { yylval.charValue = *yytext; return *yytext; }
+
+%%
+
+
+int yywrap(void) { return 1; yyunput(0,0); }
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_private.h b/src/visualizations/Goom/goom2k4-0/src/goomsl_private.h
new file mode 100644
index 0000000000..8be151577d
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_private.h
@@ -0,0 +1,251 @@
+#ifndef _GSL_PRIVATE_H
+#define _GSL_PRIVATE_H
+
+/* -- internal use -- */
+
+#include "goomsl.h"
+
+#ifdef USE_JITC_X86
+#include "jitc_x86.h"
+#endif
+
+#include "goomsl_heap.h"
+
+/* {{{ type of nodes */
+#define EMPTY_NODE 0
+#define CONST_INT_NODE 1
+#define CONST_FLOAT_NODE 2
+#define CONST_PTR_NODE 3
+#define VAR_NODE 4
+#define PARAM_NODE 5
+#define READ_PARAM_NODE 6
+#define OPR_NODE 7
+/* }}} */
+/* {{{ type of operations */
+#define OPR_SET 1
+#define OPR_IF 2
+#define OPR_WHILE 3
+#define OPR_BLOCK 4
+#define OPR_ADD 5
+#define OPR_MUL 6
+#define OPR_EQU 7
+#define OPR_NOT 8
+#define OPR_LOW 9
+#define OPR_DIV 10
+#define OPR_SUB 11
+#define OPR_FUNC_INTRO 12
+#define OPR_FUNC_OUTRO 13
+#define OPR_CALL 14
+#define OPR_EXT_CALL 15
+#define OPR_PLUS_EQ 16
+#define OPR_SUB_EQ 17
+#define OPR_MUL_EQ 18
+#define OPR_DIV_EQ 19
+#define OPR_CALL_EXPR 20
+#define OPR_AFFECT_LIST 21
+#define OPR_FOREACH 22
+#define OPR_VAR_LIST 23
+
+/* }}} */
+
+typedef struct _ConstIntNodeType { /* {{{ */
+ int val;
+} ConstIntNodeType; /* }}} */
+typedef struct _ConstFloatNodeType { /* {{{ */
+ float val;
+} ConstFloatNodeType; /* }}} */
+typedef struct _ConstPtrNodeType { /* {{{ */
+ int id;
+} ConstPtrNodeType; /* }}} */
+typedef struct _OprNodeType { /* {{{ */
+ int type;
+ int nbOp;
+ struct _NODE_TYPE *op[3]; /* maximal number of operand needed */
+ struct _NODE_TYPE *next;
+} OprNodeType; /* }}} */
+typedef struct _NODE_TYPE { /* {{{ */
+ int type;
+ char *str;
+ GoomHash *vnamespace;
+ int line_number;
+ union {
+ ConstIntNodeType constInt;
+ ConstFloatNodeType constFloat;
+ ConstPtrNodeType constPtr;
+ OprNodeType opr;
+ } unode;
+} NodeType; /* }}} */
+typedef struct _INSTRUCTION_DATA { /* {{{ */
+
+ union {
+ void *var;
+ int *var_int;
+ int *var_ptr;
+ float *var_float;
+ int jump_offset;
+ struct _ExternalFunctionStruct *external_function;
+ } udest;
+
+ union {
+ void *var;
+ int *var_int;
+ int *var_ptr;
+ float *var_float;
+ int value_int;
+ int value_ptr;
+ float value_float;
+ } usrc;
+} InstructionData;
+/* }}} */
+typedef struct _INSTRUCTION { /* {{{ */
+
+ int id;
+ InstructionData data;
+ GoomSL *parent;
+ const char *name; /* name of the instruction */
+
+ char **params; /* parametres de l'instruction */
+ GoomHash **vnamespace;
+ int *types; /* type des parametres de l'instruction */
+ int cur_param;
+ int nb_param;
+
+ int address;
+ char *jump_label;
+ char *nop_label;
+
+ int line_number;
+
+} Instruction;
+/* }}} */
+typedef struct _INSTRUCTION_FLOW { /* {{{ */
+
+ Instruction **instr;
+ int number;
+ int tabsize;
+ GoomHash *labels;
+} InstructionFlow;
+/* }}} */
+typedef struct _FAST_INSTRUCTION { /* {{{ */
+ int id;
+ InstructionData data;
+ Instruction *proto;
+} FastInstruction;
+/* }}} */
+typedef struct _FastInstructionFlow { /* {{{ */
+ int number;
+ FastInstruction *instr;
+ void *mallocedInstr;
+} FastInstructionFlow;
+/* }}} */
+typedef struct _ExternalFunctionStruct { /* {{{ */
+ GoomSL_ExternalFunction function;
+ GoomHash *vars;
+ int is_extern;
+} ExternalFunctionStruct;
+/* }}} */
+typedef struct _Block {
+ int data;
+ int size;
+} Block;
+typedef struct _GSL_StructField { /* {{{ */
+ int type;
+ char name[256];
+ int offsetInStruct; /* Where this field is stored... */
+} GSL_StructField;
+ /* }}} */
+typedef struct _GSL_Struct { /* {{{ */
+ int nbFields;
+ GSL_StructField *fields[64];
+ int size;
+ Block iBlock[64];
+ Block fBlock[64];
+} GSL_Struct;
+ /* }}} */
+struct _GoomSL { /* {{{ */
+ int num_lines;
+ Instruction *instr; /* instruction en cours de construction */
+
+ InstructionFlow *iflow; /* flow d'instruction 'normal' */
+ FastInstructionFlow *fastiflow; /* flow d'instruction optimise */
+
+ GoomHash *vars; /* table de variables */
+ int currentNS;
+ GoomHash *namespaces[16];
+
+ GoomHash *functions; /* table des fonctions externes */
+
+ GoomHeap *data_heap; /* GSL Heap-like memory space */
+
+ int nbStructID;
+ GoomHash *structIDS;
+ GSL_Struct **gsl_struct;
+ int gsl_struct_size;
+
+ int nbPtr;
+ int ptrArraySize;
+ void **ptrArray;
+
+ int compilationOK;
+#ifdef USE_JITC_X86
+ JitcX86Env *jitc;
+ JitcFunc jitc_func;
+#endif
+}; /* }}} */
+
+extern GoomSL *currentGoomSL;
+
+Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number);
+void gsl_instr_add_param(Instruction *_this, char *param, int type);
+void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns);
+
+void gsl_declare_task(const char *name);
+void gsl_declare_external_task(const char *name);
+
+int gsl_type_of_var(GoomHash *namespace, const char *name);
+
+void gsl_enternamespace(const char *name);
+void gsl_reenternamespace(GoomHash *ns);
+GoomHash *gsl_leavenamespace(void);
+GoomHash *gsl_find_namespace(const char *name);
+
+void gsl_commit_compilation(void);
+
+/* #define TYPE_PARAM 1 */
+
+#define FIRST_RESERVED 0x80000
+
+#define TYPE_INTEGER 0x90001
+#define TYPE_FLOAT 0x90002
+#define TYPE_VAR 0x90003
+#define TYPE_PTR 0x90004
+#define TYPE_LABEL 0x90005
+
+#define TYPE_OP_EQUAL 6
+#define TYPE_IVAR 0xa0001
+#define TYPE_FVAR 0xa0002
+#define TYPE_PVAR 0xa0003
+#define TYPE_SVAR 0xa0004
+
+#define INSTR_JUMP 6
+#define INSTR_JZERO 29
+#define INSTR_CALL 36
+#define INSTR_RET 37
+#define INSTR_EXT_CALL 38
+#define INSTR_JNZERO 40
+
+#define INSTR_SET 0x80001
+#define INSTR_INT 0x80002
+#define INSTR_FLOAT 0x80003
+#define INSTR_PTR 0x80004
+#define INSTR_LABEL 0x80005
+#define INSTR_ISLOWER 0x80006
+#define INSTR_ADD 0x80007
+#define INSTR_MUL 0x80008
+#define INSTR_DIV 0x80009
+#define INSTR_SUB 0x80010
+#define INSTR_ISEQUAL 0x80011
+#define INSTR_NOT 0x80012
+
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.c b/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.c
new file mode 100644
index 0000000000..589b171beb
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.c
@@ -0,0 +1,2997 @@
+/* A Bison parser, made by GNU Bison 1.875. */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* Written by Richard Stallman by simplifying the original so called
+ ``semantic'' parser. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Using locations. */
+#define YYLSP_NEEDED 0
+
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ LTYPE_INTEGER = 258,
+ LTYPE_FLOAT = 259,
+ LTYPE_VAR = 260,
+ LTYPE_PTR = 261,
+ PTR_TK = 262,
+ INT_TK = 263,
+ FLOAT_TK = 264,
+ DECLARE = 265,
+ EXTERNAL = 266,
+ WHILE = 267,
+ DO = 268,
+ NOT = 269,
+ PLUS_EQ = 270,
+ SUB_EQ = 271,
+ DIV_EQ = 272,
+ MUL_EQ = 273,
+ SUP_EQ = 274,
+ LOW_EQ = 275,
+ NOT_EQ = 276,
+ STRUCT = 277,
+ FOR = 278,
+ IN = 279
+ };
+#endif
+#define LTYPE_INTEGER 258
+#define LTYPE_FLOAT 259
+#define LTYPE_VAR 260
+#define LTYPE_PTR 261
+#define PTR_TK 262
+#define INT_TK 263
+#define FLOAT_TK 264
+#define DECLARE 265
+#define EXTERNAL 266
+#define WHILE 267
+#define DO 268
+#define NOT 269
+#define PLUS_EQ 270
+#define SUB_EQ 271
+#define DIV_EQ 272
+#define MUL_EQ 273
+#define SUP_EQ 274
+#define LOW_EQ 275
+#define NOT_EQ 276
+#define STRUCT 277
+#define FOR 278
+#define IN 279
+
+
+
+
+/* Copy the first part of user declarations. */
+#line 6 "goomsl_yacc.y"
+
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "goomsl.h"
+ #include "goomsl_private.h"
+
+#define STRUCT_ALIGNMENT 16
+/* #define VERBOSE */
+
+ int yylex(void);
+ void yyerror(char *);
+ extern GoomSL *currentGoomSL;
+
+ static NodeType *nodeNew(const char *str, int type, int line_number);
+ static NodeType *nodeClone(NodeType *node);
+ static void nodeFreeInternals(NodeType *node);
+ static void nodeFree(NodeType *node);
+
+ static void commit_node(NodeType *node, int releaseIfTemp);
+ static void precommit_node(NodeType *node);
+
+ static NodeType *new_constInt(const char *str, int line_number);
+ static NodeType *new_constFloat(const char *str, int line_number);
+ static NodeType *new_constPtr(const char *str, int line_number);
+ static NodeType *new_var(const char *str, int line_number);
+ static NodeType *new_nop(const char *str);
+ static NodeType *new_op(const char *str, int type, int nbOp);
+
+ static int allocateLabel();
+ static int allocateTemp();
+ static void releaseTemp(int n);
+ static void releaseAllTemps();
+
+ static int is_tmp_expr(NodeType *node) {
+ if (node->str) {
+ return (!strncmp(node->str,"_i_tmp_",7))
+ || (!strncmp(node->str,"_f_tmp_",7))
+ || (!strncmp(node->str,"_p_tmp",7));
+ }
+ return 0;
+ }
+ /* pre: is_tmp_expr(node); */
+ static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); }
+
+ static int is_commutative_expr(int itype)
+ { /* {{{ */
+ return (itype == INSTR_ADD)
+ || (itype == INSTR_MUL)
+ || (itype == INSTR_ISEQUAL);
+ } /* }}} */
+
+ static void GSL_PUT_LABEL(char *name, int line_number)
+ { /* {{{ */
+#ifdef VERBOSE
+ printf("label %s\n", name);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number);
+ gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL);
+ } /* }}} */
+ static void GSL_PUT_JUMP(char *name, int line_number)
+ { /* {{{ */
+#ifdef VERBOSE
+ printf("jump %s\n", name);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number);
+ gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL);
+ } /* }}} */
+
+ static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number)
+ { /* {{{ */
+#ifdef VERBOSE
+ printf("%s %s\n", iname, name);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number);
+ gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL);
+ } /* }}} */
+ static void GSL_PUT_JZERO(char *name,int line_number)
+ { /* {{{ */
+ GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number);
+ } /* }}} */
+ static void GSL_PUT_JNZERO(char *name, int line_number)
+ { /* {{{ */
+ GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number);
+ } /* }}} */
+
+ /* Structures Management */
+
+#define ALIGN_ADDR(_addr,_align) {\
+ if (_align>1) {\
+ int _dec = (_addr%_align);\
+ if (_dec != 0) _addr += _align - _dec;\
+ }}
+
+ /* */
+ void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align)
+ {
+ int i;
+ int consumed = 0;
+ int iblk=0, fblk=0;
+
+ s->iBlock[0].size = 0;
+ s->iBlock[0].data = 0;
+ s->fBlock[0].size = 0;
+ s->fBlock[0].data = 0;
+
+ /* Prepare sub-struct and calculate space needed for their storage */
+ for (i = 0; i < s->nbFields; ++i)
+ {
+ if (s->fields[i]->type < FIRST_RESERVED)
+ {
+ int j=0;
+ GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type];
+ consumed += sizeof(int); /* stocke le prefix */
+ ALIGN_ADDR(consumed, s_align);
+ s->fields[i]->offsetInStruct = consumed;
+ gsl_prepare_struct(substruct, s_align, i_align, f_align);
+ for(j=0;substruct->iBlock[j].size>0;++j) {
+ s->iBlock[iblk].data = consumed + substruct->iBlock[j].data;
+ s->iBlock[iblk].size = substruct->iBlock[j].size;
+ iblk++;
+ }
+ for(j=0;substruct->fBlock[j].size>0;++j) {
+ s->fBlock[fblk].data = consumed + substruct->fBlock[j].data;
+ s->fBlock[fblk].size = substruct->fBlock[j].size;
+ fblk++;
+ }
+ consumed += substruct->size;
+ }
+ }
+
+ /* Then prepare integers */
+ ALIGN_ADDR(consumed, i_align);
+ for (i = 0; i < s->nbFields; ++i)
+ {
+ if (s->fields[i]->type == INSTR_INT)
+ {
+ if (s->iBlock[iblk].size == 0) {
+ s->iBlock[iblk].size = 1;
+ s->iBlock[iblk].data = consumed;
+ } else {
+ s->iBlock[iblk].size += 1;
+ }
+ s->fields[i]->offsetInStruct = consumed;
+ consumed += sizeof(int);
+ }
+ }
+
+ iblk++;
+ s->iBlock[iblk].size = 0;
+ s->iBlock[iblk].data = 0;
+
+ /* Then prepare floats */
+ ALIGN_ADDR(consumed, f_align);
+ for (i = 0; i < s->nbFields; ++i)
+ {
+ if (s->fields[i]->type == INSTR_FLOAT)
+ {
+ if (s->fBlock[fblk].size == 0) {
+ s->fBlock[fblk].size = 1;
+ s->fBlock[fblk].data = consumed;
+ } else {
+ s->fBlock[fblk].size += 1;
+ }
+ s->fields[i]->offsetInStruct = consumed;
+ consumed += sizeof(int);
+ }
+ }
+
+ fblk++;
+ s->fBlock[fblk].size = 0;
+ s->fBlock[fblk].data = 0;
+
+ /* Finally prepare pointers */
+ ALIGN_ADDR(consumed, i_align);
+ for (i = 0; i < s->nbFields; ++i)
+ {
+ if (s->fields[i]->type == INSTR_PTR)
+ {
+ s->fields[i]->offsetInStruct = consumed;
+ consumed += sizeof(int);
+ }
+ }
+ s->size = consumed;
+ }
+
+ /* Returns the ID of a struct from its name */
+ int gsl_get_struct_id(const char *name) /* {{{ */
+ {
+ HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name);
+ if (ret != NULL) return ret->i;
+ return -1;
+ } /* }}} */
+
+ /* Adds the definition of a struct */
+ void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */
+ {
+ /* Prepare the struct: ie calculate internal storage format */
+ gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT);
+
+ /* If the struct does not already exists */
+ if (gsl_get_struct_id(name) < 0)
+ {
+ /* adds it */
+ int id = currentGoomSL->nbStructID++;
+ goom_hash_put_int(currentGoomSL->structIDS, name, id);
+ if (currentGoomSL->gsl_struct_size <= id) {
+ currentGoomSL->gsl_struct_size *= 2;
+ currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct,
+ sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size);
+ }
+ currentGoomSL->gsl_struct[id] = gsl_struct;
+ }
+ } /* }}} */
+
+ /* Creates a field for a struct */
+ GSL_StructField *gsl_new_struct_field(const char *name, int type)
+ {
+ GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField));
+ strcpy(field->name, name);
+ field->type = type;
+ return field;
+ }
+
+ /* Create as field for a struct which will be a struct itself */
+ GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type)
+ {
+ GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type));
+ if (field->type < 0) {
+ fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n",
+ currentGoomSL->num_lines, type);
+ exit(1);
+ }
+ return field;
+ }
+
+ /* Creates a Struct */
+ GSL_Struct *gsl_new_struct(GSL_StructField *field)
+ {
+ GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct));
+ s->nbFields = 1;
+ s->fields[0] = field;
+ return s;
+ }
+
+ /* Adds a field to a struct */
+ void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field)
+ {
+ s->fields[s->nbFields++] = field;
+ }
+
+ int gsl_type_of_var(GoomHash *ns, const char *name)
+ {
+ char type_of[256];
+ HashValue *hv;
+ sprintf(type_of, "__type_of_%s", name);
+ hv = goom_hash_get(ns, type_of);
+ if (hv != NULL)
+ return hv->i;
+ fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name);
+ return -1;
+ }
+
+ static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space)
+ {
+ char type_of[256];
+ if (name[0] == '@') { ns = currentGoomSL->vars; }
+
+ if (space == NULL) {
+ switch (type) {
+ case INSTR_INT:
+ case INSTR_FLOAT:
+ case INSTR_PTR:
+ space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap,
+ sizeof(int), sizeof(int));
+ break;
+ case -1:
+ fprintf(stderr, "What the fuck!\n");
+ exit(1);
+ default: /* On a un struct_id */
+ space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap,
+ currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int));
+ }
+ }
+ goom_hash_put_ptr(ns, name, (void*)space);
+ sprintf(type_of, "__type_of_%s", name);
+ goom_hash_put_int(ns, type_of, type);
+
+ /* Ensuite le hack: on ajoute les champs en tant que variables. */
+ if (type < FIRST_RESERVED)
+ {
+ int i;
+ GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type];
+ ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */
+ for (i = 0; i < gsl_struct->nbFields; ++i)
+ {
+ char full_name[256];
+ char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct;
+ sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name);
+ gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace);
+ }
+ }
+ }
+
+ /* Declare a variable which will be a struct */
+ static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name)
+ {
+ int struct_id = gsl_get_struct_id(struct_name);
+ gsl_declare_var(namespace, name, struct_id, NULL);
+ }
+
+ static void gsl_float_decl_global(const char *name)
+ {
+ gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL);
+ }
+ static void gsl_int_decl_global(const char *name)
+ {
+ gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL);
+ }
+ static void gsl_ptr_decl_global(const char *name)
+ {
+ gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL);
+ }
+ static void gsl_struct_decl_global_from_id(const char *name, int id)
+ {
+ gsl_declare_var(currentGoomSL->vars, name, id, NULL);
+ }
+
+ /* FLOAT */
+ static void gsl_float_decl_local(const char *name)
+ {
+ gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL);
+ }
+ /* INT */
+ static void gsl_int_decl_local(const char *name)
+ {
+ gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL);
+ }
+ /* PTR */
+ static void gsl_ptr_decl_local(const char *name)
+ {
+ gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL);
+ }
+ /* STRUCT */
+ static void gsl_struct_decl_local(const char *struct_name, const char *name)
+ {
+ gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name);
+ }
+
+
+ static void commit_test2(NodeType *set,const char *type, int instr);
+ static NodeType *new_call(const char *name, NodeType *affect_list);
+
+ /* SETTER */
+ static NodeType *new_set(NodeType *lvalue, NodeType *expression)
+ { /* {{{ */
+ NodeType *set = new_op("set", OPR_SET, 2);
+ set->unode.opr.op[0] = lvalue;
+ set->unode.opr.op[1] = expression;
+ return set;
+ } /* }}} */
+ static void commit_set(NodeType *set)
+ { /* {{{ */
+ commit_test2(set,"set",INSTR_SET);
+ } /* }}} */
+
+ /* PLUS_EQ */
+ static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+ {
+ NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2);
+ set->unode.opr.op[0] = lvalue;
+ set->unode.opr.op[1] = expression;
+ return set;
+ }
+ static void commit_plus_eq(NodeType *set)
+ {
+ precommit_node(set->unode.opr.op[1]);
+#ifdef VERBOSE
+ printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number);
+ commit_node(set->unode.opr.op[0],0);
+ commit_node(set->unode.opr.op[1],1);
+ } /* }}} */
+
+ /* SUB_EQ */
+ static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+ {
+ NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2);
+ set->unode.opr.op[0] = lvalue;
+ set->unode.opr.op[1] = expression;
+ return set;
+ }
+ static void commit_sub_eq(NodeType *set)
+ {
+ precommit_node(set->unode.opr.op[1]);
+#ifdef VERBOSE
+ printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number);
+ commit_node(set->unode.opr.op[0],0);
+ commit_node(set->unode.opr.op[1],1);
+ } /* }}} */
+
+ /* MUL_EQ */
+ static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+ {
+ NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2);
+ set->unode.opr.op[0] = lvalue;
+ set->unode.opr.op[1] = expression;
+ return set;
+ }
+ static void commit_mul_eq(NodeType *set)
+ {
+ precommit_node(set->unode.opr.op[1]);
+#ifdef VERBOSE
+ printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number);
+ commit_node(set->unode.opr.op[0],0);
+ commit_node(set->unode.opr.op[1],1);
+ } /* }}} */
+
+ /* DIV_EQ */
+ static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+ {
+ NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2);
+ set->unode.opr.op[0] = lvalue;
+ set->unode.opr.op[1] = expression;
+ return set;
+ }
+ static void commit_div_eq(NodeType *set)
+ {
+ precommit_node(set->unode.opr.op[1]);
+#ifdef VERBOSE
+ printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number);
+ commit_node(set->unode.opr.op[0],0);
+ commit_node(set->unode.opr.op[1],1);
+ } /* }}} */
+
+ /* commodity method for add, mult, ... */
+
+ static void precommit_expr(NodeType *expr, const char *type, int instr_id)
+ { /* {{{ */
+ NodeType *tmp, *tmpcpy;
+ int toAdd;
+
+ /* compute "left" and "right" */
+ switch (expr->unode.opr.nbOp) {
+ case 2:
+ precommit_node(expr->unode.opr.op[1]);
+ case 1:
+ precommit_node(expr->unode.opr.op[0]);
+ }
+
+ if (is_tmp_expr(expr->unode.opr.op[0])) {
+ tmp = expr->unode.opr.op[0];
+ toAdd = 1;
+ }
+ else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) {
+ tmp = expr->unode.opr.op[1];
+ toAdd = 0;
+ }
+ else {
+ char stmp[256];
+ /* declare a temporary variable to store the result */
+ if (expr->unode.opr.op[0]->type == CONST_INT_NODE) {
+ sprintf(stmp,"_i_tmp_%i",allocateTemp());
+ gsl_int_decl_global(stmp);
+ }
+ else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) {
+ sprintf(stmp,"_f_tmp%i",allocateTemp());
+ gsl_float_decl_global(stmp);
+ }
+ else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) {
+ sprintf(stmp,"_p_tmp%i",allocateTemp());
+ gsl_ptr_decl_global(stmp);
+ }
+ else {
+ int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str);
+ if (type == INSTR_FLOAT) {
+ sprintf(stmp,"_f_tmp_%i",allocateTemp());
+ gsl_float_decl_global(stmp);
+ }
+ else if (type == INSTR_PTR) {
+ sprintf(stmp,"_p_tmp_%i",allocateTemp());
+ gsl_ptr_decl_global(stmp);
+ }
+ else if (type == INSTR_INT) {
+ sprintf(stmp,"_i_tmp_%i",allocateTemp());
+ gsl_int_decl_global(stmp);
+ }
+ else if (type == -1) {
+ fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n",
+ expr->line_number, expr->unode.opr.op[0]->str);
+ exit(1);
+ }
+ else { /* type is a struct_id */
+ sprintf(stmp,"_s_tmp_%i",allocateTemp());
+ gsl_struct_decl_global_from_id(stmp,type);
+ }
+ }
+ tmp = new_var(stmp,expr->line_number);
+
+ /* set the tmp to the value of "op1" */
+ tmpcpy = nodeClone(tmp);
+ commit_node(new_set(tmp,expr->unode.opr.op[0]),0);
+ toAdd = 1;
+
+ tmp = tmpcpy;
+ }
+
+ /* add op2 to tmp */
+#ifdef VERBOSE
+ if (expr->unode.opr.nbOp == 2)
+ printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str);
+ else
+ printf("%s %s\n", type, tmp->str);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number);
+ tmpcpy = nodeClone(tmp);
+ commit_node(tmp,0);
+ if (expr->unode.opr.nbOp == 2) {
+ commit_node(expr->unode.opr.op[toAdd],1);
+ }
+
+ /* redefine the ADD node now as the computed variable */
+ nodeFreeInternals(expr);
+ *expr = *tmpcpy;
+ free(tmpcpy);
+ } /* }}} */
+
+ static NodeType *new_expr1(const char *name, int id, NodeType *expr1)
+ { /* {{{ */
+ NodeType *add = new_op(name, id, 1);
+ add->unode.opr.op[0] = expr1;
+ return add;
+ } /* }}} */
+
+ static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2)
+ { /* {{{ */
+ NodeType *add = new_op(name, id, 2);
+ add->unode.opr.op[0] = expr1;
+ add->unode.opr.op[1] = expr2;
+ return add;
+ } /* }}} */
+
+ /* ADD */
+ static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */
+ return new_expr2("add", OPR_ADD, expr1, expr2);
+ }
+ static void precommit_add(NodeType *add) {
+ precommit_expr(add,"add",INSTR_ADD);
+ } /* }}} */
+
+ /* SUB */
+ static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */
+ return new_expr2("sub", OPR_SUB, expr1, expr2);
+ }
+ static void precommit_sub(NodeType *sub) {
+ precommit_expr(sub,"sub",INSTR_SUB);
+ } /* }}} */
+
+ /* NEG */
+ static NodeType *new_neg(NodeType *expr) { /* {{{ */
+ NodeType *zeroConst = NULL;
+ if (expr->type == CONST_INT_NODE)
+ zeroConst = new_constInt("0", currentGoomSL->num_lines);
+ else if (expr->type == CONST_FLOAT_NODE)
+ zeroConst = new_constFloat("0.0", currentGoomSL->num_lines);
+ else if (expr->type == CONST_PTR_NODE) {
+ fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n",
+ currentGoomSL->num_lines);
+ exit(1);
+ }
+ else {
+ int type = gsl_type_of_var(expr->vnamespace, expr->str);
+ if (type == INSTR_FLOAT)
+ zeroConst = new_constFloat("0.0", currentGoomSL->num_lines);
+ else if (type == INSTR_PTR) {
+ fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n",
+ currentGoomSL->num_lines);
+ exit(1);
+ }
+ else if (type == INSTR_INT)
+ zeroConst = new_constInt("0", currentGoomSL->num_lines);
+ else if (type == -1) {
+ fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n",
+ expr->line_number, expr->unode.opr.op[0]->str);
+ exit(1);
+ }
+ else { /* type is a struct_id */
+ fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n",
+ expr->line_number, expr->str);
+ exit(1);
+ }
+ }
+ return new_expr2("sub", OPR_SUB, zeroConst, expr);
+ }
+ /* }}} */
+
+ /* MUL */
+ static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */
+ return new_expr2("mul", OPR_MUL, expr1, expr2);
+ }
+ static void precommit_mul(NodeType *mul) {
+ precommit_expr(mul,"mul",INSTR_MUL);
+ } /* }}} */
+
+ /* DIV */
+ static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */
+ return new_expr2("div", OPR_DIV, expr1, expr2);
+ }
+ static void precommit_div(NodeType *mul) {
+ precommit_expr(mul,"div",INSTR_DIV);
+ } /* }}} */
+
+ /* CALL EXPRESSION */
+ static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */
+ NodeType *call = new_call(name,affect_list);
+ NodeType *node = new_expr1(name, OPR_CALL_EXPR, call);
+ node->vnamespace = gsl_find_namespace(name);
+ if (node->vnamespace == NULL)
+ fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name);
+ return node;
+ }
+ static void precommit_call_expr(NodeType *call) {
+ char stmp[256];
+ NodeType *tmp,*tmpcpy;
+ int type = gsl_type_of_var(call->vnamespace, call->str);
+ if (type == INSTR_FLOAT) {
+ sprintf(stmp,"_f_tmp_%i",allocateTemp());
+ gsl_float_decl_global(stmp);
+ }
+ else if (type == INSTR_PTR) {
+ sprintf(stmp,"_p_tmp_%i",allocateTemp());
+ gsl_ptr_decl_global(stmp);
+ }
+ else if (type == INSTR_INT) {
+ sprintf(stmp,"_i_tmp_%i",allocateTemp());
+ gsl_int_decl_global(stmp);
+ }
+ else if (type == -1) {
+ fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n",
+ call->line_number, call->str);
+ exit(1);
+ }
+ else { /* type is a struct_id */
+ sprintf(stmp,"_s_tmp_%i",allocateTemp());
+ gsl_struct_decl_global_from_id(stmp,type);
+ }
+ tmp = new_var(stmp,call->line_number);
+ commit_node(call->unode.opr.op[0],0);
+ tmpcpy = nodeClone(tmp);
+ commit_node(new_set(tmp,new_var(call->str,call->line_number)),0);
+
+ nodeFreeInternals(call);
+ *call = *tmpcpy;
+ free(tmpcpy);
+ } /* }}} */
+
+ static void commit_test2(NodeType *set,const char *type, int instr)
+ { /* {{{ */
+ NodeType *tmp;
+ char stmp[256];
+ precommit_node(set->unode.opr.op[0]);
+ precommit_node(set->unode.opr.op[1]);
+ tmp = set->unode.opr.op[0];
+
+ stmp[0] = 0;
+ if (set->unode.opr.op[0]->type == CONST_INT_NODE) {
+ sprintf(stmp,"_i_tmp_%i",allocateTemp());
+ gsl_int_decl_global(stmp);
+ }
+ else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) {
+ sprintf(stmp,"_f_tmp%i",allocateTemp());
+ gsl_float_decl_global(stmp);
+ }
+ else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) {
+ sprintf(stmp,"_p_tmp%i",allocateTemp());
+ gsl_ptr_decl_global(stmp);
+ }
+ if (stmp[0]) {
+ NodeType *tmpcpy;
+ tmp = new_var(stmp, set->line_number);
+ tmpcpy = nodeClone(tmp);
+ commit_node(new_set(tmp,set->unode.opr.op[0]),0);
+ tmp = tmpcpy;
+ }
+
+#ifdef VERBOSE
+ printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number);
+ commit_node(tmp,instr!=INSTR_SET);
+ commit_node(set->unode.opr.op[1],1);
+ } /* }}} */
+
+ /* NOT */
+ static NodeType *new_not(NodeType *expr1) { /* {{{ */
+ return new_expr1("not", OPR_NOT, expr1);
+ }
+ static void commit_not(NodeType *set)
+ {
+ commit_node(set->unode.opr.op[0],0);
+#ifdef VERBOSE
+ printf("not\n");
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL);
+ } /* }}} */
+
+ /* EQU */
+ static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */
+ return new_expr2("isequal", OPR_EQU, expr1, expr2);
+ }
+ static void commit_equ(NodeType *mul) {
+ commit_test2(mul,"isequal",INSTR_ISEQUAL);
+ } /* }}} */
+
+ /* INF */
+ static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */
+ return new_expr2("islower", OPR_LOW, expr1, expr2);
+ }
+ static void commit_low(NodeType *mul) {
+ commit_test2(mul,"islower",INSTR_ISLOWER);
+ } /* }}} */
+
+ /* WHILE */
+ static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */
+ NodeType *node = new_op("while", OPR_WHILE, 2);
+ node->unode.opr.op[0] = expression;
+ node->unode.opr.op[1] = instr;
+ return node;
+ }
+
+ static void commit_while(NodeType *node)
+ {
+ int lbl = allocateLabel();
+ char start_while[1024], test_while[1024];
+ sprintf(start_while, "|start_while_%d|", lbl);
+ sprintf(test_while, "|test_while_%d|", lbl);
+
+ GSL_PUT_JUMP(test_while,node->line_number);
+ GSL_PUT_LABEL(start_while,node->line_number);
+
+ /* code */
+ commit_node(node->unode.opr.op[1],0);
+
+ GSL_PUT_LABEL(test_while,node->line_number);
+ commit_node(node->unode.opr.op[0],0);
+ GSL_PUT_JNZERO(start_while,node->line_number);
+ } /* }}} */
+
+ /* FOR EACH */
+ static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */
+ NodeType *node = new_op("for", OPR_FOREACH, 3);
+ node->unode.opr.op[0] = var;
+ node->unode.opr.op[1] = var_list;
+ node->unode.opr.op[2] = instr;
+ node->line_number = currentGoomSL->num_lines;
+ return node;
+ }
+ static void commit_foreach(NodeType *node)
+ {
+ NodeType *cur = node->unode.opr.op[1];
+ char tmp_func[256], tmp_loop[256];
+ int lbl = allocateLabel();
+ sprintf(tmp_func, "|foreach_func_%d|", lbl);
+ sprintf(tmp_loop, "|foreach_loop_%d|", lbl);
+
+ GSL_PUT_JUMP(tmp_loop, node->line_number);
+ GSL_PUT_LABEL(tmp_func, node->line_number);
+
+ precommit_node(node->unode.opr.op[2]);
+ commit_node(node->unode.opr.op[2], 0);
+
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL);
+#ifdef VERBOSE
+ printf("ret\n");
+#endif
+
+ GSL_PUT_LABEL(tmp_loop, node->line_number);
+
+ while (cur != NULL)
+ {
+ NodeType *x, *var;
+
+ /* 1: x=var */
+ x = nodeClone(node->unode.opr.op[0]);
+ var = nodeClone(cur->unode.opr.op[0]);
+ commit_node(new_set(x, var),0);
+
+ /* 2: instr */
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL);
+#ifdef VERBOSE
+ printf("call %s\n", tmp_func);
+#endif
+
+ /* 3: var=x */
+ x = nodeClone(node->unode.opr.op[0]);
+ var = cur->unode.opr.op[0];
+ commit_node(new_set(var, x),0);
+ cur = cur->unode.opr.op[1];
+ }
+ nodeFree(node->unode.opr.op[0]);
+ } /* }}} */
+
+ /* IF */
+ static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */
+ NodeType *node = new_op("if", OPR_IF, 2);
+ node->unode.opr.op[0] = expression;
+ node->unode.opr.op[1] = instr;
+ return node;
+ }
+ static void commit_if(NodeType *node) {
+
+ char slab[1024];
+ sprintf(slab, "|eif%d|", allocateLabel());
+ commit_node(node->unode.opr.op[0],0);
+ GSL_PUT_JZERO(slab,node->line_number);
+ /* code */
+ commit_node(node->unode.opr.op[1],0);
+ GSL_PUT_LABEL(slab,node->line_number);
+ } /* }}} */
+
+ /* BLOCK */
+ static NodeType *new_block(NodeType *lastNode) { /* {{{ */
+ NodeType *blk = new_op("block", OPR_BLOCK, 2);
+ blk->unode.opr.op[0] = new_nop("start_of_block");
+ blk->unode.opr.op[1] = lastNode;
+ return blk;
+ }
+ static void commit_block(NodeType *node) {
+ commit_node(node->unode.opr.op[0]->unode.opr.next,0);
+ } /* }}} */
+
+ /* FUNCTION INTRO */
+ static NodeType *new_function_intro(const char *name) { /* {{{ */
+ char stmp[256];
+ if (strlen(name) < 200) {
+ sprintf(stmp, "|__func_%s|", name);
+ }
+ return new_op(stmp, OPR_FUNC_INTRO, 0);
+ }
+ static void commit_function_intro(NodeType *node) {
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL);
+#ifdef VERBOSE
+ printf("label %s\n", node->str);
+#endif
+ } /* }}} */
+
+ /* FUNCTION OUTRO */
+ static NodeType *new_function_outro() { /* {{{ */
+ return new_op("ret", OPR_FUNC_OUTRO, 0);
+ }
+ static void commit_function_outro(NodeType *node) {
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL);
+ releaseAllTemps();
+#ifdef VERBOSE
+ printf("ret\n");
+#endif
+ } /* }}} */
+
+ /* AFFECTATION LIST */
+ static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */
+ {
+ NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2);
+ node->unode.opr.op[0] = set;
+ node->unode.opr.op[1] = next;
+ return node;
+ }
+ static NodeType *new_affect_list_after(NodeType *affect_list)
+ {
+ NodeType *ret = NULL;
+ NodeType *cur = affect_list;
+ while(cur != NULL) {
+ NodeType *set = cur->unode.opr.op[0];
+ NodeType *next = cur->unode.opr.op[1];
+ NodeType *lvalue = set->unode.opr.op[0];
+ NodeType *expression = set->unode.opr.op[1];
+ if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) {
+ NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue));
+ ret = new_affec_list(nset, ret);
+ }
+ cur = next;
+ }
+ return ret;
+ }
+ static void commit_affect_list(NodeType *node)
+ {
+ NodeType *cur = node;
+ while(cur != NULL) {
+ NodeType *set = cur->unode.opr.op[0];
+ precommit_node(set->unode.opr.op[0]);
+ precommit_node(set->unode.opr.op[1]);
+ cur = cur->unode.opr.op[1];
+ }
+ cur = node;
+ while(cur != NULL) {
+ NodeType *set = cur->unode.opr.op[0];
+ commit_node(set,0);
+ cur = cur->unode.opr.op[1];
+ }
+ } /* }}} */
+
+ /* VAR LIST */
+ static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */
+ {
+ NodeType *node = new_op("var_list", OPR_VAR_LIST, 2);
+ node->unode.opr.op[0] = var;
+ node->unode.opr.op[1] = next;
+ return node;
+ }
+ static void commit_var_list(NodeType *node)
+ {
+ } /* }}} */
+
+ /* FUNCTION CALL */
+ static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */
+ HashValue *fval;
+ fval = goom_hash_get(currentGoomSL->functions, name);
+ if (!fval) {
+ gsl_declare_task(name);
+ fval = goom_hash_get(currentGoomSL->functions, name);
+ }
+ if (!fval) {
+ fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name);
+ exit(1);
+ return NULL;
+ }
+ else {
+ ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr;
+ if (gef->is_extern) {
+ NodeType *node = new_op(name, OPR_EXT_CALL, 1);
+ node->unode.opr.op[0] = affect_list;
+ return node;
+ }
+ else {
+ NodeType *node;
+ char stmp[256];
+ if (strlen(name) < 200) {
+ sprintf(stmp, "|__func_%s|", name);
+ }
+ node = new_op(stmp, OPR_CALL, 1);
+ node->unode.opr.op[0] = affect_list;
+ return node;
+ }
+ }
+ }
+ static void commit_ext_call(NodeType *node) {
+ NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]);
+ commit_node(node->unode.opr.op[0],0);
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR);
+#ifdef VERBOSE
+ printf("extcall %s\n", node->str);
+#endif
+ commit_node(alafter,0);
+ }
+ static void commit_call(NodeType *node) {
+ NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]);
+ commit_node(node->unode.opr.op[0],0);
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL);
+#ifdef VERBOSE
+ printf("call %s\n", node->str);
+#endif
+ commit_node(alafter,0);
+ } /* }}} */
+
+ /** **/
+
+ static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */
+ static NodeType *lastNode = 0;
+ static NodeType *gsl_append(NodeType *curNode) {
+ if (curNode == 0) return 0; /* {{{ */
+ if (lastNode)
+ lastNode->unode.opr.next = curNode;
+ lastNode = curNode;
+ while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next;
+ if (rootNode == 0)
+ rootNode = curNode;
+ return curNode;
+ } /* }}} */
+
+#if 1
+ int allocateTemp() {
+ return allocateLabel();
+ }
+ void releaseAllTemps() {}
+ void releaseTemp(int n) {}
+#else
+ static int nbTemp = 0;
+ static int *tempArray = 0;
+ static int tempArraySize = 0;
+ int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */
+ int i = 0; /* {{{ */
+ if (tempArray == 0) {
+ tempArraySize = 256;
+ tempArray = (int*)malloc(tempArraySize * sizeof(int));
+ }
+ while (1) {
+ int j;
+ for (j=0;j<nbTemp;++j) {
+ if (tempArray[j] == i) break;
+ }
+ if (j == nbTemp) {
+ if (nbTemp == tempArraySize) {
+ tempArraySize *= 2;
+ tempArray = (int*)realloc(tempArray,tempArraySize * sizeof(int));
+ }
+ tempArray[nbTemp++] = i;
+ return i;
+ }
+ i++;
+ }
+ } /* }}} */
+ void releaseAllTemps() {
+ nbTemp = 0; /* {{{ */
+ } /* }}} */
+ void releaseTemp(int n) {
+ int j; /* {{{ */
+ for (j=0;j<nbTemp;++j) {
+ if (tempArray[j] == n) {
+ tempArray[j] = tempArray[--nbTemp];
+ break;
+ }
+ }
+ } /* }}} */
+#endif
+
+ static int lastLabel = 0;
+ int allocateLabel() {
+ return ++lastLabel; /* {{{ */
+ } /* }}} */
+
+ void gsl_commit_compilation()
+ { /* {{{ */
+ commit_node(rootNode,0);
+ rootNode = 0;
+ lastNode = 0;
+ } /* }}} */
+
+ void precommit_node(NodeType *node)
+ { /* {{{ */
+ /* do here stuff for expression.. for exemple */
+ if (node->type == OPR_NODE)
+ switch(node->unode.opr.type) {
+ case OPR_ADD: precommit_add(node); break;
+ case OPR_SUB: precommit_sub(node); break;
+ case OPR_MUL: precommit_mul(node); break;
+ case OPR_DIV: precommit_div(node); break;
+ case OPR_CALL_EXPR: precommit_call_expr(node); break;
+ }
+ } /* }}} */
+
+ void commit_node(NodeType *node, int releaseIfTmp)
+ { /* {{{ */
+ if (node == 0) return;
+
+ switch(node->type) {
+ case OPR_NODE:
+ switch(node->unode.opr.type) {
+ case OPR_SET: commit_set(node); break;
+ case OPR_PLUS_EQ: commit_plus_eq(node); break;
+ case OPR_SUB_EQ: commit_sub_eq(node); break;
+ case OPR_MUL_EQ: commit_mul_eq(node); break;
+ case OPR_DIV_EQ: commit_div_eq(node); break;
+ case OPR_IF: commit_if(node); break;
+ case OPR_WHILE: commit_while(node); break;
+ case OPR_BLOCK: commit_block(node); break;
+ case OPR_FUNC_INTRO: commit_function_intro(node); break;
+ case OPR_FUNC_OUTRO: commit_function_outro(node); break;
+ case OPR_CALL: commit_call(node); break;
+ case OPR_EXT_CALL: commit_ext_call(node); break;
+ case OPR_EQU: commit_equ(node); break;
+ case OPR_LOW: commit_low(node); break;
+ case OPR_NOT: commit_not(node); break;
+ case OPR_AFFECT_LIST: commit_affect_list(node); break;
+ case OPR_FOREACH: commit_foreach(node); break;
+ case OPR_VAR_LIST: commit_var_list(node); break;
+#ifdef VERBOSE
+ case EMPTY_NODE: printf("NOP\n"); break;
+#endif
+ }
+
+ commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */
+ break;
+
+ case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace);
+ gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break;
+ case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break;
+ case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break;
+ case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break;
+ }
+ if (releaseIfTmp && is_tmp_expr(node))
+ releaseTemp(get_tmp_id(node));
+
+ nodeFree(node);
+ } /* }}} */
+
+ NodeType *nodeNew(const char *str, int type, int line_number) {
+ NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */
+ node->type = type;
+ node->str = (char*)malloc(strlen(str)+1);
+ node->vnamespace = NULL;
+ node->line_number = line_number;
+ strcpy(node->str, str);
+ return node;
+ } /* }}} */
+ static NodeType *nodeClone(NodeType *node) {
+ NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */
+ ret->vnamespace = node->vnamespace;
+ ret->unode = node->unode;
+ return ret;
+ } /* }}} */
+
+ void nodeFreeInternals(NodeType *node) {
+ free(node->str); /* {{{ */
+ } /* }}} */
+
+ void nodeFree(NodeType *node) {
+ nodeFreeInternals(node); /* {{{ */
+ free(node);
+ } /* }}} */
+
+ NodeType *new_constInt(const char *str, int line_number) {
+ NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */
+ node->unode.constInt.val = atoi(str);
+ return node;
+ } /* }}} */
+
+ NodeType *new_constPtr(const char *str, int line_number) {
+ NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */
+ node->unode.constPtr.id = strtol(str,NULL,0);
+ return node;
+ } /* }}} */
+
+ NodeType *new_constFloat(const char *str, int line_number) {
+ NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */
+ node->unode.constFloat.val = atof(str);
+ return node;
+ } /* }}} */
+
+ NodeType *new_var(const char *str, int line_number) {
+ NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */
+ node->vnamespace = gsl_find_namespace(str);
+ if (node->vnamespace == 0) {
+ fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str);
+ exit(1);
+ }
+ return node;
+ } /* }}} */
+
+ NodeType *new_nop(const char *str) {
+ NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */
+ return node;
+ } /* }}} */
+
+ NodeType *new_op(const char *str, int type, int nbOp) {
+ int i; /* {{{ */
+ NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines);
+ node->unode.opr.next = 0;
+ node->unode.opr.type = type;
+ node->unode.opr.nbOp = nbOp;
+ for (i=0;i<nbOp;++i) node->unode.opr.op[i] = 0;
+ return node;
+ } /* }}} */
+
+
+ void gsl_declare_global_variable(int type, char *name) {
+ switch(type){
+ case -1: break;
+ case FLOAT_TK:gsl_float_decl_global(name);break;
+ case INT_TK: gsl_int_decl_global(name);break;
+ case PTR_TK: gsl_ptr_decl_global(name);break;
+ default:
+ {
+ int id = type - 1000;
+ gsl_struct_decl_global_from_id(name,id);
+ }
+ }
+ }
+
+
+
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 1199 "goomsl_yacc.y"
+typedef union YYSTYPE {
+ int intValue;
+ float floatValue;
+ char charValue;
+ char strValue[2048];
+ NodeType *nPtr;
+ GoomHash *namespace;
+ GSL_Struct *gsl_struct;
+ GSL_StructField *gsl_struct_field;
+ } YYSTYPE;
+/* Line 191 of yacc.c. */
+#line 1327 "goomsl_yacc.c"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations. */
+
+
+/* Line 214 of yacc.c. */
+#line 1339 "goomsl_yacc.c"
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# if YYSTACK_USE_ALLOCA
+# define YYSTACK_ALLOC alloca
+# else
+# ifndef YYSTACK_USE_ALLOCA
+# if defined (alloca) || defined (_ALLOCA_H)
+# define YYSTACK_ALLOC alloca
+# else
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+# define YYSTACK_ALLOC malloc
+# define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+ && (! defined (__cplusplus) \
+ || (YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ short yyss;
+ YYSTYPE yyvs;
+ };
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if 1 < __GNUC__
+# define YYCOPY(To, From, Count) \
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+# else
+# define YYCOPY(To, From, Count) \
+ do \
+ { \
+ register YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (To)[yyi] = (From)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack, Stack, yysize); \
+ Stack = &yyptr->Stack; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+ typedef signed char yysigned_char;
+#else
+ typedef short yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 3
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 229
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 42
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 30
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 89
+/* YYNRULES -- Number of states. */
+#define YYNSTATES 217
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 279
+
+#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+static const unsigned char yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 25, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 35, 36, 32, 29, 34, 30, 2, 31, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 33, 2,
+ 27, 26, 28, 37, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 40, 2, 41, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 38, 2, 39, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+static const unsigned short yyprhs[] =
+{
+ 0, 0, 3, 7, 10, 19, 30, 39, 50, 53,
+ 56, 57, 65, 68, 73, 76, 79, 82, 85, 87,
+ 89, 90, 93, 96, 99, 102, 104, 108, 111, 112,
+ 116, 122, 130, 131, 132, 137, 142, 147, 152, 154,
+ 157, 160, 163, 166, 169, 172, 179, 186, 193, 195,
+ 199, 203, 207, 211, 218, 222, 224, 227, 231, 232,
+ 234, 236, 240, 244, 248, 252, 255, 259, 261, 265,
+ 269, 273, 277, 281, 285, 288, 290, 292, 294, 298,
+ 304, 310, 318, 323, 330, 333, 335, 340, 344, 346
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+ 43, 0, -1, 44, 55, 52, -1, 44, 59, -1,
+ 44, 11, 27, 48, 28, 50, 25, 56, -1, 44,
+ 11, 27, 48, 33, 51, 28, 50, 25, 56, -1,
+ 44, 10, 27, 49, 28, 50, 25, 56, -1, 44,
+ 10, 27, 49, 33, 51, 28, 50, 25, 56, -1,
+ 44, 45, -1, 44, 25, -1, -1, 22, 27, 5,
+ 33, 46, 28, 25, -1, 71, 47, -1, 46, 34,
+ 71, 47, -1, 8, 5, -1, 9, 5, -1, 7,
+ 5, -1, 5, 5, -1, 5, -1, 5, -1, -1,
+ 33, 8, -1, 33, 9, -1, 33, 7, -1, 33,
+ 5, -1, 58, -1, 58, 34, 51, -1, 52, 53,
+ -1, -1, 54, 44, 55, -1, 27, 49, 28, 50,
+ 25, -1, 27, 49, 33, 51, 28, 50, 25, -1,
+ -1, -1, 9, 5, 26, 64, -1, 8, 5, 26,
+ 64, -1, 7, 5, 26, 64, -1, 5, 5, 26,
+ 64, -1, 58, -1, 9, 5, -1, 8, 5, -1,
+ 7, 5, -1, 5, 5, -1, 62, 25, -1, 57,
+ 25, -1, 35, 65, 36, 37, 71, 59, -1, 12,
+ 65, 71, 13, 71, 59, -1, 38, 25, 63, 44,
+ 39, 25, -1, 67, -1, 5, 15, 64, -1, 5,
+ 16, 64, -1, 5, 18, 64, -1, 5, 17, 64,
+ -1, 23, 5, 24, 60, 13, 59, -1, 35, 61,
+ 36, -1, 5, -1, 5, 61, -1, 5, 26, 64,
+ -1, -1, 5, -1, 66, -1, 64, 32, 64, -1,
+ 64, 31, 64, -1, 64, 29, 64, -1, 64, 30,
+ 64, -1, 30, 64, -1, 35, 64, 36, -1, 68,
+ -1, 64, 26, 64, -1, 64, 27, 64, -1, 64,
+ 28, 64, -1, 64, 19, 64, -1, 64, 20, 64,
+ -1, 64, 21, 64, -1, 14, 65, -1, 4, -1,
+ 3, -1, 6, -1, 49, 25, 56, -1, 49, 33,
+ 69, 25, 56, -1, 40, 49, 41, 25, 56, -1,
+ 40, 49, 33, 69, 41, 25, 56, -1, 40, 49,
+ 56, 41, -1, 40, 49, 33, 69, 41, 56, -1,
+ 70, 69, -1, 70, -1, 5, 26, 56, 64, -1,
+ 33, 56, 64, -1, 25, -1, -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const unsigned short yyrline[] =
+{
+ 0, 1236, 1236, 1238, 1239, 1240, 1241, 1242, 1243, 1244,
+ 1245, 1250, 1253, 1254, 1257, 1258, 1259, 1260, 1265, 1267,
+ 1270, 1271, 1272, 1273, 1274, 1277, 1278, 1283, 1284, 1287,
+ 1289, 1291, 1294, 1296, 1300, 1301, 1302, 1303, 1304, 1307,
+ 1308, 1309, 1310, 1315, 1316, 1317, 1318, 1319, 1320, 1321,
+ 1322, 1323, 1324, 1325, 1328, 1330, 1331, 1334, 1336, 1339,
+ 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1350, 1351,
+ 1352, 1353, 1354, 1355, 1356, 1359, 1360, 1361, 1366, 1367,
+ 1368, 1369, 1373, 1374, 1377, 1378, 1380, 1384, 1393, 1393
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "$end", "error", "$undefined", "LTYPE_INTEGER", "LTYPE_FLOAT",
+ "LTYPE_VAR", "LTYPE_PTR", "PTR_TK", "INT_TK", "FLOAT_TK", "DECLARE",
+ "EXTERNAL", "WHILE", "DO", "NOT", "PLUS_EQ", "SUB_EQ", "DIV_EQ",
+ "MUL_EQ", "SUP_EQ", "LOW_EQ", "NOT_EQ", "STRUCT", "FOR", "IN", "'\\n'",
+ "'='", "'<'", "'>'", "'+'", "'-'", "'/'", "'*'", "':'", "','", "'('",
+ "')'", "'?'", "'{'", "'}'", "'['", "']'", "$accept", "gsl", "gsl_code",
+ "struct_declaration", "struct_members", "struct_member",
+ "ext_task_name", "task_name", "return_type", "arglist",
+ "gsl_def_functions", "function", "function_intro", "function_outro",
+ "leave_namespace", "declaration", "empty_declaration", "instruction",
+ "var_list", "var_list_content", "affectation", "start_block",
+ "expression", "test", "constValue", "func_call", "func_call_expression",
+ "affectation_list", "affectation_in_list", "opt_nl", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+ token YYLEX-NUM. */
+static const unsigned short yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 10, 61, 60, 62, 43,
+ 45, 47, 42, 58, 44, 40, 41, 63, 123, 125,
+ 91, 93
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const unsigned char yyr1[] =
+{
+ 0, 42, 43, 44, 44, 44, 44, 44, 44, 44,
+ 44, 45, 46, 46, 47, 47, 47, 47, 48, 49,
+ 50, 50, 50, 50, 50, 51, 51, 52, 52, 53,
+ 54, 54, 55, 56, 57, 57, 57, 57, 57, 58,
+ 58, 58, 58, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 60, 61, 61, 62, 63, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 65, 65,
+ 65, 65, 65, 65, 65, 66, 66, 66, 67, 67,
+ 67, 67, 68, 68, 69, 69, 70, 70, 71, 71
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const unsigned char yyr2[] =
+{
+ 0, 2, 3, 2, 8, 10, 8, 10, 2, 2,
+ 0, 7, 2, 4, 2, 2, 2, 2, 1, 1,
+ 0, 2, 2, 2, 2, 1, 3, 2, 0, 3,
+ 5, 7, 0, 0, 4, 4, 4, 4, 1, 2,
+ 2, 2, 2, 2, 2, 6, 6, 6, 1, 3,
+ 3, 3, 3, 6, 3, 1, 2, 3, 0, 1,
+ 1, 3, 3, 3, 3, 2, 3, 1, 3, 3,
+ 3, 3, 3, 3, 2, 1, 1, 1, 3, 5,
+ 5, 7, 4, 6, 2, 1, 4, 3, 1, 0
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
+ means the default is an error. */
+static const unsigned char yydefact[] =
+{
+ 10, 0, 32, 1, 19, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 8, 0, 28,
+ 0, 38, 3, 0, 48, 42, 0, 0, 0, 0,
+ 0, 41, 40, 39, 0, 0, 76, 75, 59, 77,
+ 0, 0, 0, 0, 0, 89, 60, 67, 0, 0,
+ 0, 58, 19, 0, 33, 0, 2, 44, 43, 0,
+ 49, 50, 52, 51, 57, 0, 0, 0, 0, 18,
+ 0, 74, 65, 0, 33, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 88, 0, 0, 0, 0,
+ 10, 0, 0, 78, 0, 33, 0, 85, 0, 27,
+ 10, 37, 36, 35, 34, 20, 0, 20, 0, 66,
+ 0, 0, 71, 72, 73, 68, 69, 70, 63, 64,
+ 62, 61, 89, 89, 0, 0, 89, 0, 0, 33,
+ 33, 0, 33, 84, 0, 32, 0, 0, 0, 0,
+ 0, 0, 0, 25, 0, 0, 0, 82, 0, 0,
+ 0, 55, 0, 0, 0, 0, 0, 80, 0, 87,
+ 79, 20, 0, 29, 24, 23, 21, 22, 33, 42,
+ 41, 40, 39, 20, 0, 33, 20, 33, 46, 0,
+ 89, 0, 0, 0, 0, 12, 56, 54, 53, 45,
+ 47, 33, 86, 0, 0, 6, 0, 26, 4, 0,
+ 83, 11, 0, 17, 16, 14, 15, 81, 30, 20,
+ 33, 33, 13, 0, 7, 5, 31
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const short yydefgoto[] =
+{
+ -1, 1, 2, 17, 149, 185, 70, 18, 137, 142,
+ 56, 99, 100, 19, 93, 20, 21, 22, 125, 152,
+ 23, 90, 44, 45, 46, 24, 47, 96, 97, 86
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+#define YYPACT_NINF -116
+static const short yypact[] =
+{
+ -116, 40, 136, -116, 103, 39, 66, 68, 61, 65,
+ 1, 77, 101, -116, 1, 84, 109, -116, 12, -116,
+ 91, -116, -116, 97, -116, 98, 72, 72, 72, 72,
+ 72, 99, 104, 113, 109, 130, -116, -116, -116, -116,
+ 1, 72, 72, 109, 166, 115, -116, -116, 145, 131,
+ 118, -116, -116, -24, -116, -3, 138, -116, -116, 72,
+ 159, 159, 159, 159, 159, 72, 72, 72, 14, -116,
+ 51, -116, 22, 102, 124, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, -116, 160, 139, 140, 141,
+ -116, -3, 152, -116, 154, -116, 156, -3, 109, -116,
+ -116, 159, 159, 159, 159, 150, 82, 150, 82, -116,
+ -3, 158, 159, 159, 159, 159, 159, 159, 22, 22,
+ -116, -116, 115, 115, 195, 188, 115, 88, 162, -116,
+ -116, 72, -116, -116, 52, 136, 155, 177, 199, 200,
+ 201, 202, 180, 175, 185, 183, 171, -116, 144, 18,
+ 161, 195, 178, 144, 144, 190, 191, -116, 72, 159,
+ -116, 150, 82, -116, -116, -116, -116, -116, -116, -116,
+ -116, -116, -116, 150, 82, -116, 150, -116, -116, 192,
+ 115, 208, 213, 214, 215, -116, -116, -116, -116, -116,
+ -116, -116, 159, 196, 194, -116, 198, -116, -116, 203,
+ -116, -116, 161, -116, -116, -116, -116, -116, -116, 150,
+ -116, -116, -116, 204, -116, -116, -116
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yysigned_char yypgoto[] =
+{
+ -116, -116, -68, -116, -116, 23, -116, -15, -104, -92,
+ -116, -116, -116, 89, -74, -116, -88, -115, -116, 75,
+ -116, -116, -16, -6, -116, -116, -116, -62, -116, -99
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule which
+ number is the opposite. If zero, do what YYDEFACT says.
+ If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
+{
+ 111, 53, 94, 144, 36, 37, 38, 39, 50, 91,
+ 60, 61, 62, 63, 64, 40, 145, 92, 143, 68,
+ 143, 131, 127, 148, 150, 72, 73, 154, 74, 128,
+ 95, 41, 135, 178, 71, 133, 42, 54, 188, 189,
+ 3, 43, 105, 101, 31, 55, 179, 106, 146, 102,
+ 103, 104, 180, 83, 84, 157, 158, 193, 160, 112,
+ 113, 114, 115, 116, 117, 118, 119, 120, 121, 196,
+ 194, 32, 199, 33, 143, 36, 37, 38, 39, 107,
+ 161, 202, 197, 134, 108, 162, 143, 138, 34, 139,
+ 140, 141, 35, 4, 195, 5, 6, 7, 8, 9,
+ 10, 198, 41, 200, 48, 213, 49, 42, 25, 51,
+ 11, 12, 43, 13, 52, 159, 57, 207, 26, 27,
+ 28, 29, 58, 14, 59, 65, 15, 155, 16, 30,
+ 66, 81, 82, 83, 84, 69, 214, 215, 109, 67,
+ 85, 4, 192, 5, 6, 7, 8, 9, 10, 4,
+ 87, 5, 6, 7, 89, 88, 10, 110, 11, 12,
+ 164, 13, 165, 166, 167, 98, 181, 12, 182, 183,
+ 184, 14, 123, 122, 15, 124, 16, 129, 126, 14,
+ 130, 132, 15, 136, 16, 75, 76, 77, 81, 82,
+ 83, 84, 78, 79, 80, 81, 82, 83, 84, 147,
+ 151, 153, 168, 156, 169, 170, 171, 172, 173, 174,
+ 175, 176, 177, 203, 187, 190, 191, 201, 204, 205,
+ 206, 208, 209, 210, 163, 212, 186, 0, 211, 216
+};
+
+static const short yycheck[] =
+{
+ 74, 16, 5, 107, 3, 4, 5, 6, 14, 33,
+ 26, 27, 28, 29, 30, 14, 108, 41, 106, 34,
+ 108, 95, 90, 122, 123, 41, 42, 126, 43, 91,
+ 33, 30, 100, 148, 40, 97, 35, 25, 153, 154,
+ 0, 40, 28, 59, 5, 33, 28, 33, 110, 65,
+ 66, 67, 34, 31, 32, 129, 130, 161, 132, 75,
+ 76, 77, 78, 79, 80, 81, 82, 83, 84, 173,
+ 162, 5, 176, 5, 162, 3, 4, 5, 6, 28,
+ 28, 180, 174, 98, 33, 33, 174, 5, 27, 7,
+ 8, 9, 27, 5, 168, 7, 8, 9, 10, 11,
+ 12, 175, 30, 177, 27, 209, 5, 35, 5, 25,
+ 22, 23, 40, 25, 5, 131, 25, 191, 15, 16,
+ 17, 18, 25, 35, 26, 26, 38, 39, 40, 26,
+ 26, 29, 30, 31, 32, 5, 210, 211, 36, 26,
+ 25, 5, 158, 7, 8, 9, 10, 11, 12, 5,
+ 5, 7, 8, 9, 36, 24, 12, 33, 22, 23,
+ 5, 25, 7, 8, 9, 27, 5, 23, 7, 8,
+ 9, 35, 33, 13, 38, 35, 40, 25, 37, 35,
+ 26, 25, 38, 33, 40, 19, 20, 21, 29, 30,
+ 31, 32, 26, 27, 28, 29, 30, 31, 32, 41,
+ 5, 13, 25, 41, 5, 5, 5, 5, 28, 34,
+ 25, 28, 41, 5, 36, 25, 25, 25, 5, 5,
+ 5, 25, 28, 25, 135, 202, 151, -1, 25, 25
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const unsigned char yystos[] =
+{
+ 0, 43, 44, 0, 5, 7, 8, 9, 10, 11,
+ 12, 22, 23, 25, 35, 38, 40, 45, 49, 55,
+ 57, 58, 59, 62, 67, 5, 15, 16, 17, 18,
+ 26, 5, 5, 5, 27, 27, 3, 4, 5, 6,
+ 14, 30, 35, 40, 64, 65, 66, 68, 27, 5,
+ 65, 25, 5, 49, 25, 33, 52, 25, 25, 26,
+ 64, 64, 64, 64, 64, 26, 26, 26, 49, 5,
+ 48, 65, 64, 64, 49, 19, 20, 21, 26, 27,
+ 28, 29, 30, 31, 32, 25, 71, 5, 24, 36,
+ 63, 33, 41, 56, 5, 33, 69, 70, 27, 53,
+ 54, 64, 64, 64, 64, 28, 33, 28, 33, 36,
+ 33, 56, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 13, 33, 35, 60, 37, 44, 69, 25,
+ 26, 56, 25, 69, 49, 44, 33, 50, 5, 7,
+ 8, 9, 51, 58, 50, 51, 69, 41, 71, 46,
+ 71, 5, 61, 13, 71, 39, 41, 56, 56, 64,
+ 56, 28, 33, 55, 5, 7, 8, 9, 25, 5,
+ 5, 5, 5, 28, 34, 25, 28, 41, 59, 28,
+ 34, 5, 7, 8, 9, 47, 61, 36, 59, 59,
+ 25, 25, 64, 50, 51, 56, 50, 51, 56, 50,
+ 56, 25, 71, 5, 5, 5, 5, 56, 25, 28,
+ 25, 25, 47, 50, 56, 56, 25
+};
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY (-2)
+#define YYEOF 0
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrlab1
+
+
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+
+#define YYFAIL goto yyerrlab
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ yytoken = YYTRANSLATE (yychar); \
+ YYPOPSTACK; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror ("syntax error: cannot back up");\
+ YYERROR; \
+ } \
+while (0)
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+ are run). */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ Current.first_line = Rhs[1].first_line; \
+ Current.first_column = Rhs[1].first_column; \
+ Current.last_line = Rhs[N].last_line; \
+ Current.last_column = Rhs[N].last_column;
+#endif
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+# define YYDSYMPRINT(Args) \
+do { \
+ if (yydebug) \
+ yysymprint Args; \
+} while (0)
+
+# define YYDSYMPRINTF(Title, Token, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yysymprint (stderr, \
+ Token, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (cinluded). |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short *bottom, short *top)
+#else
+static void
+yy_stack_print (bottom, top)
+ short *bottom;
+ short *top;
+#endif
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (/* Nothing. */; bottom <= top; ++bottom)
+ YYFPRINTF (stderr, " %d", *bottom);
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+ int yyrule;
+#endif
+{
+ int yyi;
+ unsigned int yylineno = yyrline[yyrule];
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+ yyrule - 1, yylineno);
+ /* Print the symbols being reduced, and their result. */
+ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+ YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+ YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (Rule); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+# define YYDSYMPRINTF(Title, Token, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined (__GLIBC__) && defined (_STRING_H)
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+static YYSIZE_T
+# if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+# else
+yystrlen (yystr)
+ const char *yystr;
+# endif
+{
+ register const char *yys = yystr;
+
+ while (*yys++ != '\0')
+ continue;
+
+ return yys - yystr - 1;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+static char *
+# if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+# else
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+# endif
+{
+ register char *yyd = yydest;
+ register const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+
+
+#if YYDEBUG
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE *yyvaluep;
+#endif
+{
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+
+ if (yytype < YYNTOKENS)
+ {
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+ }
+ else
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+ switch (yytype)
+ {
+ default:
+ break;
+ }
+ YYFPRINTF (yyoutput, ")");
+}
+
+#endif /* ! YYDEBUG */
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yydestruct (int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yytype, yyvaluep)
+ int yytype;
+ YYSTYPE *yyvaluep;
+#endif
+{
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+
+ switch (yytype)
+ {
+
+ default:
+ break;
+ }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes. */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM);
+# else
+int yyparse ();
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The lookahead symbol. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far. */
+int yynerrs;
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+
+ register int yystate;
+ register int yyn;
+ int yyresult;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+ /* Lookahead token as an internal (translated) token number. */
+ int yytoken = 0;
+
+ /* Three stacks and their tools:
+ `yyss': related to states,
+ `yyvs': related to semantic values,
+ `yyls': related to locations.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ short yyssa[YYINITDEPTH];
+ short *yyss = yyssa;
+ register short *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK (yyvsp--, yyssp--)
+
+ YYSIZE_T yystacksize = YYINITDEPTH;
+
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+ /* When reducing, the number of symbols on the RHS of the reduced
+ rule. */
+ int yylen;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss;
+ yyvsp = yyvs;
+
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks.
+ */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short *yyss1 = yyss;
+
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow ("parser stack overflow",
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyoverflowlab;
+# else
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyoverflowlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ short *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyoverflowlab;
+ YYSTACK_RELOCATE (yyss);
+ YYSTACK_RELOCATE (yyvs);
+
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ goto yybackup;
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state. */
+/* Read a lookahead token if we need one and don't already have one. */
+/* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ yyn = yypact[yystate];
+ if (yyn == YYPACT_NINF)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yyn == 0 || yyn == YYTABLE_NINF)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Shift the lookahead token. */
+ YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
+
+ /* Discard the token being shifted unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ *++yyvsp = yylval;
+
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 3:
+#line 1238 "goomsl_yacc.y"
+ { gsl_append(yyvsp[0].nPtr); }
+ break;
+
+ case 4:
+#line 1239 "goomsl_yacc.y"
+ { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); }
+ break;
+
+ case 5:
+#line 1240 "goomsl_yacc.y"
+ { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); }
+ break;
+
+ case 6:
+#line 1241 "goomsl_yacc.y"
+ { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); }
+ break;
+
+ case 7:
+#line 1242 "goomsl_yacc.y"
+ { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); }
+ break;
+
+ case 11:
+#line 1250 "goomsl_yacc.y"
+ { gsl_add_struct(yyvsp[-4].strValue, yyvsp[-2].gsl_struct); }
+ break;
+
+ case 12:
+#line 1253 "goomsl_yacc.y"
+ { yyval.gsl_struct = gsl_new_struct(yyvsp[0].gsl_struct_field); }
+ break;
+
+ case 13:
+#line 1254 "goomsl_yacc.y"
+ { yyval.gsl_struct = yyvsp[-3].gsl_struct; gsl_add_struct_field(yyvsp[-3].gsl_struct, yyvsp[0].gsl_struct_field); }
+ break;
+
+ case 14:
+#line 1257 "goomsl_yacc.y"
+ { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_INT); }
+ break;
+
+ case 15:
+#line 1258 "goomsl_yacc.y"
+ { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_FLOAT); }
+ break;
+
+ case 16:
+#line 1259 "goomsl_yacc.y"
+ { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_PTR); }
+ break;
+
+ case 17:
+#line 1260 "goomsl_yacc.y"
+ { yyval.gsl_struct_field = gsl_new_struct_field_struct(yyvsp[0].strValue, yyvsp[-1].strValue); }
+ break;
+
+ case 18:
+#line 1265 "goomsl_yacc.y"
+ { gsl_declare_external_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); }
+ break;
+
+ case 19:
+#line 1267 "goomsl_yacc.y"
+ { gsl_declare_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); }
+ break;
+
+ case 20:
+#line 1270 "goomsl_yacc.y"
+ { yyval.intValue=-1; }
+ break;
+
+ case 21:
+#line 1271 "goomsl_yacc.y"
+ { yyval.intValue=INT_TK; }
+ break;
+
+ case 22:
+#line 1272 "goomsl_yacc.y"
+ { yyval.intValue=FLOAT_TK; }
+ break;
+
+ case 23:
+#line 1273 "goomsl_yacc.y"
+ { yyval.intValue=PTR_TK; }
+ break;
+
+ case 24:
+#line 1274 "goomsl_yacc.y"
+ { yyval.intValue= 1000 + gsl_get_struct_id(yyvsp[0].strValue); }
+ break;
+
+ case 29:
+#line 1287 "goomsl_yacc.y"
+ { gsl_leavenamespace(); }
+ break;
+
+ case 30:
+#line 1289 "goomsl_yacc.y"
+ { gsl_append(new_function_intro(yyvsp[-3].strValue));
+ gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-3].strValue); }
+ break;
+
+ case 31:
+#line 1291 "goomsl_yacc.y"
+ { gsl_append(new_function_intro(yyvsp[-5].strValue));
+ gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-5].strValue); }
+ break;
+
+ case 32:
+#line 1294 "goomsl_yacc.y"
+ { gsl_append(new_function_outro()); }
+ break;
+
+ case 33:
+#line 1296 "goomsl_yacc.y"
+ { yyval.namespace = gsl_leavenamespace(); }
+ break;
+
+ case 34:
+#line 1300 "goomsl_yacc.y"
+ { gsl_float_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); }
+ break;
+
+ case 35:
+#line 1301 "goomsl_yacc.y"
+ { gsl_int_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); }
+ break;
+
+ case 36:
+#line 1302 "goomsl_yacc.y"
+ { gsl_ptr_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); }
+ break;
+
+ case 37:
+#line 1303 "goomsl_yacc.y"
+ { gsl_struct_decl_local(yyvsp[-3].strValue,yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); }
+ break;
+
+ case 38:
+#line 1304 "goomsl_yacc.y"
+ { yyval.nPtr = 0; }
+ break;
+
+ case 39:
+#line 1307 "goomsl_yacc.y"
+ { gsl_float_decl_local(yyvsp[0].strValue); }
+ break;
+
+ case 40:
+#line 1308 "goomsl_yacc.y"
+ { gsl_int_decl_local(yyvsp[0].strValue); }
+ break;
+
+ case 41:
+#line 1309 "goomsl_yacc.y"
+ { gsl_ptr_decl_local(yyvsp[0].strValue); }
+ break;
+
+ case 42:
+#line 1310 "goomsl_yacc.y"
+ { gsl_struct_decl_local(yyvsp[-1].strValue,yyvsp[0].strValue); }
+ break;
+
+ case 43:
+#line 1315 "goomsl_yacc.y"
+ { yyval.nPtr = yyvsp[-1].nPtr; }
+ break;
+
+ case 44:
+#line 1316 "goomsl_yacc.y"
+ { yyval.nPtr = yyvsp[-1].nPtr; }
+ break;
+
+ case 45:
+#line 1317 "goomsl_yacc.y"
+ { yyval.nPtr = new_if(yyvsp[-4].nPtr,yyvsp[0].nPtr); }
+ break;
+
+ case 46:
+#line 1318 "goomsl_yacc.y"
+ { yyval.nPtr = new_while(yyvsp[-4].nPtr,yyvsp[0].nPtr); }
+ break;
+
+ case 47:
+#line 1319 "goomsl_yacc.y"
+ { lastNode = yyvsp[-3].nPtr->unode.opr.op[1]; yyval.nPtr=yyvsp[-3].nPtr; }
+ break;
+
+ case 48:
+#line 1320 "goomsl_yacc.y"
+ { yyval.nPtr = yyvsp[0].nPtr; }
+ break;
+
+ case 49:
+#line 1321 "goomsl_yacc.y"
+ { yyval.nPtr = new_plus_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); }
+ break;
+
+ case 50:
+#line 1322 "goomsl_yacc.y"
+ { yyval.nPtr = new_sub_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); }
+ break;
+
+ case 51:
+#line 1323 "goomsl_yacc.y"
+ { yyval.nPtr = new_mul_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); }
+ break;
+
+ case 52:
+#line 1324 "goomsl_yacc.y"
+ { yyval.nPtr = new_div_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); }
+ break;
+
+ case 53:
+#line 1325 "goomsl_yacc.y"
+ { yyval.nPtr = new_static_foreach(new_var(yyvsp[-4].strValue, currentGoomSL->num_lines), yyvsp[-2].nPtr, yyvsp[0].nPtr); }
+ break;
+
+ case 54:
+#line 1328 "goomsl_yacc.y"
+ { yyval.nPtr = yyvsp[-1].nPtr; }
+ break;
+
+ case 55:
+#line 1330 "goomsl_yacc.y"
+ { yyval.nPtr = new_var_list(new_var(yyvsp[0].strValue,currentGoomSL->num_lines), NULL); }
+ break;
+
+ case 56:
+#line 1331 "goomsl_yacc.y"
+ { yyval.nPtr = new_var_list(new_var(yyvsp[-1].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); }
+ break;
+
+ case 57:
+#line 1334 "goomsl_yacc.y"
+ { yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); }
+ break;
+
+ case 58:
+#line 1336 "goomsl_yacc.y"
+ { yyval.nPtr = new_block(lastNode); lastNode = yyval.nPtr->unode.opr.op[0]; }
+ break;
+
+ case 59:
+#line 1339 "goomsl_yacc.y"
+ { yyval.nPtr = new_var(yyvsp[0].strValue,currentGoomSL->num_lines); }
+ break;
+
+ case 60:
+#line 1340 "goomsl_yacc.y"
+ { yyval.nPtr = yyvsp[0].nPtr; }
+ break;
+
+ case 61:
+#line 1341 "goomsl_yacc.y"
+ { yyval.nPtr = new_mul(yyvsp[-2].nPtr,yyvsp[0].nPtr); }
+ break;
+
+ case 62:
+#line 1342 "goomsl_yacc.y"
+ { yyval.nPtr = new_div(yyvsp[-2].nPtr,yyvsp[0].nPtr); }
+ break;
+
+ case 63:
+#line 1343 "goomsl_yacc.y"
+ { yyval.nPtr = new_add(yyvsp[-2].nPtr,yyvsp[0].nPtr); }
+ break;
+
+ case 64:
+#line 1344 "goomsl_yacc.y"
+ { yyval.nPtr = new_sub(yyvsp[-2].nPtr,yyvsp[0].nPtr); }
+ break;
+
+ case 65:
+#line 1345 "goomsl_yacc.y"
+ { yyval.nPtr = new_neg(yyvsp[0].nPtr); }
+ break;
+
+ case 66:
+#line 1346 "goomsl_yacc.y"
+ { yyval.nPtr = yyvsp[-1].nPtr; }
+ break;
+
+ case 67:
+#line 1347 "goomsl_yacc.y"
+ { yyval.nPtr = yyvsp[0].nPtr; }
+ break;
+
+ case 68:
+#line 1350 "goomsl_yacc.y"
+ { yyval.nPtr = new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr); }
+ break;
+
+ case 69:
+#line 1351 "goomsl_yacc.y"
+ { yyval.nPtr = new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr); }
+ break;
+
+ case 70:
+#line 1352 "goomsl_yacc.y"
+ { yyval.nPtr = new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr); }
+ break;
+
+ case 71:
+#line 1353 "goomsl_yacc.y"
+ { yyval.nPtr = new_not(new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr)); }
+ break;
+
+ case 72:
+#line 1354 "goomsl_yacc.y"
+ { yyval.nPtr = new_not(new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr)); }
+ break;
+
+ case 73:
+#line 1355 "goomsl_yacc.y"
+ { yyval.nPtr = new_not(new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr)); }
+ break;
+
+ case 74:
+#line 1356 "goomsl_yacc.y"
+ { yyval.nPtr = new_not(yyvsp[0].nPtr); }
+ break;
+
+ case 75:
+#line 1359 "goomsl_yacc.y"
+ { yyval.nPtr = new_constFloat(yyvsp[0].strValue,currentGoomSL->num_lines); }
+ break;
+
+ case 76:
+#line 1360 "goomsl_yacc.y"
+ { yyval.nPtr = new_constInt(yyvsp[0].strValue,currentGoomSL->num_lines); }
+ break;
+
+ case 77:
+#line 1361 "goomsl_yacc.y"
+ { yyval.nPtr = new_constPtr(yyvsp[0].strValue,currentGoomSL->num_lines); }
+ break;
+
+ case 78:
+#line 1366 "goomsl_yacc.y"
+ { yyval.nPtr = new_call(yyvsp[-2].strValue,NULL); }
+ break;
+
+ case 79:
+#line 1367 "goomsl_yacc.y"
+ { yyval.nPtr = new_call(yyvsp[-4].strValue,yyvsp[-2].nPtr); }
+ break;
+
+ case 80:
+#line 1368 "goomsl_yacc.y"
+ { yyval.nPtr = new_call(yyvsp[-3].strValue,NULL); }
+ break;
+
+ case 81:
+#line 1369 "goomsl_yacc.y"
+ { yyval.nPtr = new_call(yyvsp[-5].strValue,yyvsp[-3].nPtr); }
+ break;
+
+ case 82:
+#line 1373 "goomsl_yacc.y"
+ { yyval.nPtr = new_call_expr(yyvsp[-2].strValue,NULL); }
+ break;
+
+ case 83:
+#line 1374 "goomsl_yacc.y"
+ { yyval.nPtr = new_call_expr(yyvsp[-4].strValue,yyvsp[-2].nPtr); }
+ break;
+
+ case 84:
+#line 1377 "goomsl_yacc.y"
+ { yyval.nPtr = new_affec_list(yyvsp[-1].nPtr,yyvsp[0].nPtr); }
+ break;
+
+ case 85:
+#line 1378 "goomsl_yacc.y"
+ { yyval.nPtr = new_affec_list(yyvsp[0].nPtr,NULL); }
+ break;
+
+ case 86:
+#line 1380 "goomsl_yacc.y"
+ {
+ gsl_reenternamespace(yyvsp[-1].namespace);
+ yyval.nPtr = new_set(new_var(yyvsp[-3].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr);
+ }
+ break;
+
+ case 87:
+#line 1384 "goomsl_yacc.y"
+ {
+ gsl_reenternamespace(yyvsp[-1].namespace);
+ yyval.nPtr = new_set(new_var("&this", currentGoomSL->num_lines),yyvsp[0].nPtr);
+ }
+ break;
+
+
+ }
+
+/* Line 999 of yacc.c. */
+#line 2792 "goomsl_yacc.c"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+
+
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTOKENS];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+#if YYERROR_VERBOSE
+ yyn = yypact[yystate];
+
+ if (YYPACT_NINF < yyn && yyn < YYLAST)
+ {
+ YYSIZE_T yysize = 0;
+ int yytype = YYTRANSLATE (yychar);
+ char *yymsg;
+ int yyx, yycount;
+
+ yycount = 0;
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ for (yyx = yyn < 0 ? -yyn : 0;
+ yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+ yysize += yystrlen ("syntax error, unexpected ") + 1;
+ yysize += yystrlen (yytname[yytype]);
+ yymsg = (char *) YYSTACK_ALLOC (yysize);
+ if (yymsg != 0)
+ {
+ char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+ yyp = yystpcpy (yyp, yytname[yytype]);
+
+ if (yycount < 5)
+ {
+ yycount = 0;
+ for (yyx = yyn < 0 ? -yyn : 0;
+ yyx < (int) (sizeof (yytname) / sizeof (char *));
+ yyx++)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ const char *yyq = ! yycount ? ", expecting " : " or ";
+ yyp = yystpcpy (yyp, yyq);
+ yyp = yystpcpy (yyp, yytname[yyx]);
+ yycount++;
+ }
+ }
+ yyerror (yymsg);
+ YYSTACK_FREE (yymsg);
+ }
+ else
+ yyerror ("syntax error; also virtual memory exhausted");
+ }
+ else
+#endif /* YYERROR_VERBOSE */
+ yyerror ("syntax error");
+ }
+
+
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ {
+ /* Pop the error token. */
+ YYPOPSTACK;
+ /* Pop the rest of the stack. */
+ while (yyss < yyssp)
+ {
+ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+ yydestruct (yystos[*yyssp], yyvsp);
+ YYPOPSTACK;
+ }
+ YYABORT;
+ }
+
+ YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+ yydestruct (yytoken, &yylval);
+ yychar = YYEMPTY;
+
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*----------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action. |
+`----------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (yyn != YYPACT_NINF)
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+ yydestruct (yystos[yystate], yyvsp);
+ yyvsp--;
+ yystate = *--yyssp;
+
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ YYDPRINTF ((stderr, "Shifting error token, "));
+
+ *++yyvsp = yylval;
+
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here. |
+`----------------------------------------------*/
+yyoverflowlab:
+ yyerror ("parser stack overflow");
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+ return yyresult;
+}
+
+
+#line 1396 "goomsl_yacc.y"
+
+
+
+void yyerror(char *str)
+{ /* {{{ */
+ fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str);
+ currentGoomSL->compilationOK = 0;
+ exit(1);
+} /* }}} */
+
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.h b/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.h
new file mode 100644
index 0000000000..fae0c010f6
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.h
@@ -0,0 +1,104 @@
+/* A Bison parser, made by GNU Bison 1.875. */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ LTYPE_INTEGER = 258,
+ LTYPE_FLOAT = 259,
+ LTYPE_VAR = 260,
+ LTYPE_PTR = 261,
+ PTR_TK = 262,
+ INT_TK = 263,
+ FLOAT_TK = 264,
+ DECLARE = 265,
+ EXTERNAL = 266,
+ WHILE = 267,
+ DO = 268,
+ NOT = 269,
+ PLUS_EQ = 270,
+ SUB_EQ = 271,
+ DIV_EQ = 272,
+ MUL_EQ = 273,
+ SUP_EQ = 274,
+ LOW_EQ = 275,
+ NOT_EQ = 276,
+ STRUCT = 277,
+ FOR = 278,
+ IN = 279
+ };
+#endif
+#define LTYPE_INTEGER 258
+#define LTYPE_FLOAT 259
+#define LTYPE_VAR 260
+#define LTYPE_PTR 261
+#define PTR_TK 262
+#define INT_TK 263
+#define FLOAT_TK 264
+#define DECLARE 265
+#define EXTERNAL 266
+#define WHILE 267
+#define DO 268
+#define NOT 269
+#define PLUS_EQ 270
+#define SUB_EQ 271
+#define DIV_EQ 272
+#define MUL_EQ 273
+#define SUP_EQ 274
+#define LOW_EQ 275
+#define NOT_EQ 276
+#define STRUCT 277
+#define FOR 278
+#define IN 279
+
+
+
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 1199 "goomsl_yacc.y"
+typedef union YYSTYPE {
+ int intValue;
+ float floatValue;
+ char charValue;
+ char strValue[2048];
+ NodeType *nPtr;
+ GoomHash *namespace;
+ GSL_Struct *gsl_struct;
+ GSL_StructField *gsl_struct_field;
+ } YYSTYPE;
+/* Line 1240 of yacc.c. */
+#line 95 "goomsl_yacc.h"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+extern YYSTYPE yylval;
+
+
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.y b/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.y
new file mode 100644
index 0000000000..c424a50a6c
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.y
@@ -0,0 +1,1405 @@
+/**
+ * copyright 2004, Jean-Christophe Hoelt <jeko@ios-software.com>
+ *
+ * This program is released under the terms of the GNU Lesser General Public Licence.
+ */
+%{
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "goomsl.h"
+ #include "goomsl_private.h"
+
+#define STRUCT_ALIGNMENT 16
+/* #define VERBOSE */
+
+ int yylex(void);
+ void yyerror(char *);
+ extern GoomSL *currentGoomSL;
+
+ static NodeType *nodeNew(const char *str, int type, int line_number);
+ static NodeType *nodeClone(NodeType *node);
+ static void nodeFreeInternals(NodeType *node);
+ static void nodeFree(NodeType *node);
+
+ static void commit_node(NodeType *node, int releaseIfTemp);
+ static void precommit_node(NodeType *node);
+
+ static NodeType *new_constInt(const char *str, int line_number);
+ static NodeType *new_constFloat(const char *str, int line_number);
+ static NodeType *new_constPtr(const char *str, int line_number);
+ static NodeType *new_var(const char *str, int line_number);
+ static NodeType *new_nop(const char *str);
+ static NodeType *new_op(const char *str, int type, int nbOp);
+
+ static int allocateLabel();
+ static int allocateTemp();
+ static void releaseTemp(int n);
+ static void releaseAllTemps();
+
+ static int is_tmp_expr(NodeType *node) {
+ if (node->str) {
+ return (!strncmp(node->str,"_i_tmp_",7))
+ || (!strncmp(node->str,"_f_tmp_",7))
+ || (!strncmp(node->str,"_p_tmp",7));
+ }
+ return 0;
+ }
+ /* pre: is_tmp_expr(node); */
+ static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); }
+
+ static int is_commutative_expr(int itype)
+ { /* {{{ */
+ return (itype == INSTR_ADD)
+ || (itype == INSTR_MUL)
+ || (itype == INSTR_ISEQUAL);
+ } /* }}} */
+
+ static void GSL_PUT_LABEL(char *name, int line_number)
+ { /* {{{ */
+#ifdef VERBOSE
+ printf("label %s\n", name);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number);
+ gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL);
+ } /* }}} */
+ static void GSL_PUT_JUMP(char *name, int line_number)
+ { /* {{{ */
+#ifdef VERBOSE
+ printf("jump %s\n", name);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number);
+ gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL);
+ } /* }}} */
+
+ static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number)
+ { /* {{{ */
+#ifdef VERBOSE
+ printf("%s %s\n", iname, name);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number);
+ gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL);
+ } /* }}} */
+ static void GSL_PUT_JZERO(char *name,int line_number)
+ { /* {{{ */
+ GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number);
+ } /* }}} */
+ static void GSL_PUT_JNZERO(char *name, int line_number)
+ { /* {{{ */
+ GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number);
+ } /* }}} */
+
+ /* Structures Management */
+
+#define ALIGN_ADDR(_addr,_align) {\
+ if (_align>1) {\
+ int _dec = (_addr%_align);\
+ if (_dec != 0) _addr += _align - _dec;\
+ }}
+
+ /* */
+ void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align)
+ {
+ int i;
+ int consumed = 0;
+ int iblk=0, fblk=0;
+
+ s->iBlock[0].size = 0;
+ s->iBlock[0].data = 0;
+ s->fBlock[0].size = 0;
+ s->fBlock[0].data = 0;
+
+ /* Prepare sub-struct and calculate space needed for their storage */
+ for (i = 0; i < s->nbFields; ++i)
+ {
+ if (s->fields[i]->type < FIRST_RESERVED)
+ {
+ int j=0;
+ GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type];
+ consumed += sizeof(int); /* stocke le prefix */
+ ALIGN_ADDR(consumed, s_align);
+ s->fields[i]->offsetInStruct = consumed;
+ gsl_prepare_struct(substruct, s_align, i_align, f_align);
+ for(j=0;substruct->iBlock[j].size>0;++j) {
+ s->iBlock[iblk].data = consumed + substruct->iBlock[j].data;
+ s->iBlock[iblk].size = substruct->iBlock[j].size;
+ iblk++;
+ }
+ for(j=0;substruct->fBlock[j].size>0;++j) {
+ s->fBlock[fblk].data = consumed + substruct->fBlock[j].data;
+ s->fBlock[fblk].size = substruct->fBlock[j].size;
+ fblk++;
+ }
+ consumed += substruct->size;
+ }
+ }
+
+ /* Then prepare integers */
+ ALIGN_ADDR(consumed, i_align);
+ for (i = 0; i < s->nbFields; ++i)
+ {
+ if (s->fields[i]->type == INSTR_INT)
+ {
+ if (s->iBlock[iblk].size == 0) {
+ s->iBlock[iblk].size = 1;
+ s->iBlock[iblk].data = consumed;
+ } else {
+ s->iBlock[iblk].size += 1;
+ }
+ s->fields[i]->offsetInStruct = consumed;
+ consumed += sizeof(int);
+ }
+ }
+
+ iblk++;
+ s->iBlock[iblk].size = 0;
+ s->iBlock[iblk].data = 0;
+
+ /* Then prepare floats */
+ ALIGN_ADDR(consumed, f_align);
+ for (i = 0; i < s->nbFields; ++i)
+ {
+ if (s->fields[i]->type == INSTR_FLOAT)
+ {
+ if (s->fBlock[fblk].size == 0) {
+ s->fBlock[fblk].size = 1;
+ s->fBlock[fblk].data = consumed;
+ } else {
+ s->fBlock[fblk].size += 1;
+ }
+ s->fields[i]->offsetInStruct = consumed;
+ consumed += sizeof(int);
+ }
+ }
+
+ fblk++;
+ s->fBlock[fblk].size = 0;
+ s->fBlock[fblk].data = 0;
+
+ /* Finally prepare pointers */
+ ALIGN_ADDR(consumed, i_align);
+ for (i = 0; i < s->nbFields; ++i)
+ {
+ if (s->fields[i]->type == INSTR_PTR)
+ {
+ s->fields[i]->offsetInStruct = consumed;
+ consumed += sizeof(int);
+ }
+ }
+ s->size = consumed;
+ }
+
+ /* Returns the ID of a struct from its name */
+ int gsl_get_struct_id(const char *name) /* {{{ */
+ {
+ HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name);
+ if (ret != NULL) return ret->i;
+ return -1;
+ } /* }}} */
+
+ /* Adds the definition of a struct */
+ void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */
+ {
+ /* Prepare the struct: ie calculate internal storage format */
+ gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT);
+
+ /* If the struct does not already exists */
+ if (gsl_get_struct_id(name) < 0)
+ {
+ /* adds it */
+ int id = currentGoomSL->nbStructID++;
+ goom_hash_put_int(currentGoomSL->structIDS, name, id);
+ if (currentGoomSL->gsl_struct_size <= id) {
+ currentGoomSL->gsl_struct_size *= 2;
+ currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct,
+ sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size);
+ }
+ currentGoomSL->gsl_struct[id] = gsl_struct;
+ }
+ } /* }}} */
+
+ /* Creates a field for a struct */
+ GSL_StructField *gsl_new_struct_field(const char *name, int type)
+ {
+ GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField));
+ strcpy(field->name, name);
+ field->type = type;
+ return field;
+ }
+
+ /* Create as field for a struct which will be a struct itself */
+ GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type)
+ {
+ GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type));
+ if (field->type < 0) {
+ fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n",
+ currentGoomSL->num_lines, type);
+ exit(1);
+ }
+ return field;
+ }
+
+ /* Creates a Struct */
+ GSL_Struct *gsl_new_struct(GSL_StructField *field)
+ {
+ GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct));
+ s->nbFields = 1;
+ s->fields[0] = field;
+ return s;
+ }
+
+ /* Adds a field to a struct */
+ void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field)
+ {
+ s->fields[s->nbFields++] = field;
+ }
+
+ int gsl_type_of_var(GoomHash *ns, const char *name)
+ {
+ char type_of[256];
+ HashValue *hv;
+ sprintf(type_of, "__type_of_%s", name);
+ hv = goom_hash_get(ns, type_of);
+ if (hv != NULL)
+ return hv->i;
+ fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name);
+ return -1;
+ }
+
+ static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space)
+ {
+ char type_of[256];
+ if (name[0] == '@') { ns = currentGoomSL->vars; }
+
+ if (space == NULL) {
+ switch (type) {
+ case INSTR_INT:
+ case INSTR_FLOAT:
+ case INSTR_PTR:
+ space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap,
+ sizeof(int), sizeof(int));
+ break;
+ case -1:
+ fprintf(stderr, "What the fuck!\n");
+ exit(1);
+ default: /* On a un struct_id */
+ space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap,
+ currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int));
+ }
+ }
+ goom_hash_put_ptr(ns, name, (void*)space);
+ sprintf(type_of, "__type_of_%s", name);
+ goom_hash_put_int(ns, type_of, type);
+
+ /* Ensuite le hack: on ajoute les champs en tant que variables. */
+ if (type < FIRST_RESERVED)
+ {
+ int i;
+ GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type];
+ ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */
+ for (i = 0; i < gsl_struct->nbFields; ++i)
+ {
+ char full_name[256];
+ char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct;
+ sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name);
+ gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace);
+ }
+ }
+ }
+
+ /* Declare a variable which will be a struct */
+ static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name)
+ {
+ int struct_id = gsl_get_struct_id(struct_name);
+ gsl_declare_var(namespace, name, struct_id, NULL);
+ }
+
+ static void gsl_float_decl_global(const char *name)
+ {
+ gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL);
+ }
+ static void gsl_int_decl_global(const char *name)
+ {
+ gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL);
+ }
+ static void gsl_ptr_decl_global(const char *name)
+ {
+ gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL);
+ }
+ static void gsl_struct_decl_global_from_id(const char *name, int id)
+ {
+ gsl_declare_var(currentGoomSL->vars, name, id, NULL);
+ }
+
+ /* FLOAT */
+ static void gsl_float_decl_local(const char *name)
+ {
+ gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL);
+ }
+ /* INT */
+ static void gsl_int_decl_local(const char *name)
+ {
+ gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL);
+ }
+ /* PTR */
+ static void gsl_ptr_decl_local(const char *name)
+ {
+ gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL);
+ }
+ /* STRUCT */
+ static void gsl_struct_decl_local(const char *struct_name, const char *name)
+ {
+ gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name);
+ }
+
+
+ static void commit_test2(NodeType *set,const char *type, int instr);
+ static NodeType *new_call(const char *name, NodeType *affect_list);
+
+ /* SETTER */
+ static NodeType *new_set(NodeType *lvalue, NodeType *expression)
+ { /* {{{ */
+ NodeType *set = new_op("set", OPR_SET, 2);
+ set->unode.opr.op[0] = lvalue;
+ set->unode.opr.op[1] = expression;
+ return set;
+ } /* }}} */
+ static void commit_set(NodeType *set)
+ { /* {{{ */
+ commit_test2(set,"set",INSTR_SET);
+ } /* }}} */
+
+ /* PLUS_EQ */
+ static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+ {
+ NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2);
+ set->unode.opr.op[0] = lvalue;
+ set->unode.opr.op[1] = expression;
+ return set;
+ }
+ static void commit_plus_eq(NodeType *set)
+ {
+ precommit_node(set->unode.opr.op[1]);
+#ifdef VERBOSE
+ printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number);
+ commit_node(set->unode.opr.op[0],0);
+ commit_node(set->unode.opr.op[1],1);
+ } /* }}} */
+
+ /* SUB_EQ */
+ static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+ {
+ NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2);
+ set->unode.opr.op[0] = lvalue;
+ set->unode.opr.op[1] = expression;
+ return set;
+ }
+ static void commit_sub_eq(NodeType *set)
+ {
+ precommit_node(set->unode.opr.op[1]);
+#ifdef VERBOSE
+ printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number);
+ commit_node(set->unode.opr.op[0],0);
+ commit_node(set->unode.opr.op[1],1);
+ } /* }}} */
+
+ /* MUL_EQ */
+ static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+ {
+ NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2);
+ set->unode.opr.op[0] = lvalue;
+ set->unode.opr.op[1] = expression;
+ return set;
+ }
+ static void commit_mul_eq(NodeType *set)
+ {
+ precommit_node(set->unode.opr.op[1]);
+#ifdef VERBOSE
+ printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number);
+ commit_node(set->unode.opr.op[0],0);
+ commit_node(set->unode.opr.op[1],1);
+ } /* }}} */
+
+ /* DIV_EQ */
+ static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */
+ {
+ NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2);
+ set->unode.opr.op[0] = lvalue;
+ set->unode.opr.op[1] = expression;
+ return set;
+ }
+ static void commit_div_eq(NodeType *set)
+ {
+ precommit_node(set->unode.opr.op[1]);
+#ifdef VERBOSE
+ printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number);
+ commit_node(set->unode.opr.op[0],0);
+ commit_node(set->unode.opr.op[1],1);
+ } /* }}} */
+
+ /* commodity method for add, mult, ... */
+
+ static void precommit_expr(NodeType *expr, const char *type, int instr_id)
+ { /* {{{ */
+ NodeType *tmp, *tmpcpy;
+ int toAdd;
+
+ /* compute "left" and "right" */
+ switch (expr->unode.opr.nbOp) {
+ case 2:
+ precommit_node(expr->unode.opr.op[1]);
+ case 1:
+ precommit_node(expr->unode.opr.op[0]);
+ }
+
+ if (is_tmp_expr(expr->unode.opr.op[0])) {
+ tmp = expr->unode.opr.op[0];
+ toAdd = 1;
+ }
+ else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) {
+ tmp = expr->unode.opr.op[1];
+ toAdd = 0;
+ }
+ else {
+ char stmp[256];
+ /* declare a temporary variable to store the result */
+ if (expr->unode.opr.op[0]->type == CONST_INT_NODE) {
+ sprintf(stmp,"_i_tmp_%i",allocateTemp());
+ gsl_int_decl_global(stmp);
+ }
+ else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) {
+ sprintf(stmp,"_f_tmp%i",allocateTemp());
+ gsl_float_decl_global(stmp);
+ }
+ else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) {
+ sprintf(stmp,"_p_tmp%i",allocateTemp());
+ gsl_ptr_decl_global(stmp);
+ }
+ else {
+ int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str);
+ if (type == INSTR_FLOAT) {
+ sprintf(stmp,"_f_tmp_%i",allocateTemp());
+ gsl_float_decl_global(stmp);
+ }
+ else if (type == INSTR_PTR) {
+ sprintf(stmp,"_p_tmp_%i",allocateTemp());
+ gsl_ptr_decl_global(stmp);
+ }
+ else if (type == INSTR_INT) {
+ sprintf(stmp,"_i_tmp_%i",allocateTemp());
+ gsl_int_decl_global(stmp);
+ }
+ else if (type == -1) {
+ fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n",
+ expr->line_number, expr->unode.opr.op[0]->str);
+ exit(1);
+ }
+ else { /* type is a struct_id */
+ sprintf(stmp,"_s_tmp_%i",allocateTemp());
+ gsl_struct_decl_global_from_id(stmp,type);
+ }
+ }
+ tmp = new_var(stmp,expr->line_number);
+
+ /* set the tmp to the value of "op1" */
+ tmpcpy = nodeClone(tmp);
+ commit_node(new_set(tmp,expr->unode.opr.op[0]),0);
+ toAdd = 1;
+
+ tmp = tmpcpy;
+ }
+
+ /* add op2 to tmp */
+#ifdef VERBOSE
+ if (expr->unode.opr.nbOp == 2)
+ printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str);
+ else
+ printf("%s %s\n", type, tmp->str);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number);
+ tmpcpy = nodeClone(tmp);
+ commit_node(tmp,0);
+ if (expr->unode.opr.nbOp == 2) {
+ commit_node(expr->unode.opr.op[toAdd],1);
+ }
+
+ /* redefine the ADD node now as the computed variable */
+ nodeFreeInternals(expr);
+ *expr = *tmpcpy;
+ free(tmpcpy);
+ } /* }}} */
+
+ static NodeType *new_expr1(const char *name, int id, NodeType *expr1)
+ { /* {{{ */
+ NodeType *add = new_op(name, id, 1);
+ add->unode.opr.op[0] = expr1;
+ return add;
+ } /* }}} */
+
+ static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2)
+ { /* {{{ */
+ NodeType *add = new_op(name, id, 2);
+ add->unode.opr.op[0] = expr1;
+ add->unode.opr.op[1] = expr2;
+ return add;
+ } /* }}} */
+
+ /* ADD */
+ static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */
+ return new_expr2("add", OPR_ADD, expr1, expr2);
+ }
+ static void precommit_add(NodeType *add) {
+ precommit_expr(add,"add",INSTR_ADD);
+ } /* }}} */
+
+ /* SUB */
+ static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */
+ return new_expr2("sub", OPR_SUB, expr1, expr2);
+ }
+ static void precommit_sub(NodeType *sub) {
+ precommit_expr(sub,"sub",INSTR_SUB);
+ } /* }}} */
+
+ /* NEG */
+ static NodeType *new_neg(NodeType *expr) { /* {{{ */
+ NodeType *zeroConst = NULL;
+ if (expr->type == CONST_INT_NODE)
+ zeroConst = new_constInt("0", currentGoomSL->num_lines);
+ else if (expr->type == CONST_FLOAT_NODE)
+ zeroConst = new_constFloat("0.0", currentGoomSL->num_lines);
+ else if (expr->type == CONST_PTR_NODE) {
+ fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n",
+ currentGoomSL->num_lines);
+ exit(1);
+ }
+ else {
+ int type = gsl_type_of_var(expr->vnamespace, expr->str);
+ if (type == INSTR_FLOAT)
+ zeroConst = new_constFloat("0.0", currentGoomSL->num_lines);
+ else if (type == INSTR_PTR) {
+ fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n",
+ currentGoomSL->num_lines);
+ exit(1);
+ }
+ else if (type == INSTR_INT)
+ zeroConst = new_constInt("0", currentGoomSL->num_lines);
+ else if (type == -1) {
+ fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n",
+ expr->line_number, expr->unode.opr.op[0]->str);
+ exit(1);
+ }
+ else { /* type is a struct_id */
+ fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n",
+ expr->line_number, expr->str);
+ exit(1);
+ }
+ }
+ return new_expr2("sub", OPR_SUB, zeroConst, expr);
+ }
+ /* }}} */
+
+ /* MUL */
+ static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */
+ return new_expr2("mul", OPR_MUL, expr1, expr2);
+ }
+ static void precommit_mul(NodeType *mul) {
+ precommit_expr(mul,"mul",INSTR_MUL);
+ } /* }}} */
+
+ /* DIV */
+ static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */
+ return new_expr2("div", OPR_DIV, expr1, expr2);
+ }
+ static void precommit_div(NodeType *mul) {
+ precommit_expr(mul,"div",INSTR_DIV);
+ } /* }}} */
+
+ /* CALL EXPRESSION */
+ static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */
+ NodeType *call = new_call(name,affect_list);
+ NodeType *node = new_expr1(name, OPR_CALL_EXPR, call);
+ node->vnamespace = gsl_find_namespace(name);
+ if (node->vnamespace == NULL)
+ fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name);
+ return node;
+ }
+ static void precommit_call_expr(NodeType *call) {
+ char stmp[256];
+ NodeType *tmp,*tmpcpy;
+ int type = gsl_type_of_var(call->vnamespace, call->str);
+ if (type == INSTR_FLOAT) {
+ sprintf(stmp,"_f_tmp_%i",allocateTemp());
+ gsl_float_decl_global(stmp);
+ }
+ else if (type == INSTR_PTR) {
+ sprintf(stmp,"_p_tmp_%i",allocateTemp());
+ gsl_ptr_decl_global(stmp);
+ }
+ else if (type == INSTR_INT) {
+ sprintf(stmp,"_i_tmp_%i",allocateTemp());
+ gsl_int_decl_global(stmp);
+ }
+ else if (type == -1) {
+ fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n",
+ call->line_number, call->str);
+ exit(1);
+ }
+ else { /* type is a struct_id */
+ sprintf(stmp,"_s_tmp_%i",allocateTemp());
+ gsl_struct_decl_global_from_id(stmp,type);
+ }
+ tmp = new_var(stmp,call->line_number);
+ commit_node(call->unode.opr.op[0],0);
+ tmpcpy = nodeClone(tmp);
+ commit_node(new_set(tmp,new_var(call->str,call->line_number)),0);
+
+ nodeFreeInternals(call);
+ *call = *tmpcpy;
+ free(tmpcpy);
+ } /* }}} */
+
+ static void commit_test2(NodeType *set,const char *type, int instr)
+ { /* {{{ */
+ NodeType *tmp;
+ char stmp[256];
+ precommit_node(set->unode.opr.op[0]);
+ precommit_node(set->unode.opr.op[1]);
+ tmp = set->unode.opr.op[0];
+
+ stmp[0] = 0;
+ if (set->unode.opr.op[0]->type == CONST_INT_NODE) {
+ sprintf(stmp,"_i_tmp_%i",allocateTemp());
+ gsl_int_decl_global(stmp);
+ }
+ else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) {
+ sprintf(stmp,"_f_tmp%i",allocateTemp());
+ gsl_float_decl_global(stmp);
+ }
+ else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) {
+ sprintf(stmp,"_p_tmp%i",allocateTemp());
+ gsl_ptr_decl_global(stmp);
+ }
+ if (stmp[0]) {
+ NodeType *tmpcpy;
+ tmp = new_var(stmp, set->line_number);
+ tmpcpy = nodeClone(tmp);
+ commit_node(new_set(tmp,set->unode.opr.op[0]),0);
+ tmp = tmpcpy;
+ }
+
+#ifdef VERBOSE
+ printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str);
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number);
+ commit_node(tmp,instr!=INSTR_SET);
+ commit_node(set->unode.opr.op[1],1);
+ } /* }}} */
+
+ /* NOT */
+ static NodeType *new_not(NodeType *expr1) { /* {{{ */
+ return new_expr1("not", OPR_NOT, expr1);
+ }
+ static void commit_not(NodeType *set)
+ {
+ commit_node(set->unode.opr.op[0],0);
+#ifdef VERBOSE
+ printf("not\n");
+#endif
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL);
+ } /* }}} */
+
+ /* EQU */
+ static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */
+ return new_expr2("isequal", OPR_EQU, expr1, expr2);
+ }
+ static void commit_equ(NodeType *mul) {
+ commit_test2(mul,"isequal",INSTR_ISEQUAL);
+ } /* }}} */
+
+ /* INF */
+ static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */
+ return new_expr2("islower", OPR_LOW, expr1, expr2);
+ }
+ static void commit_low(NodeType *mul) {
+ commit_test2(mul,"islower",INSTR_ISLOWER);
+ } /* }}} */
+
+ /* WHILE */
+ static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */
+ NodeType *node = new_op("while", OPR_WHILE, 2);
+ node->unode.opr.op[0] = expression;
+ node->unode.opr.op[1] = instr;
+ return node;
+ }
+
+ static void commit_while(NodeType *node)
+ {
+ int lbl = allocateLabel();
+ char start_while[1024], test_while[1024];
+ sprintf(start_while, "|start_while_%d|", lbl);
+ sprintf(test_while, "|test_while_%d|", lbl);
+
+ GSL_PUT_JUMP(test_while,node->line_number);
+ GSL_PUT_LABEL(start_while,node->line_number);
+
+ /* code */
+ commit_node(node->unode.opr.op[1],0);
+
+ GSL_PUT_LABEL(test_while,node->line_number);
+ commit_node(node->unode.opr.op[0],0);
+ GSL_PUT_JNZERO(start_while,node->line_number);
+ } /* }}} */
+
+ /* FOR EACH */
+ static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */
+ NodeType *node = new_op("for", OPR_FOREACH, 3);
+ node->unode.opr.op[0] = var;
+ node->unode.opr.op[1] = var_list;
+ node->unode.opr.op[2] = instr;
+ node->line_number = currentGoomSL->num_lines;
+ return node;
+ }
+ static void commit_foreach(NodeType *node)
+ {
+ NodeType *cur = node->unode.opr.op[1];
+ char tmp_func[256], tmp_loop[256];
+ int lbl = allocateLabel();
+ sprintf(tmp_func, "|foreach_func_%d|", lbl);
+ sprintf(tmp_loop, "|foreach_loop_%d|", lbl);
+
+ GSL_PUT_JUMP(tmp_loop, node->line_number);
+ GSL_PUT_LABEL(tmp_func, node->line_number);
+
+ precommit_node(node->unode.opr.op[2]);
+ commit_node(node->unode.opr.op[2], 0);
+
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL);
+#ifdef VERBOSE
+ printf("ret\n");
+#endif
+
+ GSL_PUT_LABEL(tmp_loop, node->line_number);
+
+ while (cur != NULL)
+ {
+ NodeType *x, *var;
+
+ /* 1: x=var */
+ x = nodeClone(node->unode.opr.op[0]);
+ var = nodeClone(cur->unode.opr.op[0]);
+ commit_node(new_set(x, var),0);
+
+ /* 2: instr */
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL);
+#ifdef VERBOSE
+ printf("call %s\n", tmp_func);
+#endif
+
+ /* 3: var=x */
+ x = nodeClone(node->unode.opr.op[0]);
+ var = cur->unode.opr.op[0];
+ commit_node(new_set(var, x),0);
+ cur = cur->unode.opr.op[1];
+ }
+ nodeFree(node->unode.opr.op[0]);
+ } /* }}} */
+
+ /* IF */
+ static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */
+ NodeType *node = new_op("if", OPR_IF, 2);
+ node->unode.opr.op[0] = expression;
+ node->unode.opr.op[1] = instr;
+ return node;
+ }
+ static void commit_if(NodeType *node) {
+
+ char slab[1024];
+ sprintf(slab, "|eif%d|", allocateLabel());
+ commit_node(node->unode.opr.op[0],0);
+ GSL_PUT_JZERO(slab,node->line_number);
+ /* code */
+ commit_node(node->unode.opr.op[1],0);
+ GSL_PUT_LABEL(slab,node->line_number);
+ } /* }}} */
+
+ /* BLOCK */
+ static NodeType *new_block(NodeType *lastNode) { /* {{{ */
+ NodeType *blk = new_op("block", OPR_BLOCK, 2);
+ blk->unode.opr.op[0] = new_nop("start_of_block");
+ blk->unode.opr.op[1] = lastNode;
+ return blk;
+ }
+ static void commit_block(NodeType *node) {
+ commit_node(node->unode.opr.op[0]->unode.opr.next,0);
+ } /* }}} */
+
+ /* FUNCTION INTRO */
+ static NodeType *new_function_intro(const char *name) { /* {{{ */
+ char stmp[256];
+ if (strlen(name) < 200) {
+ sprintf(stmp, "|__func_%s|", name);
+ }
+ return new_op(stmp, OPR_FUNC_INTRO, 0);
+ }
+ static void commit_function_intro(NodeType *node) {
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL);
+#ifdef VERBOSE
+ printf("label %s\n", node->str);
+#endif
+ } /* }}} */
+
+ /* FUNCTION OUTRO */
+ static NodeType *new_function_outro() { /* {{{ */
+ return new_op("ret", OPR_FUNC_OUTRO, 0);
+ }
+ static void commit_function_outro(NodeType *node) {
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL);
+ releaseAllTemps();
+#ifdef VERBOSE
+ printf("ret\n");
+#endif
+ } /* }}} */
+
+ /* AFFECTATION LIST */
+ static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */
+ {
+ NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2);
+ node->unode.opr.op[0] = set;
+ node->unode.opr.op[1] = next;
+ return node;
+ }
+ static NodeType *new_affect_list_after(NodeType *affect_list)
+ {
+ NodeType *ret = NULL;
+ NodeType *cur = affect_list;
+ while(cur != NULL) {
+ NodeType *set = cur->unode.opr.op[0];
+ NodeType *next = cur->unode.opr.op[1];
+ NodeType *lvalue = set->unode.opr.op[0];
+ NodeType *expression = set->unode.opr.op[1];
+ if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) {
+ NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue));
+ ret = new_affec_list(nset, ret);
+ }
+ cur = next;
+ }
+ return ret;
+ }
+ static void commit_affect_list(NodeType *node)
+ {
+ NodeType *cur = node;
+ while(cur != NULL) {
+ NodeType *set = cur->unode.opr.op[0];
+ precommit_node(set->unode.opr.op[0]);
+ precommit_node(set->unode.opr.op[1]);
+ cur = cur->unode.opr.op[1];
+ }
+ cur = node;
+ while(cur != NULL) {
+ NodeType *set = cur->unode.opr.op[0];
+ commit_node(set,0);
+ cur = cur->unode.opr.op[1];
+ }
+ } /* }}} */
+
+ /* VAR LIST */
+ static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */
+ {
+ NodeType *node = new_op("var_list", OPR_VAR_LIST, 2);
+ node->unode.opr.op[0] = var;
+ node->unode.opr.op[1] = next;
+ return node;
+ }
+ static void commit_var_list(NodeType *node)
+ {
+ } /* }}} */
+
+ /* FUNCTION CALL */
+ static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */
+ HashValue *fval;
+ fval = goom_hash_get(currentGoomSL->functions, name);
+ if (!fval) {
+ gsl_declare_task(name);
+ fval = goom_hash_get(currentGoomSL->functions, name);
+ }
+ if (!fval) {
+ fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name);
+ exit(1);
+ return NULL;
+ }
+ else {
+ ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr;
+ if (gef->is_extern) {
+ NodeType *node = new_op(name, OPR_EXT_CALL, 1);
+ node->unode.opr.op[0] = affect_list;
+ return node;
+ }
+ else {
+ NodeType *node;
+ char stmp[256];
+ if (strlen(name) < 200) {
+ sprintf(stmp, "|__func_%s|", name);
+ }
+ node = new_op(stmp, OPR_CALL, 1);
+ node->unode.opr.op[0] = affect_list;
+ return node;
+ }
+ }
+ }
+ static void commit_ext_call(NodeType *node) {
+ NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]);
+ commit_node(node->unode.opr.op[0],0);
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR);
+#ifdef VERBOSE
+ printf("extcall %s\n", node->str);
+#endif
+ commit_node(alafter,0);
+ }
+ static void commit_call(NodeType *node) {
+ NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]);
+ commit_node(node->unode.opr.op[0],0);
+ currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number);
+ gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL);
+#ifdef VERBOSE
+ printf("call %s\n", node->str);
+#endif
+ commit_node(alafter,0);
+ } /* }}} */
+
+ /** **/
+
+ static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */
+ static NodeType *lastNode = 0;
+ static NodeType *gsl_append(NodeType *curNode) {
+ if (curNode == 0) return 0; /* {{{ */
+ if (lastNode)
+ lastNode->unode.opr.next = curNode;
+ lastNode = curNode;
+ while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next;
+ if (rootNode == 0)
+ rootNode = curNode;
+ return curNode;
+ } /* }}} */
+
+#if 1
+ int allocateTemp() {
+ return allocateLabel();
+ }
+ void releaseAllTemps() {}
+ void releaseTemp(int n) {}
+#else
+ static int nbTemp = 0;
+ static int *tempArray = 0;
+ static int tempArraySize = 0;
+ int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */
+ int i = 0; /* {{{ */
+ if (tempArray == 0) {
+ tempArraySize = 256;
+ tempArray = (int*)malloc(tempArraySize * sizeof(int));
+ }
+ while (1) {
+ int j;
+ for (j=0;j<nbTemp;++j) {
+ if (tempArray[j] == i) break;
+ }
+ if (j == nbTemp) {
+ if (nbTemp == tempArraySize) {
+ tempArraySize *= 2;
+ tempArray = (int*)realloc(tempArray,tempArraySize * sizeof(int));
+ }
+ tempArray[nbTemp++] = i;
+ return i;
+ }
+ i++;
+ }
+ } /* }}} */
+ void releaseAllTemps() {
+ nbTemp = 0; /* {{{ */
+ } /* }}} */
+ void releaseTemp(int n) {
+ int j; /* {{{ */
+ for (j=0;j<nbTemp;++j) {
+ if (tempArray[j] == n) {
+ tempArray[j] = tempArray[--nbTemp];
+ break;
+ }
+ }
+ } /* }}} */
+#endif
+
+ static int lastLabel = 0;
+ int allocateLabel() {
+ return ++lastLabel; /* {{{ */
+ } /* }}} */
+
+ void gsl_commit_compilation()
+ { /* {{{ */
+ commit_node(rootNode,0);
+ rootNode = 0;
+ lastNode = 0;
+ } /* }}} */
+
+ void precommit_node(NodeType *node)
+ { /* {{{ */
+ /* do here stuff for expression.. for exemple */
+ if (node->type == OPR_NODE)
+ switch(node->unode.opr.type) {
+ case OPR_ADD: precommit_add(node); break;
+ case OPR_SUB: precommit_sub(node); break;
+ case OPR_MUL: precommit_mul(node); break;
+ case OPR_DIV: precommit_div(node); break;
+ case OPR_CALL_EXPR: precommit_call_expr(node); break;
+ }
+ } /* }}} */
+
+ void commit_node(NodeType *node, int releaseIfTmp)
+ { /* {{{ */
+ if (node == 0) return;
+
+ switch(node->type) {
+ case OPR_NODE:
+ switch(node->unode.opr.type) {
+ case OPR_SET: commit_set(node); break;
+ case OPR_PLUS_EQ: commit_plus_eq(node); break;
+ case OPR_SUB_EQ: commit_sub_eq(node); break;
+ case OPR_MUL_EQ: commit_mul_eq(node); break;
+ case OPR_DIV_EQ: commit_div_eq(node); break;
+ case OPR_IF: commit_if(node); break;
+ case OPR_WHILE: commit_while(node); break;
+ case OPR_BLOCK: commit_block(node); break;
+ case OPR_FUNC_INTRO: commit_function_intro(node); break;
+ case OPR_FUNC_OUTRO: commit_function_outro(node); break;
+ case OPR_CALL: commit_call(node); break;
+ case OPR_EXT_CALL: commit_ext_call(node); break;
+ case OPR_EQU: commit_equ(node); break;
+ case OPR_LOW: commit_low(node); break;
+ case OPR_NOT: commit_not(node); break;
+ case OPR_AFFECT_LIST: commit_affect_list(node); break;
+ case OPR_FOREACH: commit_foreach(node); break;
+ case OPR_VAR_LIST: commit_var_list(node); break;
+#ifdef VERBOSE
+ case EMPTY_NODE: printf("NOP\n"); break;
+#endif
+ }
+
+ commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */
+ break;
+
+ case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace);
+ gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break;
+ case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break;
+ case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break;
+ case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break;
+ }
+ if (releaseIfTmp && is_tmp_expr(node))
+ releaseTemp(get_tmp_id(node));
+
+ nodeFree(node);
+ } /* }}} */
+
+ NodeType *nodeNew(const char *str, int type, int line_number) {
+ NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */
+ node->type = type;
+ node->str = (char*)malloc(strlen(str)+1);
+ node->vnamespace = NULL;
+ node->line_number = line_number;
+ strcpy(node->str, str);
+ return node;
+ } /* }}} */
+ static NodeType *nodeClone(NodeType *node) {
+ NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */
+ ret->vnamespace = node->vnamespace;
+ ret->unode = node->unode;
+ return ret;
+ } /* }}} */
+
+ void nodeFreeInternals(NodeType *node) {
+ free(node->str); /* {{{ */
+ } /* }}} */
+
+ void nodeFree(NodeType *node) {
+ nodeFreeInternals(node); /* {{{ */
+ free(node);
+ } /* }}} */
+
+ NodeType *new_constInt(const char *str, int line_number) {
+ NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */
+ node->unode.constInt.val = atoi(str);
+ return node;
+ } /* }}} */
+
+ NodeType *new_constPtr(const char *str, int line_number) {
+ NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */
+ node->unode.constPtr.id = strtol(str,NULL,0);
+ return node;
+ } /* }}} */
+
+ NodeType *new_constFloat(const char *str, int line_number) {
+ NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */
+ node->unode.constFloat.val = atof(str);
+ return node;
+ } /* }}} */
+
+ NodeType *new_var(const char *str, int line_number) {
+ NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */
+ node->vnamespace = gsl_find_namespace(str);
+ if (node->vnamespace == 0) {
+ fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str);
+ exit(1);
+ }
+ return node;
+ } /* }}} */
+
+ NodeType *new_nop(const char *str) {
+ NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */
+ return node;
+ } /* }}} */
+
+ NodeType *new_op(const char *str, int type, int nbOp) {
+ int i; /* {{{ */
+ NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines);
+ node->unode.opr.next = 0;
+ node->unode.opr.type = type;
+ node->unode.opr.nbOp = nbOp;
+ for (i=0;i<nbOp;++i) node->unode.opr.op[i] = 0;
+ return node;
+ } /* }}} */
+
+
+ void gsl_declare_global_variable(int type, char *name) {
+ switch(type){
+ case -1: break;
+ case FLOAT_TK:gsl_float_decl_global(name);break;
+ case INT_TK: gsl_int_decl_global(name);break;
+ case PTR_TK: gsl_ptr_decl_global(name);break;
+ default:
+ {
+ int id = type - 1000;
+ gsl_struct_decl_global_from_id(name,id);
+ }
+ }
+ }
+
+%}
+
+%union {
+ int intValue;
+ float floatValue;
+ char charValue;
+ char strValue[2048];
+ NodeType *nPtr;
+ GoomHash *namespace;
+ GSL_Struct *gsl_struct;
+ GSL_StructField *gsl_struct_field;
+ };
+
+%token <strValue> LTYPE_INTEGER
+%token <strValue> LTYPE_FLOAT
+%token <strValue> LTYPE_VAR
+%token <strValue> LTYPE_PTR
+
+%token PTR_TK INT_TK FLOAT_TK DECLARE EXTERNAL WHILE DO NOT PLUS_EQ SUB_EQ DIV_EQ MUL_EQ SUP_EQ LOW_EQ NOT_EQ STRUCT FOR IN
+
+%type <intValue> return_type
+%type <nPtr> expression constValue instruction test func_call func_call_expression
+%type <nPtr> start_block affectation_list affectation_in_list affectation declaration
+%type <nPtr> var_list_content var_list
+%type <strValue> task_name ext_task_name
+%type <namespace> leave_namespace
+%type <gsl_struct> struct_members
+%type <gsl_struct_field> struct_member
+%left '\n'
+%left PLUS_EQ SUB_EQ MUL_EQ DIV_EQ
+%left NOT
+%left '=' '<' '>'
+%left '+' '-'
+%left '/' '*'
+
+%%
+
+/* -------------- Global architechture of a GSL program ------------*/
+
+gsl: gsl_code function_outro gsl_def_functions ;
+
+gsl_code: gsl_code instruction { gsl_append($2); }
+ | gsl_code EXTERNAL '<' ext_task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); }
+ | gsl_code EXTERNAL '<' ext_task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); }
+ | gsl_code DECLARE '<' task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); }
+ | gsl_code DECLARE '<' task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); }
+ | gsl_code struct_declaration
+ | gsl_code '\n'
+ |
+ ;
+
+/* ------------- Declaration of a structure ------------ */
+
+struct_declaration: STRUCT '<' LTYPE_VAR ':' struct_members '>' '\n' { gsl_add_struct($3, $5); }
+ ;
+
+struct_members: opt_nl struct_member { $$ = gsl_new_struct($2); }
+ | struct_members ',' opt_nl struct_member { $$ = $1; gsl_add_struct_field($1, $4); }
+ ;
+
+struct_member: INT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_INT); }
+ | FLOAT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_FLOAT); }
+ | PTR_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_PTR); }
+ | LTYPE_VAR LTYPE_VAR { $$ = gsl_new_struct_field_struct($2, $1); }
+ ;
+
+/* ------------- Fonction declarations -------------- */
+
+ext_task_name: LTYPE_VAR { gsl_declare_external_task($1); gsl_enternamespace($1); strcpy($$,$1); }
+ ;
+task_name: LTYPE_VAR { gsl_declare_task($1); gsl_enternamespace($1); strcpy($$,$1); strcpy($$,$1); }
+ ;
+
+return_type: { $$=-1; }
+ | ':' INT_TK { $$=INT_TK; }
+ | ':' FLOAT_TK { $$=FLOAT_TK; }
+ | ':' PTR_TK { $$=PTR_TK; }
+ | ':' LTYPE_VAR { $$= 1000 + gsl_get_struct_id($2); }
+ ;
+
+arglist: empty_declaration
+ | empty_declaration ',' arglist
+ ;
+
+/* ------------- Fonction definition -------------- */
+
+gsl_def_functions: gsl_def_functions function
+ |
+ ;
+
+function: function_intro gsl_code function_outro { gsl_leavenamespace(); }
+
+function_intro: '<' task_name '>' return_type '\n' { gsl_append(new_function_intro($2));
+ gsl_declare_global_variable($4,$2); }
+ | '<' task_name ':' arglist '>' return_type '\n' { gsl_append(new_function_intro($2));
+ gsl_declare_global_variable($6,$2); }
+ ;
+function_outro: { gsl_append(new_function_outro()); } ;
+
+leave_namespace: { $$ = gsl_leavenamespace(); };
+
+/* ------------ Variable declaration ---------------- */
+
+declaration: FLOAT_TK LTYPE_VAR '=' expression { gsl_float_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); }
+ | INT_TK LTYPE_VAR '=' expression { gsl_int_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); }
+ | PTR_TK LTYPE_VAR '=' expression { gsl_ptr_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); }
+ | LTYPE_VAR LTYPE_VAR '=' expression { gsl_struct_decl_local($1,$2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); }
+ | empty_declaration { $$ = 0; }
+ ;
+
+empty_declaration: FLOAT_TK LTYPE_VAR { gsl_float_decl_local($2); }
+ | INT_TK LTYPE_VAR { gsl_int_decl_local($2); }
+ | PTR_TK LTYPE_VAR { gsl_ptr_decl_local($2); }
+ | LTYPE_VAR LTYPE_VAR { gsl_struct_decl_local($1,$2); }
+ ;
+
+/* -------------- Instructions and Expressions ------------------ */
+
+instruction: affectation '\n' { $$ = $1; }
+ | declaration '\n' { $$ = $1; }
+ | '(' test ')' '?' opt_nl instruction { $$ = new_if($2,$6); }
+ | WHILE test opt_nl DO opt_nl instruction { $$ = new_while($2,$6); }
+ | '{' '\n' start_block gsl_code '}' '\n' { lastNode = $3->unode.opr.op[1]; $$=$3; }
+ | func_call { $$ = $1; }
+ | LTYPE_VAR PLUS_EQ expression { $$ = new_plus_eq(new_var($1,currentGoomSL->num_lines),$3); }
+ | LTYPE_VAR SUB_EQ expression { $$ = new_sub_eq(new_var($1,currentGoomSL->num_lines),$3); }
+ | LTYPE_VAR MUL_EQ expression { $$ = new_mul_eq(new_var($1,currentGoomSL->num_lines),$3); }
+ | LTYPE_VAR DIV_EQ expression { $$ = new_div_eq(new_var($1,currentGoomSL->num_lines),$3); }
+ | FOR LTYPE_VAR IN var_list DO instruction { $$ = new_static_foreach(new_var($2, currentGoomSL->num_lines), $4, $6); }
+ ;
+
+var_list: '(' var_list_content ')' { $$ = $2; }
+ ;
+var_list_content: LTYPE_VAR { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), NULL); }
+ | LTYPE_VAR var_list_content { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), $2); }
+ ;
+
+affectation: LTYPE_VAR '=' expression { $$ = new_set(new_var($1,currentGoomSL->num_lines),$3); } ;
+
+start_block: { $$ = new_block(lastNode); lastNode = $$->unode.opr.op[0]; }
+ ;
+
+expression: LTYPE_VAR { $$ = new_var($1,currentGoomSL->num_lines); }
+ | constValue { $$ = $1; }
+ | expression '*' expression { $$ = new_mul($1,$3); }
+ | expression '/' expression { $$ = new_div($1,$3); }
+ | expression '+' expression { $$ = new_add($1,$3); }
+ | expression '-' expression { $$ = new_sub($1,$3); }
+ | '-' expression { $$ = new_neg($2); }
+ | '(' expression ')' { $$ = $2; }
+ | func_call_expression { $$ = $1; }
+ ;
+
+test: expression '=' expression { $$ = new_equ($1,$3); }
+ | expression '<' expression { $$ = new_low($1,$3); }
+ | expression '>' expression { $$ = new_low($3,$1); }
+ | expression SUP_EQ expression { $$ = new_not(new_low($1,$3)); }
+ | expression LOW_EQ expression { $$ = new_not(new_low($3,$1)); }
+ | expression NOT_EQ expression { $$ = new_not(new_equ($1,$3)); }
+ | NOT test { $$ = new_not($2); }
+ ;
+
+constValue: LTYPE_FLOAT { $$ = new_constFloat($1,currentGoomSL->num_lines); }
+ | LTYPE_INTEGER { $$ = new_constInt($1,currentGoomSL->num_lines); }
+ | LTYPE_PTR { $$ = new_constPtr($1,currentGoomSL->num_lines); }
+ ;
+
+/* ---------------- Function Calls ------------------ */
+
+func_call: task_name '\n' leave_namespace { $$ = new_call($1,NULL); }
+ | task_name ':' affectation_list '\n' leave_namespace { $$ = new_call($1,$3); }
+ | '[' task_name ']' '\n' leave_namespace { $$ = new_call($2,NULL); }
+ | '[' task_name ':' affectation_list ']' '\n' leave_namespace { $$ = new_call($2,$4); }
+ ;
+
+func_call_expression:
+ '[' task_name leave_namespace ']' { $$ = new_call_expr($2,NULL); }
+ | '[' task_name ':' affectation_list ']' leave_namespace { $$ = new_call_expr($2,$4); }
+ ;
+
+affectation_list: affectation_in_list affectation_list { $$ = new_affec_list($1,$2); }
+ | affectation_in_list { $$ = new_affec_list($1,NULL); }
+
+affectation_in_list: LTYPE_VAR '=' leave_namespace expression {
+ gsl_reenternamespace($3);
+ $$ = new_set(new_var($1,currentGoomSL->num_lines),$4);
+ }
+ | ':' leave_namespace expression {
+ gsl_reenternamespace($2);
+ $$ = new_set(new_var("&this", currentGoomSL->num_lines),$3);
+ }
+ ;
+
+
+/* ------------ Misc ---------- */
+
+opt_nl: '\n' | ;
+
+
+%%
+
+
+void yyerror(char *str)
+{ /* {{{ */
+ fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str);
+ currentGoomSL->compilationOK = 0;
+ exit(1);
+} /* }}} */
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/graphic.c b/src/visualizations/Goom/goom2k4-0/src/graphic.c
new file mode 100644
index 0000000000..2ee71a6dd0
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/graphic.c
@@ -0,0 +1,10 @@
+#include "goom_graphic.h"
+
+const Color BLACK = { 0, 0, 0 };
+const Color WHITE = { 0xff, 0xff, 0xff };
+const Color RED = { 0xff, 0x05, 0x05 };
+const Color GREEN = { 0x05, 0xff, 0x05 };
+const Color BLUE = { 0x05, 0x05, 0xff };
+const Color YELLOW = { 0xff, 0xff, 0x33 };
+const Color ORANGE = { 0xff, 0xcc, 0x05 };
+const Color VIOLET = { 0x55, 0x05, 0xff };
diff --git a/src/visualizations/Goom/goom2k4-0/src/ifs.c b/src/visualizations/Goom/goom2k4-0/src/ifs.c
new file mode 100644
index 0000000000..968535e3b0
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/ifs.c
@@ -0,0 +1,763 @@
+/*
+ * ifs.c --- modified iterated functions system for goom.
+ */
+
+/*-
+ * Copyright (c) 1997 by Massimino Pascal <Pascal.Massimon@ens.fr>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * If this mode is weird and you have an old MetroX server, it is buggy.
+ * There is a free SuSE-enhanced MetroX X server that is fine.
+ *
+ * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing."
+ *
+ * Revision History:
+ * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX).
+ * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added)
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: jwz@jwz.org: turned into a standalone program.
+ * Made it render into an offscreen bitmap and then copy
+ * that onto the screen, to reduce flicker.
+ */
+
+/* #ifdef STANDALONE */
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "goom_config.h"
+
+#ifdef HAVE_MMX
+#include "mmx.h"
+#endif
+
+#include "goom_graphic.h"
+#include "ifs.h"
+#include "goom_tools.h"
+
+typedef struct _ifsPoint
+{
+ gint32 x, y;
+}
+IFSPoint;
+
+
+#define MODE_ifs
+
+#define PROGCLASS "IFS"
+
+#define HACK_INIT init_ifs
+#define HACK_DRAW draw_ifs
+
+#define ifs_opts xlockmore_opts
+
+#define DEFAULTS "*delay: 20000 \n" \
+"*ncolors: 100 \n"
+
+#define SMOOTH_COLORS
+
+#define LRAND() ((long) (goom_random(goomInfo->gRandom) & 0x7fffffff))
+#define NRAND(n) ((int) (LRAND() % (n)))
+
+#if RAND_MAX < 0x10000
+#define MAXRAND (((float)(RAND_MAX<16)+((float)RAND_MAX)+1.0f)/127.0f)
+#else
+#define MAXRAND (2147483648.0/127.0) /* unsigned 1<<31 / 127.0 (cf goom_tools) as a float */
+#endif
+
+/*****************************************************/
+
+typedef float DBL;
+typedef int F_PT;
+
+/* typedef float F_PT; */
+
+/*****************************************************/
+
+#define FIX 12
+#define UNIT ( 1<<FIX )
+#define MAX_SIMI 6
+
+#define MAX_DEPTH_2 10
+#define MAX_DEPTH_3 6
+#define MAX_DEPTH_4 4
+#define MAX_DEPTH_5 2
+
+/* PREVIOUS VALUE
+#define MAX_SIMI 6
+
+ * settings for a PC 120Mhz... *
+#define MAX_DEPTH_2 10
+#define MAX_DEPTH_3 6
+#define MAX_DEPTH_4 4
+#define MAX_DEPTH_5 3
+*/
+
+#define DBL_To_F_PT(x) (F_PT)( (DBL)(UNIT)*(x) )
+
+typedef struct Similitude_Struct SIMI;
+typedef struct Fractal_Struct FRACTAL;
+
+struct Similitude_Struct
+{
+
+ DBL c_x, c_y;
+ DBL r, r2, A, A2;
+ F_PT Ct, St, Ct2, St2;
+ F_PT Cx, Cy;
+ F_PT R, R2;
+};
+
+
+struct Fractal_Struct
+{
+
+ int Nb_Simi;
+ SIMI Components[5 * MAX_SIMI];
+ int Depth, Col;
+ int Count, Speed;
+ int Width, Height, Lx, Ly;
+ DBL r_mean, dr_mean, dr2_mean;
+ int Cur_Pt, Max_Pt;
+
+ IFSPoint *Buffer1, *Buffer2;
+};
+
+typedef struct _IFS_DATA {
+ FRACTAL *Root;
+ FRACTAL *Cur_F;
+
+ /* Used by the Trace recursive method */
+ IFSPoint *Buf;
+ int Cur_Pt;
+ int initalized;
+} IfsData;
+
+
+/*****************************************************/
+
+static DBL
+Gauss_Rand (PluginInfo *goomInfo, DBL c, DBL A, DBL S)
+{
+ DBL y;
+
+ y = (DBL) LRAND () / MAXRAND;
+ y = A * (1.0 - exp (-y * y * S)) / (1.0 - exp (-S));
+ if (NRAND (2))
+ return (c + y);
+ return (c - y);
+}
+
+static DBL
+Half_Gauss_Rand (PluginInfo *goomInfo, DBL c, DBL A, DBL S)
+{
+ DBL y;
+
+ y = (DBL) LRAND () / MAXRAND;
+ y = A * (1.0 - exp (-y * y * S)) / (1.0 - exp (-S));
+ return (c + y);
+}
+
+static void
+Random_Simis (PluginInfo *goomInfo, FRACTAL * F, SIMI * Cur, int i)
+{
+ while (i--) {
+ Cur->c_x = Gauss_Rand (goomInfo, 0.0, .8, 4.0);
+ Cur->c_y = Gauss_Rand (goomInfo, 0.0, .8, 4.0);
+ Cur->r = Gauss_Rand (goomInfo, F->r_mean, F->dr_mean, 3.0);
+ Cur->r2 = Half_Gauss_Rand (goomInfo, 0.0, F->dr2_mean, 2.0);
+ Cur->A = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0);
+ Cur->A2 = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0);
+ Cur++;
+ }
+}
+
+static void
+free_ifs_buffers (FRACTAL * Fractal)
+{
+ if (Fractal->Buffer1 != NULL) {
+ (void) free ((void *) Fractal->Buffer1);
+ Fractal->Buffer1 = (IFSPoint *) NULL;
+ }
+ if (Fractal->Buffer2 != NULL) {
+ (void) free ((void *) Fractal->Buffer2);
+ Fractal->Buffer2 = (IFSPoint *) NULL;
+ }
+}
+
+
+static void
+free_ifs (FRACTAL * Fractal)
+{
+ free_ifs_buffers (Fractal);
+}
+
+/***************************************************************/
+
+static void
+init_ifs (PluginInfo *goomInfo, IfsData *data)
+{
+ int i;
+ FRACTAL *Fractal;
+ int width = goomInfo->screen.width;
+ int height = goomInfo->screen.height;
+
+ if (data->Root == NULL) {
+ data->Root = (FRACTAL *) malloc (sizeof (FRACTAL));
+ if (data->Root == NULL)
+ return;
+ data->Root->Buffer1 = (IFSPoint *) NULL;
+ data->Root->Buffer2 = (IFSPoint *) NULL;
+ }
+ Fractal = data->Root;
+
+ free_ifs_buffers (Fractal);
+
+ i = (NRAND (4)) + 2; /* Number of centers */
+ switch (i) {
+ case 3:
+ Fractal->Depth = MAX_DEPTH_3;
+ Fractal->r_mean = .6;
+ Fractal->dr_mean = .4;
+ Fractal->dr2_mean = .3;
+ break;
+
+ case 4:
+ Fractal->Depth = MAX_DEPTH_4;
+ Fractal->r_mean = .5;
+ Fractal->dr_mean = .4;
+ Fractal->dr2_mean = .3;
+ break;
+
+ case 5:
+ Fractal->Depth = MAX_DEPTH_5;
+ Fractal->r_mean = .5;
+ Fractal->dr_mean = .4;
+ Fractal->dr2_mean = .3;
+ break;
+
+ default:
+ case 2:
+ Fractal->Depth = MAX_DEPTH_2;
+ Fractal->r_mean = .7;
+ Fractal->dr_mean = .3;
+ Fractal->dr2_mean = .4;
+ break;
+ }
+ Fractal->Nb_Simi = i;
+ Fractal->Max_Pt = Fractal->Nb_Simi - 1;
+ for (i = 0; i <= Fractal->Depth + 2; ++i)
+ Fractal->Max_Pt *= Fractal->Nb_Simi;
+
+ if ((Fractal->Buffer1 = (IFSPoint *) calloc (Fractal->Max_Pt,
+ sizeof (IFSPoint))) == NULL) {
+ free_ifs (Fractal);
+ return;
+ }
+ if ((Fractal->Buffer2 = (IFSPoint *) calloc (Fractal->Max_Pt,
+ sizeof (IFSPoint))) == NULL) {
+ free_ifs (Fractal);
+ return;
+ }
+
+ Fractal->Speed = 6;
+ Fractal->Width = width; /* modif by JeKo */
+ Fractal->Height = height; /* modif by JeKo */
+ Fractal->Cur_Pt = 0;
+ Fractal->Count = 0;
+ Fractal->Lx = (Fractal->Width - 1) / 2;
+ Fractal->Ly = (Fractal->Height - 1) / 2;
+ Fractal->Col = rand () % (width * height); /* modif by JeKo */
+
+ Random_Simis (goomInfo, Fractal, Fractal->Components, 5 * MAX_SIMI);
+}
+
+
+/***************************************************************/
+
+static inline void
+Transform (SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y)
+{
+ F_PT xx, yy;
+
+ xo = xo - Simi->Cx;
+ xo = (xo * Simi->R) >> FIX; /* / UNIT; */
+ yo = yo - Simi->Cy;
+ yo = (yo * Simi->R) >> FIX; /* / UNIT; */
+
+ xx = xo - Simi->Cx;
+ xx = (xx * Simi->R2) >> FIX; /* / UNIT; */
+ yy = -yo - Simi->Cy;
+ yy = (yy * Simi->R2) >> FIX; /* / UNIT; */
+
+ *x =
+ ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2)
+ >> FIX /* / UNIT */ ) + Simi->Cx;
+ *y =
+ ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2)
+ >> FIX /* / UNIT */ ) + Simi->Cy;
+}
+
+/***************************************************************/
+
+static void
+Trace (FRACTAL * F, F_PT xo, F_PT yo, IfsData *data)
+{
+ F_PT x, y, i;
+ SIMI *Cur;
+
+ Cur = data->Cur_F->Components;
+ for (i = data->Cur_F->Nb_Simi; i; --i, Cur++) {
+ Transform (Cur, xo, yo, &x, &y);
+
+ data->Buf->x = F->Lx + ((x * F->Lx) >> (FIX+1) /* /(UNIT*2) */ );
+ data->Buf->y = F->Ly - ((y * F->Ly) >> (FIX+1) /* /(UNIT*2) */ );
+ data->Buf++;
+
+ data->Cur_Pt++;
+
+ if (F->Depth && ((x - xo) >> 4) && ((y - yo) >> 4)) {
+ F->Depth--;
+ Trace (F, x, y, data);
+ F->Depth++;
+ }
+ }
+}
+
+static void
+Draw_Fractal (IfsData *data)
+{
+ FRACTAL *F = data->Root;
+ int i, j;
+ F_PT x, y, xo, yo;
+ SIMI *Cur, *Simi;
+
+ for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) {
+ Cur->Cx = DBL_To_F_PT (Cur->c_x);
+ Cur->Cy = DBL_To_F_PT (Cur->c_y);
+
+ Cur->Ct = DBL_To_F_PT (cos (Cur->A));
+ Cur->St = DBL_To_F_PT (sin (Cur->A));
+ Cur->Ct2 = DBL_To_F_PT (cos (Cur->A2));
+ Cur->St2 = DBL_To_F_PT (sin (Cur->A2));
+
+ Cur->R = DBL_To_F_PT (Cur->r);
+ Cur->R2 = DBL_To_F_PT (Cur->r2);
+ }
+
+
+ data->Cur_Pt = 0;
+ data->Cur_F = F;
+ data->Buf = F->Buffer2;
+ for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) {
+ xo = Cur->Cx;
+ yo = Cur->Cy;
+ for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) {
+ if (Simi == Cur)
+ continue;
+ Transform (Simi, xo, yo, &x, &y);
+ Trace (F, x, y, data);
+ }
+ }
+
+ /* Erase previous */
+
+ F->Cur_Pt = data->Cur_Pt;
+ data->Buf = F->Buffer1;
+ F->Buffer1 = F->Buffer2;
+ F->Buffer2 = data->Buf;
+}
+
+
+static IFSPoint *
+draw_ifs (PluginInfo *goomInfo, int *nbpt, IfsData *data)
+{
+ int i;
+ DBL u, uu, v, vv, u0, u1, u2, u3;
+ SIMI *S, *S1, *S2, *S3, *S4;
+ FRACTAL *F;
+
+ if (data->Root == NULL)
+ return NULL;
+ F = data->Root;
+ if (F->Buffer1 == NULL)
+ return NULL;
+
+ u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0;
+ uu = u * u;
+ v = 1.0 - u;
+ vv = v * v;
+ u0 = vv * v;
+ u1 = 3.0 * vv * u;
+ u2 = 3.0 * v * uu;
+ u3 = u * uu;
+
+ S = F->Components;
+ S1 = S + F->Nb_Simi;
+ S2 = S1 + F->Nb_Simi;
+ S3 = S2 + F->Nb_Simi;
+ S4 = S3 + F->Nb_Simi;
+
+ for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) {
+ S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x;
+ S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y;
+ S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r;
+ S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2;
+ S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A;
+ S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2;
+ }
+
+ Draw_Fractal (data);
+
+ if (F->Count >= 1000 / F->Speed) {
+ S = F->Components;
+ S1 = S + F->Nb_Simi;
+ S2 = S1 + F->Nb_Simi;
+ S3 = S2 + F->Nb_Simi;
+ S4 = S3 + F->Nb_Simi;
+
+ for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) {
+ S2->c_x = 2.0 * S4->c_x - S3->c_x;
+ S2->c_y = 2.0 * S4->c_y - S3->c_y;
+ S2->r = 2.0 * S4->r - S3->r;
+ S2->r2 = 2.0 * S4->r2 - S3->r2;
+ S2->A = 2.0 * S4->A - S3->A;
+ S2->A2 = 2.0 * S4->A2 - S3->A2;
+
+ *S1 = *S4;
+ }
+ Random_Simis (goomInfo, F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi);
+
+ Random_Simis (goomInfo, F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi);
+
+ F->Count = 0;
+ }
+ else
+ F->Count++;
+
+ F->Col++;
+
+ (*nbpt) = data->Cur_Pt;
+ return F->Buffer2;
+}
+
+
+/***************************************************************/
+
+static void release_ifs (IfsData *data)
+{
+ if (data->Root != NULL) {
+ free_ifs (data->Root);
+ (void) free ((void *) data->Root);
+ data->Root = (FRACTAL *) NULL;
+ }
+}
+
+#define RAND() goom_random(goomInfo->gRandom)
+
+static void ifs_update (PluginInfo *goomInfo, Pixel * data, Pixel * back, int increment, IfsData *fx_data)
+{
+ static int couleur = 0xc0c0c0c0;
+ static int v[4] = { 2, 4, 3, 2 };
+ static int col[4] = { 2, 4, 3, 2 };
+
+#define MOD_MER 0
+#define MOD_FEU 1
+#define MOD_MERVER 2
+ static int mode = MOD_MERVER;
+ static int justChanged = 0;
+ static int cycle = 0;
+ int cycle10;
+
+ int nbpt;
+ IFSPoint *points;
+ int i;
+
+ int couleursl = couleur;
+ int width = goomInfo->screen.width;
+ int height = goomInfo->screen.height;
+
+ cycle++;
+ if (cycle >= 80)
+ cycle = 0;
+
+ if (cycle < 40)
+ cycle10 = cycle / 10;
+ else
+ cycle10 = 7 - cycle / 10;
+
+ {
+ unsigned char *tmp = (unsigned char *) &couleursl;
+
+ for (i = 0; i < 4; i++) {
+ *tmp = (*tmp) >> cycle10;
+ tmp++;
+ }
+ }
+
+ points = draw_ifs (goomInfo, &nbpt, fx_data);
+ nbpt--;
+
+#ifdef HAVE_MMX
+ movd_m2r (couleursl, mm1);
+ punpckldq_r2r (mm1, mm1);
+ for (i = 0; i < nbpt; i += increment) {
+ int x = points[i].x;
+ int y = points[i].y;
+
+ if ((x < width) && (y < height) && (x > 0) && (y > 0)) {
+ int pos = x + (y * width);
+ movd_m2r (back[pos], mm0);
+ paddusb_r2r (mm1, mm0);
+ movd_r2m (mm0, data[pos]);
+ }
+ }
+ emms();/*__asm__ __volatile__ ("emms");*/
+#else
+ for (i = 0; i < nbpt; i += increment) {
+ int x = (int) points[i].x & 0x7fffffff;
+ int y = (int) points[i].y & 0x7fffffff;
+
+ if ((x < width) && (y < height)) {
+ int pos = x + (int) (y * width);
+ int tra = 0, i = 0;
+ unsigned char *bra = (unsigned char *) &back[pos];
+ unsigned char *dra = (unsigned char *) &data[pos];
+ unsigned char *cra = (unsigned char *) &couleursl;
+
+ for (; i < 4; i++) {
+ tra = *cra;
+ tra += *bra;
+ if (tra > 255)
+ tra = 255;
+ *dra = tra;
+ ++dra;
+ ++cra;
+ ++bra;
+ }
+ }
+ }
+#endif /*MMX*/
+ justChanged--;
+
+ col[ALPHA] = couleur >> (ALPHA * 8) & 0xff;
+ col[BLEU] = couleur >> (BLEU * 8) & 0xff;
+ col[VERT] = couleur >> (VERT * 8) & 0xff;
+ col[ROUGE] = couleur >> (ROUGE * 8) & 0xff;
+
+ if (mode == MOD_MER) {
+ col[BLEU] += v[BLEU];
+ if (col[BLEU] > 255) {
+ col[BLEU] = 255;
+ v[BLEU] = -(RAND() % 4) - 1;
+ }
+ if (col[BLEU] < 32) {
+ col[BLEU] = 32;
+ v[BLEU] = (RAND() % 4) + 1;
+ }
+
+ col[VERT] += v[VERT];
+ if (col[VERT] > 200) {
+ col[VERT] = 200;
+ v[VERT] = -(RAND() % 3) - 2;
+ }
+ if (col[VERT] > col[BLEU]) {
+ col[VERT] = col[BLEU];
+ v[VERT] = v[BLEU];
+ }
+ if (col[VERT] < 32) {
+ col[VERT] = 32;
+ v[VERT] = (RAND() % 3) + 2;
+ }
+
+ col[ROUGE] += v[ROUGE];
+ if (col[ROUGE] > 64) {
+ col[ROUGE] = 64;
+ v[ROUGE] = -(RAND () % 4) - 1;
+ }
+ if (col[ROUGE] < 0) {
+ col[ROUGE] = 0;
+ v[ROUGE] = (RAND () % 4) + 1;
+ }
+
+ col[ALPHA] += v[ALPHA];
+ if (col[ALPHA] > 0) {
+ col[ALPHA] = 0;
+ v[ALPHA] = -(RAND () % 4) - 1;
+ }
+ if (col[ALPHA] < 0) {
+ col[ALPHA] = 0;
+ v[ALPHA] = (RAND () % 4) + 1;
+ }
+
+ if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40)
+ && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64)
+ && (RAND () % 20 == 0)) && (justChanged < 0)) {
+ mode = RAND () % 3 ? MOD_FEU : MOD_MERVER;
+ justChanged = 250;
+ }
+ }
+ else if (mode == MOD_MERVER) {
+ col[BLEU] += v[BLEU];
+ if (col[BLEU] > 128) {
+ col[BLEU] = 128;
+ v[BLEU] = -(RAND () % 4) - 1;
+ }
+ if (col[BLEU] < 16) {
+ col[BLEU] = 16;
+ v[BLEU] = (RAND () % 4) + 1;
+ }
+
+ col[VERT] += v[VERT];
+ if (col[VERT] > 200) {
+ col[VERT] = 200;
+ v[VERT] = -(RAND () % 3) - 2;
+ }
+ if (col[VERT] > col[ALPHA]) {
+ col[VERT] = col[ALPHA];
+ v[VERT] = v[ALPHA];
+ }
+ if (col[VERT] < 32) {
+ col[VERT] = 32;
+ v[VERT] = (RAND () % 3) + 2;
+ }
+
+ col[ROUGE] += v[ROUGE];
+ if (col[ROUGE] > 128) {
+ col[ROUGE] = 128;
+ v[ROUGE] = -(RAND () % 4) - 1;
+ }
+ if (col[ROUGE] < 0) {
+ col[ROUGE] = 0;
+ v[ROUGE] = (RAND () % 4) + 1;
+ }
+
+ col[ALPHA] += v[ALPHA];
+ if (col[ALPHA] > 255) {
+ col[ALPHA] = 255;
+ v[ALPHA] = -(RAND () % 4) - 1;
+ }
+ if (col[ALPHA] < 0) {
+ col[ALPHA] = 0;
+ v[ALPHA] = (RAND () % 4) + 1;
+ }
+
+ if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40)
+ && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64)
+ && (RAND () % 20 == 0)) && (justChanged < 0)) {
+ mode = RAND () % 3 ? MOD_FEU : MOD_MER;
+ justChanged = 250;
+ }
+ }
+ else if (mode == MOD_FEU) {
+
+ col[BLEU] += v[BLEU];
+ if (col[BLEU] > 64) {
+ col[BLEU] = 64;
+ v[BLEU] = -(RAND () % 4) - 1;
+ }
+ if (col[BLEU] < 0) {
+ col[BLEU] = 0;
+ v[BLEU] = (RAND () % 4) + 1;
+ }
+
+ col[VERT] += v[VERT];
+ if (col[VERT] > 200) {
+ col[VERT] = 200;
+ v[VERT] = -(RAND () % 3) - 2;
+ }
+ if (col[VERT] > col[ROUGE] + 20) {
+ col[VERT] = col[ROUGE] + 20;
+ v[VERT] = -(RAND () % 3) - 2;
+ v[ROUGE] = (RAND () % 4) + 1;
+ v[BLEU] = (RAND () % 4) + 1;
+ }
+ if (col[VERT] < 0) {
+ col[VERT] = 0;
+ v[VERT] = (RAND () % 3) + 2;
+ }
+
+ col[ROUGE] += v[ROUGE];
+ if (col[ROUGE] > 255) {
+ col[ROUGE] = 255;
+ v[ROUGE] = -(RAND () % 4) - 1;
+ }
+ if (col[ROUGE] > col[VERT] + 40) {
+ col[ROUGE] = col[VERT] + 40;
+ v[ROUGE] = -(RAND () % 4) - 1;
+ }
+ if (col[ROUGE] < 0) {
+ col[ROUGE] = 0;
+ v[ROUGE] = (RAND () % 4) + 1;
+ }
+
+ col[ALPHA] += v[ALPHA];
+ if (col[ALPHA] > 0) {
+ col[ALPHA] = 0;
+ v[ALPHA] = -(RAND () % 4) - 1;
+ }
+ if (col[ALPHA] < 0) {
+ col[ALPHA] = 0;
+ v[ALPHA] = (RAND () % 4) + 1;
+ }
+
+ if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU])
+ && (col[BLEU] > 32)
+ && (RAND () % 20 == 0)) && (justChanged < 0)) {
+ mode = RAND () % 2 ? MOD_MER : MOD_MERVER;
+ justChanged = 250;
+ }
+ }
+
+ couleur = (col[ALPHA] << (ALPHA * 8))
+ | (col[BLEU] << (BLEU * 8))
+ | (col[VERT] << (VERT * 8))
+ | (col[ROUGE] << (ROUGE * 8));
+}
+
+/** VISUAL_FX WRAPPER FOR IFS */
+
+static void ifs_vfx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) {
+
+ IfsData *data = (IfsData*)_this->fx_data;
+ if (!data->initalized) {
+ data->initalized = 1;
+ init_ifs(goomInfo, data);
+ }
+ ifs_update (goomInfo, dest, src, goomInfo->update.ifs_incr, data);
+ /*TODO: trouver meilleur soluce pour increment (mettre le code de gestion de l'ifs dans ce fichier: ifs_vfx_apply) */
+}
+
+static void ifs_vfx_init(VisualFX *_this, PluginInfo *info) {
+
+ IfsData *data = (IfsData*)malloc(sizeof(IfsData));
+ data->Root = (FRACTAL*)NULL;
+ data->initalized = 0;
+ _this->fx_data = data;
+}
+
+static void ifs_vfx_free(VisualFX *_this) {
+ IfsData *data = (IfsData*)_this->fx_data;
+ release_ifs(data);
+ free(data);
+}
+
+VisualFX ifs_visualfx_create(void) {
+ VisualFX vfx;
+ vfx.init = ifs_vfx_init;
+ vfx.free = ifs_vfx_free;
+ vfx.apply = ifs_vfx_apply;
+ return vfx;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/ifs.h b/src/visualizations/Goom/goom2k4-0/src/ifs.h
new file mode 100644
index 0000000000..fab0426683
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/ifs.h
@@ -0,0 +1,27 @@
+/*
+ * File created 11 april 2002 by JeKo <jeko@free.fr>
+ */
+
+#ifndef IFS_H
+#define IFS_H
+
+#include "goom_config.h"
+#include "goom_graphic.h"
+#include "goom_plugin_info.h"
+#include "goom_visual_fx.h"
+
+VisualFX ifs_visualfx_create(void);
+
+/* init ifs for a (width)x(height) output. * /
+void init_ifs (PluginInfo *goomInfo, int width, int height);
+
+/ * draw an ifs on the buffer (which size is width * height)
+ increment means that we draw 1/increment of the ifs's points * /
+void ifs_update (PluginInfo *goomInfo, Pixel * buffer, Pixel * back, int width, int height, int increment);
+
+/ * free all ifs's data. * /
+void release_ifs (void);
+*/
+
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/jitc_test.c b/src/visualizations/Goom/goom2k4-0/src/jitc_test.c
new file mode 100644
index 0000000000..cab03e82f7
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/jitc_test.c
@@ -0,0 +1,38 @@
+#include "jitc_x86.h"
+#include <stdio.h>
+
+int main(int c, char **v)
+{
+ int i;
+ int j;
+ JitcX86Env *jitc = jitc_x86_env_new(0xffff);
+ JitcFunc func = jitc_prepare_func(jitc);
+
+ jitc_add(jitc, "mov edx, $d", 0xffffffff);
+ jitc_add(jitc, "mov eax, $d", 40);
+ jitc_add(jitc, "mov ebx, $d", 2);
+ jitc_add(jitc, "idiv ebx");
+ jitc_add(jitc, "mov eax, [$d]", 0xdeadbeaf);
+
+ jitc_add(jitc, "sal edx, $d", 7);
+ jitc_add(jitc, "imul ecx");
+ jitc_add(jitc, "idiv ecx");
+ jitc_add(jitc, "imul $d[ecx]", 2);
+ jitc_add(jitc, "imul ecx, [ecx]");
+ jitc_add(jitc, "mov ecx, $d", (char*)(&i)-12);
+ jitc_add(jitc, "dec $d[ecx]", 2);
+ jitc_add(jitc, "add ecx, $d", 12);
+ jitc_add(jitc, "dec [ecx]");
+ jitc_add(jitc, "dec ecx");
+
+ JITC_FLD_pIMM32(jitc,&i);
+ JITC_FSTP_pIMM32(jitc,&j);
+
+ jitc_validate_func(jitc);
+ func();
+
+ printf("i = 0x%08x\n", i);
+
+ jitc_x86_delete(jitc);
+ return 0;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/jitc_x86.c b/src/visualizations/Goom/goom2k4-0/src/jitc_x86.c
new file mode 100644
index 0000000000..21213b8932
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/jitc_x86.c
@@ -0,0 +1,530 @@
+#include "jitc_x86.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#define PARAM_INT 1
+#define PARAM_FLOAT 2
+#define PARAM_REG 3
+#define PARAM_dispREG 4
+#define PARAM_DISP32 5
+#define PARAM_LABEL 6
+#define PARAM_NONE 666
+
+typedef struct {
+ int id;
+ int i;
+ double f;
+ int reg;
+ int disp;
+ char label[256];
+} IParam;
+
+struct {
+ char *name;
+ int reg;
+} RegsName[] = {
+ {"eax",EAX}, {"ebx",EBX}, {"ecx",ECX}, {"edx",EDX},
+ {"edi",EDI}, {"esi",ESI}, {"ebp",EBP}, {"esp",ESP},
+ {"st0",0}, {"st1",1}, {"st2",2}, {"st3",3},
+ {"st4",4}, {"st5",5}, {"st6",6}, {"st7",7},
+ {"mm0",0}, {"mm1",1}, {"mm2",2}, {"mm3",3},
+ {"mm4",4}, {"mm5",5}, {"mm6",6}, {"mm7",7}, {NULL,0}
+};
+
+void modrm(JitcX86Env *jitc, int opcode, IParam *iparam)
+{
+ int dest = 0;
+ int src = 1;
+ int direction = 0x0;
+ unsigned int byte = 666;
+ unsigned int int32 = 0;
+ unsigned int need32 = 0;
+
+ if ((iparam[0].id == PARAM_REG) && (iparam[1].id != PARAM_REG)) {
+ dest = 1;
+ src = 0;
+ direction = 0x02;
+ }
+
+ if (iparam[src].id != PARAM_REG) {
+ fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id);
+ exit(1);
+ }
+
+ if (iparam[dest].id == PARAM_REG) {
+ byte = ((int)JITC_MOD_REG_REG << 6) | (iparam[src].reg << 3) | (iparam[0].reg);
+ }
+
+ else if (iparam[dest].id == PARAM_dispREG)
+ {
+ if (iparam[dest].disp == 0)
+ byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | (iparam[dest].reg);
+ }
+
+ else if (iparam[dest].id == PARAM_DISP32)
+ {
+ byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | JITC_RM_DISP32;
+ need32 = 1;
+ int32 = iparam[dest].disp;
+ }
+
+ if (byte == 666) {
+ fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id);
+ exit(1);
+ }
+ else {
+ if (opcode < 0x100)
+ JITC_ADD_UCHAR(jitc, opcode + direction);
+ else {
+ JITC_ADD_UCHAR(jitc, (opcode>>8)&0xff);
+ JITC_ADD_UCHAR(jitc, (opcode&0xff)/* + direction*/);
+ }
+ JITC_ADD_UCHAR(jitc, byte);
+ if (need32)
+ JITC_ADD_UINT(jitc, int32);
+ }
+}
+
+static void imul_like_modrm_1param(JitcX86Env *jitc, int opcode, int digit, IParam *iparam)
+{
+ if (iparam[0].id == PARAM_REG)
+ {
+ JITC_ADD_UCHAR(jitc, opcode);
+ JITC_MODRM(jitc, 0x03, digit, iparam[0].reg);
+ return;
+ }
+ if (iparam[0].id == PARAM_dispREG) {
+ JITC_ADD_UCHAR(jitc, opcode);
+ if (iparam[0].disp == 0)
+ {
+ JITC_MODRM(jitc, 0x00, digit, iparam[0].reg);
+ }
+ else if ((iparam[0].disp & 0xff) == iparam[0].disp)
+ {
+ JITC_MODRM(jitc, 0x01, digit, iparam[0].reg);
+ JITC_ADD_UCHAR(jitc, iparam[0].disp);
+ }
+ else
+ {
+ JITC_MODRM(jitc, 0x02, digit, iparam[0].reg);
+ JITC_ADD_UINT(jitc, iparam[0].disp);
+ }
+ return;
+ }
+ if (iparam[0].id == PARAM_DISP32) {
+ JITC_ADD_UCHAR(jitc, opcode);
+ JITC_MODRM(jitc, JITC_MOD_pREG_REG, digit, JITC_RM_DISP32);
+ JITC_ADD_UINT(jitc, iparam[0].disp);
+ return;
+ }
+}
+
+/* 1 byte encoded opcode including register... imm32 parameter */
+#define INSTR_1bReg_IMM32(opcode,dest,src) { \
+ JITC_ADD_UCHAR(jitc, opcode + iparam[dest].reg); \
+ JITC_ADD_UINT (jitc, (int)iparam[src].i); }
+
+typedef struct {
+ char *name;
+ int opcode;
+ int opcode_reg_int;
+ int digit_reg_int;
+ int opcode_eax_int;
+} AddLikeInstr;
+
+static AddLikeInstr addLike[] = {
+ { "add", 0x01, 0x81, 0x00, 0x05 },
+ { "and", 0x21, 0x81, 0x04, 0x25 },
+ { "or", 0x0B, 0x81, 0x01, 0x0D },
+ { "cmp", 0x39, 0x81, 0x07, 0x3D },
+ { "imul", 0x0FAF, 0x69, 0x00, 0x10000 },
+ { "sub", 0x29, 0x81, 0x05, 0X2D },
+ { NULL, -1, -1, -1, -1 }
+};
+
+int checkAddLike(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams)
+{
+ int i;
+ for (i=0;addLike[i].name;++i)
+ {
+ if (strcmp(op,addLike[i].name) == 0)
+ {
+ if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) {
+ if ((iparam[0].reg == EAX) && (addLike[i].opcode_eax_int != 0x10000)) {
+ JITC_ADD_UCHAR(jitc, addLike[i].opcode_eax_int);
+ JITC_ADD_UINT(jitc, iparam[1].i);
+ return 1;
+ }
+ else {
+ JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int);
+ JITC_MODRM(jitc, 0x03, addLike[i].digit_reg_int, iparam[0].reg);
+ JITC_ADD_UINT(jitc, iparam[1].i);
+ return 1;
+ }
+ }
+ else if ((iparam[0].id == PARAM_dispREG) && (iparam[1].id == PARAM_INT)) {
+ JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int);
+ if ((iparam[0].disp & 0xff) == iparam[0].disp)
+ {
+ JITC_MODRM(jitc, 0x01, addLike[i].digit_reg_int, iparam[0].reg);
+ JITC_ADD_UCHAR(jitc, iparam[0].disp);
+ }
+ else
+ {
+ JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, iparam[0].reg);
+ JITC_ADD_UINT(jitc, iparam[0].disp);
+ }
+ JITC_ADD_UINT(jitc, iparam[1].i);
+ return 1;
+ }
+ else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) {
+ JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int);
+ JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, 0x05);
+ JITC_ADD_UINT(jitc, iparam[0].disp);
+ JITC_ADD_UINT(jitc, iparam[1].i);
+ return 1;
+ }
+ else {
+ modrm(jitc, addLike[i].opcode, iparam);
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+/**
+ * Check all kind of known instruction... perform special optimisations..
+ */
+static void jitc_add_op(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams)
+{
+ /* MOV */
+ if (strcmp(op,"mov") == 0)
+ {
+ if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) {
+ INSTR_1bReg_IMM32(0xb8,0,1);
+ }
+ else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) {
+ JITC_ADD_UCHAR(jitc, 0xc7);
+ JITC_MODRM(jitc, 0x00, 0x00, 0x05);
+ JITC_ADD_UINT(jitc, iparam[0].disp);
+ JITC_ADD_UINT(jitc, iparam[1].i);
+ }
+ else
+ modrm(jitc, 0x89, iparam);
+ return;
+ }
+
+#define IMUL_LIKE(_OP,_opcode,_digit)\
+ if (strcmp(op, _OP) == 0) { \
+ if (nbParams == 1) { \
+ imul_like_modrm_1param(jitc, _opcode, _digit, iparam); \
+ return; }}
+
+#define SHIFT_LIKE(_name,_op1,_op2,_digit) \
+ if (strcmp(op, _name) == 0) { \
+ if (iparam[1].id == PARAM_INT) { \
+ if (iparam[1].i == 1) \
+ imul_like_modrm_1param(jitc, _op1, _digit, iparam); \
+ else { \
+ imul_like_modrm_1param(jitc, _op2, _digit, iparam); \
+ JITC_ADD_UCHAR(jitc, iparam[1].i); \
+ } \
+ return; \
+ } \
+ }
+
+#define POP_LIKE(_OP,_opcode) \
+ if (strcmp(op, _OP) == 0) { \
+ if (iparam[0].id == PARAM_REG) { \
+ JITC_ADD_UCHAR(jitc, _opcode + iparam[0].reg); \
+ return; } }
+
+ IMUL_LIKE("neg", 0xf7, 0x03);
+ IMUL_LIKE("imul", 0xf7, 0x05);
+ IMUL_LIKE("idiv", 0xf7, 0x07);
+
+ POP_LIKE("pop", 0x58);
+ POP_LIKE("push", 0x50);
+
+ SHIFT_LIKE("sal", 0xd1, 0xc1, 0x04);
+ SHIFT_LIKE("sar", 0xd1, 0xc1, 0x07);
+ SHIFT_LIKE("shl", 0xd1, 0xc1, 0x04);
+ SHIFT_LIKE("shr", 0xd1, 0xc1, 0x05);
+
+ /* INC */
+ if (strcmp(op, "inc") == 0) {
+ if (iparam[0].id == PARAM_REG) {
+ JITC_ADD_UCHAR(jitc, 0x40 + iparam[0].reg);
+ return;
+ }
+ imul_like_modrm_1param(jitc, 0xff, 0x00, iparam);
+ return;
+ }
+
+ /* DEC */
+ if (strcmp(op, "dec") == 0) {
+ if (iparam[0].id == PARAM_REG) {
+ JITC_ADD_UCHAR(jitc, 0x48 + iparam[0].reg);
+ return;
+ }
+ imul_like_modrm_1param(jitc, 0xff, 0x01, iparam);
+ return;
+ }
+
+ if (strcmp(op, "call") == 0)
+ {
+ if (iparam[0].id == PARAM_LABEL) {
+ jitc_add_used_label(jitc,iparam[0].label,jitc->used+1);
+ JITC_CALL(jitc,0);
+ return;
+ }
+ if (iparam[0].id == PARAM_INT) {
+ JITC_CALL(jitc,iparam[0].i);
+ return;
+ }
+ if (iparam[0].id == PARAM_dispREG) {
+ JITC_ADD_UCHAR(jitc,0xff);
+ JITC_ADD_UCHAR(jitc,0xd0+iparam[0].reg);
+ return;
+ }
+ }
+
+#define MONOBYTE_INSTR(_OP,_opcode) \
+ if (strcmp(op, _OP) == 0) { \
+ JITC_ADD_UCHAR(jitc, _opcode); \
+ return; }
+
+ MONOBYTE_INSTR("ret", 0xc3);
+ MONOBYTE_INSTR("leave", 0xc9);
+ MONOBYTE_INSTR("cdq", 0x99);
+
+ /* JNE */
+ if (strcmp(op, "jne") == 0) {
+ if (iparam[0].id == PARAM_LABEL) {
+ JITC_JUMP_COND_LABEL(jitc,COND_NOT_EQUAL,iparam[0].label);
+ return;
+ }
+ if (iparam[0].id == PARAM_INT) {
+ JITC_JUMP_COND(jitc,COND_NOT_EQUAL,iparam[0].i);
+ return;
+ }
+ }
+
+ /* JE */
+ if (strcmp(op, "je") == 0) {
+ if (iparam[0].id == PARAM_LABEL) {
+ JITC_JUMP_COND_LABEL(jitc,COND_EQUAL,iparam[0].label);
+ return;
+ }
+ if (iparam[0].id == PARAM_INT) {
+ JITC_JUMP_COND(jitc,COND_EQUAL,iparam[0].i);
+ return;
+ }
+ }
+
+ /* ADD LIKE */
+ if (checkAddLike(jitc, op, iparam, nbParams)) return;
+
+ /* BSWAP : 0F C8+rd */
+
+ fprintf(stderr, "JITC_x86: Invalid Operation '%s'\n", op);
+ exit(1);
+}
+
+/**
+ * Adds a new instruction to the just in time compiled function
+ */
+void jitc_add(JitcX86Env *jitc, const char *_instr, ...)
+{
+ char instr[256];
+ char *op;
+ char *sparam[16]; int nbParam=0; int i;
+ IParam iparam[16];
+ va_list ap;
+ strcpy(instr,_instr);
+
+#ifdef DISPLAY_GENCODE
+ printf("|");
+#endif
+
+ op = strtok(instr, " ,");
+ if (!op) return;
+
+ /* decoupage en tokens */
+ while ((sparam[nbParam] = strtok(NULL, " ,")) != NULL) if (strlen(sparam[nbParam])>0) nbParam++;
+
+ /* Reconnaissance des parametres */
+ va_start(ap, _instr);
+ for (i=0;i<nbParam;++i)
+ {
+ int r;
+ char regname[256];
+ iparam[i].id = PARAM_NONE;
+ if (strcmp(sparam[i], "$d") == 0) {
+ iparam[i].id = PARAM_INT;
+ iparam[i].i = va_arg(ap, int);
+ }
+ else if (strcmp(sparam[i], "$f") == 0) {
+ iparam[i].id = PARAM_FLOAT;
+ iparam[i].f = va_arg(ap, double);
+ }
+ else if (strcmp(sparam[i], "[$d]") == 0) {
+ iparam[i].id = PARAM_DISP32;
+ iparam[i].disp = va_arg(ap, int);
+ }
+ else if (strcmp(sparam[i], "$s") == 0) {
+ iparam[i].id = PARAM_LABEL;
+ strcpy(iparam[i].label, va_arg(ap, char*));
+ }
+ else
+ for (r=0;RegsName[r].name;r++) {
+ if (strcmp(sparam[i], RegsName[r].name) == 0) {
+ iparam[i].id = PARAM_REG;
+ iparam[i].reg = RegsName[r].reg;
+ }
+ else
+ {
+ if (sscanf(sparam[i], "$d[%3s]", regname) > 0) {
+ if (strcmp(regname, RegsName[r].name) == 0) {
+ iparam[i].id = PARAM_dispREG;
+ iparam[i].reg = RegsName[r].reg;
+ iparam[i].disp = va_arg(ap, int);
+ }
+ }
+ if (sscanf(sparam[i], "[%3s]", regname) > 0) {
+ if (strcmp(regname, RegsName[r].name) == 0) {
+ iparam[i].id = PARAM_dispREG;
+ iparam[i].reg = RegsName[r].reg;
+ iparam[i].disp = 0;
+ }
+ }
+ }
+ }
+ if (iparam[i].id == PARAM_NONE) {
+ fprintf(stderr, "JITC_x86: Unrecognized parameter '%s'\n", sparam[i]);
+ exit(1);
+ }
+ }
+ va_end(ap);
+
+ jitc_add_op(jitc, op, &(iparam[0]), nbParam);
+#ifdef DISPLAY_GENCODE
+ printf(" ;;; %s", op);
+ for (i=0;i<nbParam;++i)
+ {
+ if (iparam[i].id == PARAM_INT)
+ printf(" 0x%x", iparam[i].i);
+ else if (iparam[i].id == PARAM_DISP32)
+ printf(" [0x%x]", iparam[i].disp);
+ else if (iparam[i].id == PARAM_LABEL)
+ printf(" %s", iparam[i].label);
+ else
+ printf(" %s", sparam[i]);
+ }
+ printf("\n");
+
+#endif
+}
+
+JitcX86Env *jitc_x86_env_new(int memory_size) {
+
+ JitcX86Env *jitc = (JitcX86Env*)malloc(sizeof(JitcX86Env));
+ jitc->_memory = (unsigned char*)malloc(memory_size);
+ jitc->used = 0;
+ jitc->memory = (unsigned char*)((int)jitc->_memory + (32-((int)jitc->_memory)%32)%32);
+
+ jitc->nbUsedLabel = 0;
+ jitc->nbKnownLabel = 0;
+
+ jitc->usedLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL);
+ jitc->knownLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL);
+
+ return jitc;
+}
+
+void jitc_x86_delete(JitcX86Env *jitc) {
+
+ free(jitc->usedLabel);
+ free(jitc->knownLabel);
+ free(jitc->_memory);
+ free(jitc);
+}
+
+JitcFunc jitc_prepare_func(JitcX86Env *jitc) {
+
+ JitcFunc ptr = 0;
+ jitc->used = (32 - jitc->used%32)%32;
+ ptr = (JitcFunc)&(jitc->memory[jitc->used]);
+
+#ifdef DISPLAY_GENCODE
+ printf("\n------------------------------------------\n");
+ printf("-- Function Intro --\n");
+ printf("------------------------------------------\n");
+#endif
+
+ /* save the state */
+ jitc_add(jitc,"push ebp");
+ jitc_add(jitc,"mov ebp, esp");
+ jitc_add(jitc,"sub esp, $d", 8);
+ JITC_PUSH_ALL(jitc);
+#ifdef DISPLAY_GENCODE
+ printf("\n------------------------------------------\n");
+#endif
+ return ptr;
+}
+
+void jitc_validate_func(JitcX86Env *jitc) {
+
+#ifdef DISPLAY_GENCODE
+ printf("\n------------------------------------------\n");
+ printf("-- Function Outro --\n");
+ printf("------------------------------------------\n");
+#endif
+ /* restore the state */
+ JITC_POP_ALL(jitc);
+ jitc_add(jitc, "leave");
+ jitc_add(jitc, "ret");
+ jitc_resolve_labels(jitc);
+#ifdef DISPLAY_GENCODE
+ printf("\n------------------------------------------\n");
+#endif
+}
+
+void jitc_add_used_label(JitcX86Env *jitc, char *label, int where) {
+
+ strncpy(jitc->usedLabel[jitc->nbUsedLabel].label, label, JITC_LABEL_SIZE);
+ jitc->usedLabel[jitc->nbUsedLabel].address = where;
+ jitc->nbUsedLabel++;
+}
+
+void jitc_add_known_label(JitcX86Env *jitc, char *label, int where) {
+
+#ifdef DISPLAY_GENCODE
+ printf("%s:\n", label);
+#endif
+ strncpy(jitc->knownLabel[jitc->nbKnownLabel].label, label, JITC_LABEL_SIZE);
+ jitc->knownLabel[jitc->nbKnownLabel].address = where;
+ jitc->nbKnownLabel++;
+}
+
+void jitc_resolve_labels(JitcX86Env *jitc) {
+
+ int i,j;
+ for (i=jitc->nbUsedLabel;i-->0;) {
+
+ LabelAddr used = jitc->usedLabel[i];
+ for (j=jitc->nbKnownLabel;j-->0;) {
+
+ LabelAddr known = jitc->knownLabel[j];
+ if (strcmp(known.label, used.label) == 0) {
+ int *offset = (int*)&(jitc->memory[used.address]);
+ *offset = known.address - used.address - 4; /* always using long offset */
+ break;
+ }
+ }
+ }
+ jitc->nbUsedLabel = jitc->nbKnownLabel = 0;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/jitc_x86.h b/src/visualizations/Goom/goom2k4-0/src/jitc_x86.h
new file mode 100644
index 0000000000..c81fa9ccdc
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/jitc_x86.h
@@ -0,0 +1,214 @@
+/**
+ * Copyright (c)2004 Jean-Christophe Hoelt <jeko@ios-software.com>
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#define JITC_MAXLABEL 1024
+#define JITC_LABEL_SIZE 64
+
+/**
+ * low level macros
+ */
+
+ /* {{{ Registres Generaux */
+#define EAX 0
+#define ECX 1
+#define EDX 2
+#define EBX 3
+#define ESP 4
+#define EBP 5
+#define ESI 6
+#define EDI 7
+ /* }}} */
+ /* {{{ Registres MMX */
+#define MM0 0
+#define MM1 1
+#define MM2 2
+#define MM3 3
+#define MM4 4
+#define MM5 5
+#define MM6 6
+#define MM7 7
+ /* }}} */
+ /* {{{ Registres SSE*/
+#define XMM0 0
+#define XMM1 1
+#define XMM2 2
+#define XMM3 3
+#define XMM4 4
+#define XMM5 5
+#define XMM6 6
+#define XMM7 7
+ /* }}} */
+ /* {{{ Alias aux registres */
+#define R0 0
+#define R1 1
+#define R2 2
+#define R3 3
+#define R4 4
+#define R5 5
+#define R6 6
+#define R7 7
+ /* }}} */
+
+ /* {{{ Conditions */
+#define COND_OVERFLOW 0
+#define COND_NO_OVERFLOW 1
+#define COND_BELOW 2
+#define COND_NOT_BELOW 3
+#define COND_EQUAL 4
+#define COND_ZERO 4
+#define COND_NOT_EQUAL 5
+#define COND_NOT_ZERO 5
+#define COND_NOT_ABOVE 6
+#define COND_ABOVE 7
+#define COND_SIGN 8
+#define COND_NOT_SIGN 9
+#define COND_EVEN 10
+#define COND_ODD 11
+#define COND_LESS_THAN 12
+#define COND_GREATER_EQUAL 13
+#define COND_LESS_EQUAL 14
+#define COND_GREATER_THAN 15
+ /* }}} */
+
+typedef int (*JitcFunc)(void);
+
+typedef struct _LABEL_ADDR {
+ char label[JITC_LABEL_SIZE];
+ int address;
+} LabelAddr;
+
+typedef struct _JITC_X86_ENV {
+ unsigned char *_memory;
+ unsigned char *memory;
+ unsigned int used;
+
+ int nbUsedLabel;
+ int nbKnownLabel;
+ LabelAddr *usedLabel;
+ LabelAddr *knownLabel;
+} JitcX86Env;
+
+#define DISPLAY_GENCODE
+/*#define DISPLAY_GENCODE_HEXA*/
+
+#ifdef DISPLAY_GENCODE_HEXA
+ #define JITC_ADD_UCHAR(jitc,op) printf(" 0x%02x", op) && (jitc->memory[jitc->used++]=op)
+#else
+ #define JITC_ADD_UCHAR(jitc,op) (jitc->memory[jitc->used++]=op)
+#endif
+
+#define JITC_ADD_USHORT(jitc,i) { JITC_ADD_UCHAR(jitc,i&0xff); JITC_ADD_UCHAR(jitc,(i>>8)&0xff); }
+#define JITC_ADD_UINT(jitc,i) { \
+ JITC_ADD_UCHAR(jitc,i&0xff); \
+ JITC_ADD_UCHAR(jitc,(i>>8)&0xff); \
+ JITC_ADD_UCHAR(jitc,(i>>16)&0xff); \
+ JITC_ADD_UCHAR(jitc,(i>>24)&0xff); \
+}
+#define JITC_ADD_2UCHAR(jitc,op1,op2) {JITC_ADD_UCHAR(jitc,op1); JITC_ADD_UCHAR(jitc,op2);}
+
+#define JITC_MODRM(jitc,mod,reg,rm) { JITC_ADD_UCHAR(jitc,((int)mod<<6)|((int)reg<<3)|((int)rm)); }
+
+/* special values for R/M */
+#define JITC_RM_DISP32 0x05
+
+#define JITC_MOD_pREG_REG 0x00
+#define JITC_MOD_disp8REG_REG 0x01
+#define JITC_MOD_disp32REG_REG 0x02
+#define JITC_MOD_REG_REG 0x03
+/* cf 24319101 p.27 */
+
+#define JITC_OP_REG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,0xc0+(src<<3)+dest); }
+#define JITC_OP_REG_pREG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(dest<<3)+src); }
+#define JITC_OP_pREG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(src<<3)+dest); }
+
+/**
+ * "high" level macro
+ */
+
+#define JITC_LOAD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0xb8+reg); JITC_ADD_UINT(jitc,(int)(imm32)); }
+#define JITC_LOAD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x89,dest,src); }
+
+#define JITC_LOAD_REG_pREG(jitc,dest,src) { JITC_OP_REG_pREG(jitc,0x8b,dest,src); }
+#define JITC_LOAD_pREG_REG(jitc,dest,src) { JITC_OP_pREG_REG(jitc,0x89,dest,src); }
+
+#define JITC_DEC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x48+reg); }
+#define JITC_INC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x40+reg); }
+
+#define JITC_ADD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x01,dest,src); }
+#define JITC_ADD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0x81);\
+ JITC_ADD_UCHAR (jitc,0xc0+reg);\
+ JITC_ADD_UINT (jitc,(int)imm32); }
+
+#define JITC_AND_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x21,dest,src); }
+#define JITC_CMP_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x39,dest,src); }
+#define JITC_CMP_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81,0xf8+reg); \
+ JITC_ADD_UINT (jitc,(int)imm32); }
+
+#define JITC_IDIV_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xf8+reg); }
+#define JITC_IMUL_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xe8+reg); }
+
+/*#define JITC_SUB_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x29,dest,src); }
+#define JITC_SUB_EAX_IMM32(jitc,imm32) { JITC_ADD_UCHAR (jitc,0x2d); JITC_ADD_UINT(jitc,(int)imm32); }
+#define JITC_SUB_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81, 0xe8+reg);\
+ JITC_ADD_UINT (jitc,(int)imm32); }*/
+#define JITC_SUB_REG_IMM8(jitc,reg,imm8) { JITC_ADD_2UCHAR (jitc,0x83, 0xe8+reg);\
+ JITC_ADD_UCHAR(jitc,imm8); }
+
+/* Floating points */
+
+#define JITC_FLD_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \
+ JITC_MODRM (jitc, 0x00, 0x00,JITC_RM_DISP32); \
+ JITC_ADD_UINT(jitc,(int)(address)); }
+#define JITC_FLD_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xD9, 0xC0+reg); }
+
+#define JITC_FST_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \
+ JITC_MODRM (jitc, 0x00, 0x02,JITC_RM_DISP32); \
+ JITC_ADD_UINT(jitc,(int)(ADDRess)); }
+#define JITC_FST_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD0+reg); }
+
+#define JITC_FSTP_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \
+ JITC_MODRM (jitc, 0x00, 0x03, JITC_RM_DISP32); \
+ JITC_ADD_UINT(jitc,(int)(address)); }
+#define JITC_FSTP_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD8+reg); }
+
+#define JITC_FADD
+
+/* Jumps */
+
+#define JITC_ADD_LABEL(jitc,label) { jitc_add_known_label(jitc,label,jitc->used); }
+
+#define JITC_JUMP(jitc,offset) { JITC_ADD_UCHAR(jitc,0xe9); JITC_ADD_UINT(jitc,offset); }
+#define JITC_JUMP_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_JUMP(jitc,0); }
+#define JITC_JUMP_COND(jitc,cond,offset) { JITC_ADD_UCHAR(jitc,0x0f);\
+ JITC_ADD_UCHAR(jitc,0x80+cond);\
+ JITC_ADD_UINT(jitc,offset); }
+#define JITC_JUMP_COND_LABEL(jitc,cond,label) { jitc_add_used_label(jitc,label,jitc->used+2); JITC_JUMP_COND(jitc,cond,0); }
+#define JITC_CALL(jitc,function) { int __offset__ = (int)function - (int)(&jitc->memory[jitc->used+5]);\
+ JITC_ADD_UCHAR(jitc,0xe8); JITC_ADD_UINT(jitc,__offset__); }
+/*#define JITC_CALL_pREG(jitc,reg) { JITC_ADD_UCHAR(jitc,0xff); JITC_ADD_UCHAR(jitc,0xd0+reg); }
+#define JITC_CALL_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_CALL(jitc,0); }*/
+
+/* save all registers (except EAX,ESP,EBP) */
+#define JITC_PUSH_ALL(jitc) { jitc_add(jitc,"push ecx"); jitc_add(jitc,"push edx"); jitc_add(jitc,"push ebx"); \
+ jitc_add(jitc,"push esi"); jitc_add(jitc,"push edi"); }
+
+/* restore all registers (except EAX,ESP,EBP) */
+#define JITC_POP_ALL(jitc) { jitc_add(jitc,"pop edi"); jitc_add(jitc,"pop esi"); jitc_add(jitc,"pop ebx"); \
+ jitc_add(jitc,"pop edx"); jitc_add(jitc,"pop ecx"); }
+
+/* public methods */
+JitcX86Env *jitc_x86_env_new(int memory_size);
+JitcFunc jitc_prepare_func(JitcX86Env *jitc);
+void jitc_add(JitcX86Env *jitc, const char *instr, ...);
+void jitc_validate_func(JitcX86Env *jitc);
+void jitc_x86_delete(JitcX86Env *jitc);
+
+
+/* private methods */
+void jitc_add_used_label(JitcX86Env *jitc, char *label, int where);
+void jitc_add_known_label(JitcX86Env *jitc, char *label, int where);
+void jitc_resolve_labels(JitcX86Env *jitc);
diff --git a/src/visualizations/Goom/goom2k4-0/src/lines.c b/src/visualizations/Goom/goom2k4-0/src/lines.c
new file mode 100644
index 0000000000..2c39b1a7a4
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/lines.c
@@ -0,0 +1,239 @@
+/*
+ * lines.c
+ */
+
+#include "lines.h"
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "goom_tools.h"
+#include "drawmethods.h"
+#include "goom_plugin_info.h"
+
+static inline unsigned char lighten (unsigned char value, float power)
+{
+ int val = value;
+ float t = (float) val * log10(power) / 2.0;
+
+ if (t > 0) {
+ val = (int) t; /* (32.0f * log (t)); */
+ if (val > 255)
+ val = 255;
+ if (val < 0)
+ val = 0;
+ return val;
+ }
+ else {
+ return 0;
+ }
+}
+
+static void lightencolor (guint32 *col, float power)
+{
+ unsigned char *color;
+
+ color = (unsigned char *) col;
+ *color = lighten (*color, power);
+ color++;
+ *color = lighten (*color, power);
+ color++;
+ *color = lighten (*color, power);
+ color++;
+ *color = lighten (*color, power);
+}
+
+
+
+static void
+genline (int id, float param, GMUnitPointer * l, int rx, int ry)
+{
+ int i;
+
+ switch (id) {
+ case GML_HLINE:
+ for (i = 0; i < 512; i++) {
+ l[i].x = ((float) i * rx) / 512.0f;
+ l[i].y = param;
+ l[i].angle = M_PI / 2.0f;
+ }
+ return;
+ case GML_VLINE:
+ for (i = 0; i < 512; i++) {
+ l[i].y = ((float) i * ry) / 512.0f;
+ l[i].x = param;
+ l[i].angle = 0.0f;
+ }
+ return;
+ case GML_CIRCLE:
+ for (i = 0; i < 512; i++) {
+ float cosa, sina;
+
+ l[i].angle = 2.0f * M_PI * (float) i / 512.0f;
+ cosa = param * cos (l[i].angle);
+ sina = param * sin (l[i].angle);
+ l[i].x = ((float) rx / 2.0f) + cosa;
+ l[i].y = (float) ry / 2.0f + sina;
+ }
+ return;
+ }
+}
+
+static guint32 getcouleur (int mode)
+{
+ switch (mode) {
+ case GML_RED:
+ return (230 << (ROUGE * 8)) | (120 << (VERT * 8)) | (18 << (BLEU * 8));
+ case GML_ORANGE_J:
+ return (120 << (VERT * 8)) | (252 << (ROUGE * 8)) | (18 << (BLEU * 8));
+ case GML_ORANGE_V:
+ return (160 << (VERT * 8)) | (236 << (ROUGE * 8)) | (40 << (BLEU * 8));
+ case GML_BLEUBLANC:
+ return (40 << (BLEU * 8)) | (220 << (ROUGE * 8)) | (140 << (VERT * 8));
+ case GML_VERT:
+ return (200 << (VERT * 8)) | (80 << (ROUGE * 8)) | (18 << (BLEU * 8));
+ case GML_BLEU:
+ return (250 << (BLEU * 8)) | (30 << (VERT * 8)) | (80 << (ROUGE * 8));
+ case GML_BLACK:
+ return (16 << (BLEU * 8)) | (16 << (VERT * 8)) | (16 << (ROUGE * 8));
+ }
+ return 0;
+}
+
+void
+goom_lines_set_res (GMLine * gml, int rx, int ry)
+{
+ if (gml != NULL) {
+ gml->screenX = rx;
+ gml->screenY = ry;
+
+ genline (gml->IDdest, gml->param, gml->points2, rx, ry);
+ }
+}
+
+
+static void
+goom_lines_move (GMLine * l)
+{
+ int i;
+ unsigned char *c1, *c2;
+
+ for (i = 0; i < 512; i++) {
+ l->points[i].x = (l->points2[i].x + 39.0f * l->points[i].x) / 40.0f;
+ l->points[i].y = (l->points2[i].y + 39.0f * l->points[i].y) / 40.0f;
+ l->points[i].angle =
+ (l->points2[i].angle + 39.0f * l->points[i].angle) / 40.0f;
+ }
+
+ c1 = (unsigned char *) &l->color;
+ c2 = (unsigned char *) &l->color2;
+ for (i = 0; i < 4; i++) {
+ int cc1, cc2;
+
+ cc1 = *c1;
+ cc2 = *c2;
+ *c1 = (unsigned char) ((cc1 * 63 + cc2) >> 6);
+ ++c1;
+ ++c2;
+ }
+
+ l->power += l->powinc;
+ if (l->power < 1.1f) {
+ l->power = 1.1f;
+ l->powinc = (float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f;
+ }
+ if (l->power > 17.5f) {
+ l->power = 17.5f;
+ l->powinc = -(float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f;
+ }
+
+ l->amplitude = (99.0f * l->amplitude + l->amplitudeF) / 100.0f;
+}
+
+void
+goom_lines_switch_to (GMLine * gml, int IDdest,
+ float param, float amplitude, int col)
+{
+ genline (IDdest, param, gml->points2, gml->screenX, gml->screenY);
+ gml->IDdest = IDdest;
+ gml->param = param;
+ gml->amplitudeF = amplitude;
+ gml->color2 = getcouleur (col);
+}
+
+GMLine *
+goom_lines_init (PluginInfo *goomInfo, int rx, int ry,
+ int IDsrc, float paramS, int coulS,
+ int IDdest, float paramD, int coulD)
+{
+ GMLine *l = (GMLine *) malloc (sizeof (GMLine));
+
+ l->goomInfo = goomInfo;
+
+ l->points = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer));
+ l->points2 = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer));
+ l->nbPoints = 512;
+
+ l->IDdest = IDdest;
+ l->param = paramD;
+
+ l->amplitude = l->amplitudeF = 1.0f;
+
+ genline (IDsrc, paramS, l->points, rx, ry);
+ genline (IDdest, paramD, l->points2, rx, ry);
+
+ l->color = getcouleur (coulS);
+ l->color2 = getcouleur (coulD);
+
+ l->screenX = rx;
+ l->screenY = ry;
+
+ l->power = 0.0f;
+ l->powinc = 0.01f;
+
+ goom_lines_switch_to (l, IDdest, paramD, 1.0f, coulD);
+
+ return l;
+}
+
+void
+goom_lines_free (GMLine ** l)
+{
+ free ((*l)->points);
+ free ((*l)->points2);
+ free (*l);
+ l = NULL;
+}
+
+void goom_lines_draw (PluginInfo *plug, GMLine * line, gint16 data[512], Pixel *p)
+{
+ if (line != NULL) {
+ int i, x1, y1;
+ guint32 color = line->color;
+ GMUnitPointer *pt = &(line->points[0]);
+
+ float cosa = cos (pt->angle) / 1000.0f;
+ float sina = sin (pt->angle) / 1000.0f;
+
+ lightencolor (&color, line->power);
+
+ x1 = (int) (pt->x + cosa * line->amplitude * data[0]);
+ y1 = (int) (pt->y + sina * line->amplitude * data[0]);
+
+ for (i = 1; i < 512; i++) {
+ int x2, y2;
+ GMUnitPointer *pt = &(line->points[i]);
+
+ float cosa = cos (pt->angle) / 1000.0f;
+ float sina = sin (pt->angle) / 1000.0f;
+
+ x2 = (int) (pt->x + cosa * line->amplitude * data[i]);
+ y2 = (int) (pt->y + sina * line->amplitude * data[i]);
+
+ plug->methods.draw_line (p, x1, y1, x2, y2, color, line->screenX, line->screenY);
+
+ x1 = x2;
+ y1 = y2;
+ }
+ goom_lines_move (line);
+ }
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/lines.h b/src/visualizations/Goom/goom2k4-0/src/lines.h
new file mode 100644
index 0000000000..9c6df9240c
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/lines.h
@@ -0,0 +1,81 @@
+#ifndef _LINES_H
+#define _LINES_H
+
+/*
+ * lines.h
+ * Goom
+ * Copyright (c) 2000-2003 iOS-software. All rights reserved.
+ */
+
+#include "goom_typedefs.h"
+#include "goom_graphic.h"
+#include "goom_config.h"
+
+struct _GMUNITPOINTER
+{
+ float x;
+ float y;
+ float angle;
+};
+
+/* tableau de points */
+struct _GMLINE
+{
+
+ GMUnitPointer *points;
+ GMUnitPointer *points2;
+ int IDdest;
+ float param;
+ float amplitudeF;
+ float amplitude;
+
+ int nbPoints;
+ guint32 color; /* pour l'instant je stocke la couleur a terme, on stockera le mode couleur et l'on animera */
+ guint32 color2;
+
+ int screenX;
+ int screenY;
+
+ float power;
+ float powinc;
+
+ PluginInfo *goomInfo;
+};
+
+/* les ID possibles */
+
+#define GML_CIRCLE 0
+/* (param = radius) */
+
+#define GML_HLINE 1
+/* (param = y) */
+
+#define GML_VLINE 2
+/* (param = x) */
+
+/* les modes couleur possible (si tu mets un autre c'est noir) */
+
+#define GML_BLEUBLANC 0
+#define GML_RED 1
+#define GML_ORANGE_V 2
+#define GML_ORANGE_J 3
+#define GML_VERT 4
+#define GML_BLEU 5
+#define GML_BLACK 6
+
+/* construit un effet de line (une ligne horitontale pour commencer) */
+GMLine *goom_lines_init (PluginInfo *goomInfo, int rx, int ry,
+ int IDsrc, float paramS, int modeCoulSrc,
+ int IDdest, float paramD, int modeCoulDest);
+
+void goom_lines_switch_to (GMLine * gml, int IDdest, float param,
+ float amplitude,
+ int modeCoul);
+
+void goom_lines_set_res (GMLine * gml, int rx, int ry);
+
+void goom_lines_free (GMLine ** gml);
+
+void goom_lines_draw (PluginInfo *plugInfo, GMLine * gml, gint16 data[512], Pixel *p);
+
+#endif /* _LINES_H */
diff --git a/src/visualizations/Goom/goom2k4-0/src/mathtools.c b/src/visualizations/Goom/goom2k4-0/src/mathtools.c
new file mode 100644
index 0000000000..b2b02ea05b
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/mathtools.c
@@ -0,0 +1,84 @@
+/*---------------------------------------------------------------------------*/
+/*
+** mathtools.c
+** Goom Project
+**
+** Created by Jeko on Sun Jul 20 2003
+ ** Copyright (c) 2003 iOS. All rights reserved.
+*/
+/*---------------------------------------------------------------------------*/
+
+#include "mathtools.h"
+
+float sin256[256] = {
+ 0,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962
+ ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895
+ ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998
+ ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541
+ ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585
+ ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421
+ ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702
+ ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699
+ ,1,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278
+ ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993
+ ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854
+ ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247
+ ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808
+ ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241
+ ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101
+ ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412
+ ,1.22465e-16,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962
+ ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895
+ ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998
+ ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541
+ ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585
+ ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421
+ ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702
+ ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699
+ ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278
+ ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993
+ ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854
+ ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247
+ ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808
+ ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241
+ ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101
+ ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412
+
+};
+
+float cos256[256] = {
+ 0,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278
+ ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993
+ ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854
+ ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247
+ ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808
+ ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241
+ ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101
+ ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412
+ ,6.12323e-17,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962
+ ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895
+ ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998
+ ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541
+ ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585
+ ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421
+ ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702
+ ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699
+ ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278
+ ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993
+ ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854
+ ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247
+ ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808
+ ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241
+ ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101
+ ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412
+ ,-1.83697e-16,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962
+ ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895
+ ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998
+ ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541
+ ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585
+ ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421
+ ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702
+ ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699
+
+};
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/mathtools.h b/src/visualizations/Goom/goom2k4-0/src/mathtools.h
new file mode 100644
index 0000000000..0e2293c3fa
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/mathtools.h
@@ -0,0 +1,36 @@
+#ifndef MATHTOOLS_H
+#define MATHTOOLS_H
+
+
+#define _double2fixmagic (68719476736.0*1.5)
+/* 2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor */
+#define _shiftamt 16
+/* 16.16 fixed point representation */
+
+#if BigEndian_
+#define iexp_ 0
+#define iman_ 1
+#else
+#define iexp_ 1
+#define iman_ 0
+#endif /* BigEndian_ */
+
+/* TODO: this optimization is very efficient: put it again when all works
+#ifdef HAVE_MMX
+#define F2I(dbl,i) {double d = dbl + _double2fixmagic; i = ((int*)&d)[iman_] >> _shiftamt;}
+#else*/
+#define F2I(dbl,i) i=(int)dbl;
+/*#endif*/
+
+#if 0
+#define SINCOS(f,s,c) \
+ __asm__ __volatile__ ("fsincos" : "=t" (c), "=u" (s) : "0" (f))
+#else
+#define SINCOS(f,s,c) {s=sin(f);c=cos(f);}
+#endif
+
+extern float sin256[256];
+extern float cos256[256];
+
+#endif
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/mmx.c b/src/visualizations/Goom/goom2k4-0/src/mmx.c
new file mode 100644
index 0000000000..8effa520fd
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/mmx.c
@@ -0,0 +1,275 @@
+#ifdef HAVE_MMX
+
+#define BUFFPOINTNB 16
+#define BUFFPOINTMASK 0xffff
+#define BUFFINCR 0xff
+
+#include "mmx.h"
+#include "goom_graphic.h"
+
+#define sqrtperte 16
+// faire : a % sqrtperte <=> a & pertemask
+#define PERTEMASK 0xf
+// faire : a / sqrtperte <=> a >> PERTEDEC
+#define PERTEDEC 4
+
+int mmx_supported (void) {
+ return (mm_support()&0x1);
+}
+
+void zoom_filter_mmx (int prevX, int prevY,
+ Pixel *expix1, Pixel *expix2,
+ int *brutS, int *brutD, int buffratio,
+ int precalCoef[16][16])
+{
+ unsigned int ax = (prevX-1)<<PERTEDEC, ay = (prevY-1)<<PERTEDEC;
+
+ int bufsize = prevX * prevY;
+ int loop;
+
+ __asm__ __volatile__ ("pxor %mm7,%mm7");
+
+ for (loop=0; loop<bufsize; loop++)
+ {
+ /* int couleur; */
+ int px,py;
+ int pos;
+ int coeffs;
+
+ int myPos = loop << 1,
+ myPos2 = myPos + 1;
+ int brutSmypos = brutS[myPos];
+
+ px = brutSmypos + (((brutD[myPos] - brutSmypos)*buffratio) >> BUFFPOINTNB);
+ brutSmypos = brutS[myPos2];
+ py = brutSmypos + (((brutD[myPos2] - brutSmypos)*buffratio) >> BUFFPOINTNB);
+
+ if ((py>=ay) || (px>=ax)) {
+ pos=coeffs=0;
+ }
+ else {
+ pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC));
+ // coef en modulo 15
+ coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK];
+ }
+
+ __asm__ __volatile__ (
+ "movd %2, %%mm6 \n\t"
+
+ /* recuperation des deux premiers pixels dans mm0 et mm1 */
+ "movq (%3,%1,4), %%mm0 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */
+ "movq %%mm0, %%mm1 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */
+
+ /* depackage du premier pixel */
+ "punpcklbw %%mm7, %%mm0 \n\t" /* 00-b2-00-v2-00-r2-00-a2 */
+
+ "movq %%mm6, %%mm5 \n\t" /* ??-??-??-??-c4-c3-c2-c1 */
+ /* depackage du 2ieme pixel */
+ "punpckhbw %%mm7, %%mm1 \n\t" /* 00-b1-00-v1-00-r1-00-a1 */
+
+ /* extraction des coefficients... */
+ "punpcklbw %%mm5, %%mm6 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */
+ "movq %%mm6, %%mm4 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */
+ "movq %%mm6, %%mm5 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */
+
+ "punpcklbw %%mm5, %%mm6 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */
+ "punpckhbw %%mm5, %%mm4 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */
+
+ "movq %%mm6, %%mm3 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */
+
+ "punpcklbw %%mm7, %%mm6 \n\t" /* 00-c1-00-c1-00-c1-00-c1 */
+ "punpckhbw %%mm7, %%mm3 \n\t" /* 00-c2-00-c2-00-c2-00-c2 */
+
+ /* multiplication des pixels par les coefficients */
+ "pmullw %%mm6, %%mm0 \n\t" /* c1*b2-c1*v2-c1*r2-c1*a2 */
+ "pmullw %%mm3, %%mm1 \n\t" /* c2*b1-c2*v1-c2*r1-c2*a1 */
+ "paddw %%mm1, %%mm0 \n\t"
+
+ /* ...extraction des 2 derniers coefficients */
+ "movq %%mm4, %%mm5 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */
+ "punpcklbw %%mm7, %%mm4 \n\t" /* 00-c3-00-c3-00-c3-00-c3 */
+ "punpckhbw %%mm7, %%mm5 \n\t" /* 00-c4-00-c4-00-c4-00-c4 */
+
+ /* ajouter la longueur de ligne a esi */
+ "addl %4,%1 \n\t"
+
+ /* recuperation des 2 derniers pixels */
+ "movq (%3,%1,4), %%mm1 \n\t"
+ "movq %%mm1, %%mm2 \n\t"
+
+ /* depackage des pixels */
+ "punpcklbw %%mm7, %%mm1 \n\t"
+ "punpckhbw %%mm7, %%mm2 \n\t"
+
+ /* multiplication pas les coeffs */
+ "pmullw %%mm4, %%mm1 \n\t"
+ "pmullw %%mm5, %%mm2 \n\t"
+
+ /* ajout des valeurs obtenues à la valeur finale */
+ "paddw %%mm1, %%mm0 \n\t"
+ "paddw %%mm2, %%mm0 \n\t"
+
+ /* division par 256 = 16+16+16+16, puis repackage du pixel final */
+ "psrlw $8, %%mm0 \n\t"
+ "packuswb %%mm7, %%mm0 \n\t"
+
+ "movd %%mm0,%0 \n\t"
+ :"=g"(expix2[loop])
+ :"r"(pos),"r"(coeffs),"r"(expix1),"r"(prevX)
+
+ );
+
+ emms();
+ }
+}
+
+#define DRAWMETHOD_PLUS_MMX(_out,_backbuf,_col) \
+{ \
+ movd_m2r(_backbuf, mm0); \
+ paddusb_m2r(_col, mm0); \
+ movd_r2m(mm0, _out); \
+}
+
+#define DRAWMETHOD DRAWMETHOD_PLUS_MMX(*p,*p,col)
+
+void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny)
+{
+ int x, y, dx, dy, yy, xx;
+ Pixel *p;
+
+ if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx))
+ goto end_of_line;
+
+ dx = x2 - x1;
+ dy = y2 - y1;
+ if (x1 >= x2) {
+ int tmp;
+
+ tmp = x1;
+ x1 = x2;
+ x2 = tmp;
+ tmp = y1;
+ y1 = y2;
+ y2 = tmp;
+ dx = x2 - x1;
+ dy = y2 - y1;
+ }
+
+ /* vertical line */
+ if (dx == 0) {
+ if (y1 < y2) {
+ p = &(data[(screenx * y1) + x1]);
+ for (y = y1; y <= y2; y++) {
+ DRAWMETHOD;
+ p += screenx;
+ }
+ }
+ else {
+ p = &(data[(screenx * y2) + x1]);
+ for (y = y2; y <= y1; y++) {
+ DRAWMETHOD;
+ p += screenx;
+ }
+ }
+ goto end_of_line;
+ }
+ /* horizontal line */
+ if (dy == 0) {
+ if (x1 < x2) {
+ p = &(data[(screenx * y1) + x1]);
+ for (x = x1; x <= x2; x++) {
+ DRAWMETHOD;
+ p++;
+ }
+ goto end_of_line;
+ }
+ else {
+ p = &(data[(screenx * y1) + x2]);
+ for (x = x2; x <= x1; x++) {
+ DRAWMETHOD;
+ p++;
+ }
+ goto end_of_line;
+ }
+ }
+ /* 1 */
+ /* \ */
+ /* \ */
+ /* 2 */
+ if (y2 > y1) {
+ /* steep */
+ if (dy > dx) {
+ dx = ((dx << 16) / dy);
+ x = x1 << 16;
+ for (y = y1; y <= y2; y++) {
+ xx = x >> 16;
+ p = &(data[(screenx * y) + xx]);
+ DRAWMETHOD;
+ if (xx < (screenx - 1)) {
+ p++;
+ /* DRAWMETHOD; */
+ }
+ x += dx;
+ }
+ goto end_of_line;
+ }
+ /* shallow */
+ else {
+ dy = ((dy << 16) / dx);
+ y = y1 << 16;
+ for (x = x1; x <= x2; x++) {
+ yy = y >> 16;
+ p = &(data[(screenx * yy) + x]);
+ DRAWMETHOD;
+ if (yy < (screeny - 1)) {
+ p += screeny;
+ /* DRAWMETHOD; */
+ }
+ y += dy;
+ }
+ }
+ }
+ /* 2 */
+ /* / */
+ /* / */
+ /* 1 */
+ else {
+ /* steep */
+ if (-dy > dx) {
+ dx = ((dx << 16) / -dy);
+ x = (x1 + 1) << 16;
+ for (y = y1; y >= y2; y--) {
+ xx = x >> 16;
+ p = &(data[(screenx * y) + xx]);
+ DRAWMETHOD;
+ if (xx < (screenx - 1)) {
+ p--;
+ /* DRAWMETHOD; */
+ }
+ x += dx;
+ }
+ goto end_of_line;
+ }
+ /* shallow */
+ else {
+ dy = ((dy << 16) / dx);
+ y = y1 << 16;
+ for (x = x1; x <= x2; x++) {
+ yy = y >> 16;
+ p = &(data[(screenx * yy) + x]);
+ DRAWMETHOD;
+ if (yy < (screeny - 1)) {
+ p += screeny;
+ /* DRAWMETHOD; */
+ }
+ y += dy;
+ }
+ goto end_of_line;
+ }
+ }
+end_of_line:
+ emms();
+ /* __asm__ __volatile__ ("emms"); */
+}
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/mmx.h b/src/visualizations/Goom/goom2k4-0/src/mmx.h
new file mode 100644
index 0000000000..3fae26b985
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/mmx.h
@@ -0,0 +1,729 @@
+/* mmx.h
+
+ MultiMedia eXtensions GCC interface library for IA32.
+
+ To use this library, simply include this header file
+ and compile with GCC. You MUST have inlining enabled
+ in order for mmx_ok() to work; this can be done by
+ simply using -O on the GCC command line.
+
+ Compiling with -DMMX_TRACE will cause detailed trace
+ output to be sent to stderr for each mmx operation.
+ This adds lots of code, and obviously slows execution to
+ a crawl, but can be very useful for debugging.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
+ LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR ANY PARTICULAR PURPOSE.
+
+ 1997-99 by H. Dietz and R. Fisher
+
+ Notes:
+ It appears that the latest gas has the pand problem fixed, therefore
+ I'll undefine BROKEN_PAND by default.
+*/
+
+#ifndef _MMX_H
+#define _MMX_H
+
+#include "goom_graphic.h"
+
+/* Warning: at this writing, the version of GAS packaged
+ with most Linux distributions does not handle the
+ parallel AND operation mnemonic correctly. If the
+ symbol BROKEN_PAND is defined, a slower alternative
+ coding will be used. If execution of mmxtest results
+ in an illegal instruction fault, define this symbol.
+*/
+#undef BROKEN_PAND
+
+
+/* The type of an value that fits in an MMX register
+ (note that long long constant values MUST be suffixed
+ by LL and unsigned long long values by ULL, lest
+ they be truncated by the compiler)
+*/
+typedef union {
+ long long q; /* Quadword (64-bit) value */
+ unsigned long long uq; /* Unsigned Quadword */
+ int d[2]; /* 2 Doubleword (32-bit) values */
+ unsigned int ud[2]; /* 2 Unsigned Doubleword */
+ short w[4]; /* 4 Word (16-bit) values */
+ unsigned short uw[4]; /* 4 Unsigned Word */
+ char b[8]; /* 8 Byte (8-bit) values */
+ unsigned char ub[8]; /* 8 Unsigned Byte */
+ float s[2]; /* Single-precision (32-bit) value */
+} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */
+
+
+
+/* Function to test if multimedia instructions are supported...
+*/
+static int
+mm_support(void)
+{
+ /* Returns 1 if MMX instructions are supported,
+ 3 if Cyrix MMX and Extended MMX instructions are supported
+ 5 if AMD MMX and 3DNow! instructions are supported
+ 13 if AMD Extended MMX, &3dNow supported
+ 0 if hardware does not support any of these
+ */
+ register int rval = 0;
+
+ __asm__ __volatile__ (
+ /* See if CPUID instruction is supported ... */
+ /* ... Get copies of EFLAGS into eax and ecx */
+ "pushl %%ebx\n\t"
+ "pushf\n\t"
+ "popl %%eax\n\t"
+ "movl %%eax, %%ecx\n\t"
+
+ /* ... Toggle the ID bit in one copy and store */
+ /* to the EFLAGS reg */
+ "xorl $0x200000, %%eax\n\t"
+ "push %%eax\n\t"
+ "popf\n\t"
+
+ /* ... Get the (hopefully modified) EFLAGS */
+ "pushf\n\t"
+ "popl %%eax\n\t"
+
+ /* ... Compare and test result */
+ "xorl %%eax, %%ecx\n\t"
+ "testl $0x200000, %%ecx\n\t"
+ "jz NotSupported1\n\t" /* CPUID not supported */
+
+
+ /* Get standard CPUID information, and
+ go to a specific vendor section */
+ "movl $0, %%eax\n\t"
+ "cpuid\n\t"
+
+ /* Check for Intel */
+ "cmpl $0x756e6547, %%ebx\n\t"
+ "jne TryAMD\n\t"
+ "cmpl $0x49656e69, %%edx\n\t"
+ "jne TryAMD\n\t"
+ "cmpl $0x6c65746e, %%ecx\n"
+ "jne TryAMD\n\t"
+ "jmp Intel\n\t"
+
+ /* Check for AMD */
+ "\nTryAMD:\n\t"
+ "cmpl $0x68747541, %%ebx\n\t"
+ "jne TryCyrix\n\t"
+ "cmpl $0x69746e65, %%edx\n\t"
+ "jne TryCyrix\n\t"
+ "cmpl $0x444d4163, %%ecx\n"
+ "jne TryCyrix\n\t"
+ "jmp AMD\n\t"
+
+ /* Check for Cyrix */
+ "\nTryCyrix:\n\t"
+ "cmpl $0x69727943, %%ebx\n\t"
+ "jne NotSupported2\n\t"
+ "cmpl $0x736e4978, %%edx\n\t"
+ "jne NotSupported3\n\t"
+ "cmpl $0x64616574, %%ecx\n\t"
+ "jne NotSupported4\n\t"
+ /* Drop through to Cyrix... */
+
+
+ /* Cyrix Section */
+ /* See if extended CPUID level 80000001 is supported */
+ /* The value of CPUID/80000001 for the 6x86MX is undefined
+ according to the Cyrix CPU Detection Guide (Preliminary
+ Rev. 1.01 table 1), so we'll check the value of eax for
+ CPUID/0 to see if standard CPUID level 2 is supported.
+ According to the table, the only CPU which supports level
+ 2 is also the only one which supports extended CPUID levels.
+ */
+ "cmpl $0x2, %%eax\n\t"
+ "jne MMXtest\n\t" /* Use standard CPUID instead */
+
+ /* Extended CPUID supported (in theory), so get extended
+ features */
+ "movl $0x80000001, %%eax\n\t"
+ "cpuid\n\t"
+ "testl $0x00800000, %%eax\n\t" /* Test for MMX */
+ "jz NotSupported5\n\t" /* MMX not supported */
+ "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */
+ "jnz EMMXSupported\n\t"
+ "movl $1, %0\n\n\t" /* MMX Supported */
+ "jmp Return\n\n"
+ "EMMXSupported:\n\t"
+ "movl $3, %0\n\n\t" /* EMMX and MMX Supported */
+ "jmp Return\n\t"
+
+
+ /* AMD Section */
+ "AMD:\n\t"
+
+ /* See if extended CPUID is supported */
+ "movl $0x80000000, %%eax\n\t"
+ "cpuid\n\t"
+ "cmpl $0x80000000, %%eax\n\t"
+ "jl MMXtest\n\t" /* Use standard CPUID instead */
+
+ /* Extended CPUID supported, so get extended features */
+ "movl $0x80000001, %%eax\n\t"
+ "cpuid\n\t"
+ "testl $0x00800000, %%edx\n\t" /* Test for MMX */
+ "jz NotSupported6\n\t" /* MMX not supported */
+ "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */
+ "jnz ThreeDNowSupported\n\t"
+ "movl $1, %0\n\n\t" /* MMX Supported */
+ "jmp Return\n\n"
+ "ThreeDNowSupported:\n\t"
+ "testl $0x40000000, %%edx\n\t" /* Test AMD Extended MMX */
+ "jnz AMDXMMXSupported\n\t"
+ "movl $5, %0\n\n\t" /* 3DNow! and MMX Supported */
+ "jmp Return\n\t"
+ "AMDXMMXSupported:\n\t"
+ "movl $13, %0\n\n\t" /* XMMX, 3DNow! and MMX Supported */
+ "jmp Return\n\t"
+
+
+ /* Intel Section */
+ "Intel:\n\t"
+
+ /* Check for MMX */
+ "MMXtest:\n\t"
+ "movl $1, %%eax\n\t"
+ "cpuid\n\t"
+ "testl $0x00800000, %%edx\n\t" /* Test for MMX */
+ "jz NotSupported7\n\t" /* MMX Not supported */
+ "movl $1, %0\n\n\t" /* MMX Supported */
+ "jmp Return\n\t"
+
+ /* Nothing supported */
+ "\nNotSupported1:\n\t"
+ "#movl $101, %0\n\n\t"
+ "\nNotSupported2:\n\t"
+ "#movl $102, %0\n\n\t"
+ "\nNotSupported3:\n\t"
+ "#movl $103, %0\n\n\t"
+ "\nNotSupported4:\n\t"
+ "#movl $104, %0\n\n\t"
+ "\nNotSupported5:\n\t"
+ "#movl $105, %0\n\n\t"
+ "\nNotSupported6:\n\t"
+ "#movl $106, %0\n\n\t"
+ "\nNotSupported7:\n\t"
+ "#movl $107, %0\n\n\t"
+ "movl $0, %0\n\n\t"
+
+ "Return:\n\t"
+ "popl %%ebx\n\t"
+ : "=X" (rval)
+ : /* no input */
+ : "eax", "ecx", "edx"
+ );
+
+ /* Return */
+ return(rval);
+}
+
+/* Function to test if mmx instructions are supported...
+*/
+static inline int
+mmx_ok(void)
+{
+ /* Returns 1 if MMX instructions are supported, 0 otherwise */
+ return ( mm_support() & 0x1 );
+}
+
+int mmx_supported (void);
+int xmmx_supported (void);
+
+
+/* MMX optimized implementations */
+void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny);
+void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny);
+void zoom_filter_mmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2,
+ int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
+void zoom_filter_xmmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2,
+ int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]);
+
+
+/* Helper functions for the instruction macros that follow...
+ (note that memory-to-register, m2r, instructions are nearly
+ as efficient as register-to-register, r2r, instructions;
+ however, memory-to-memory instructions are really simulated
+ as a convenience, and are only 1/3 as efficient)
+*/
+#ifdef MMX_TRACE
+
+/* Include the stuff for printing a trace to stderr...
+*/
+
+#include <stdio.h>
+
+#define mmx_i2r(op, imm, reg) \
+ { \
+ mmx_t mmx_trace; \
+ mmx_trace.uq = (imm); \
+ printf(#op "_i2r(" #imm "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#reg "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ (#op " %0, %%" #reg \
+ : /* nothing */ \
+ : "X" (imm)); \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#reg "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#define mmx_m2r(op, mem, reg) \
+ { \
+ mmx_t mmx_trace; \
+ mmx_trace = (mem); \
+ printf(#op "_m2r(" #mem "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#reg "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ (#op " %0, %%" #reg \
+ : /* nothing */ \
+ : "m" (mem)); \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#reg "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#define mmx_r2m(op, reg, mem) \
+ { \
+ mmx_t mmx_trace; \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#op "_r2m(" #reg "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ mmx_trace = (mem); \
+ printf(#mem "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ (#op " %%" #reg ", %0" \
+ : "=m" (mem) \
+ : /* nothing */ ); \
+ mmx_trace = (mem); \
+ printf(#mem "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#define mmx_r2r(op, regs, regd) \
+ { \
+ mmx_t mmx_trace; \
+ __asm__ __volatile__ ("movq %%" #regs ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#op "_r2r(" #regs "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ ("movq %%" #regd ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#regd "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ (#op " %" #regs ", %" #regd); \
+ __asm__ __volatile__ ("movq %%" #regd ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ printf(#regd "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#define mmx_m2m(op, mems, memd) \
+ { \
+ mmx_t mmx_trace; \
+ mmx_trace = (mems); \
+ printf(#op "_m2m(" #mems "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ mmx_trace = (memd); \
+ printf(#memd "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+ #op " %1, %%mm0\n\t" \
+ "movq %%mm0, %0" \
+ : "=m" (memd) \
+ : "m" (mems)); \
+ mmx_trace = (memd); \
+ printf(#memd "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#else
+
+/* These macros are a lot simpler without the tracing...
+*/
+
+#define mmx_i2r(op, imm, reg) \
+ __asm__ __volatile__ (#op " %0, %%" #reg \
+ : /* nothing */ \
+ : "X" (imm) )
+
+#define mmx_m2r(op, mem, reg) \
+ __asm__ __volatile__ (#op " %0, %%" #reg \
+ : /* nothing */ \
+ : "m" (mem))
+
+#define mmx_r2m(op, reg, mem) \
+ __asm__ __volatile__ (#op " %%" #reg ", %0" \
+ : "=m" (mem) \
+ : /* nothing */ )
+
+#define mmx_r2r(op, regs, regd) \
+ __asm__ __volatile__ (#op " %" #regs ", %" #regd)
+
+#define mmx_m2m(op, mems, memd) \
+ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+ #op " %1, %%mm0\n\t" \
+ "movq %%mm0, %0" \
+ : "=m" (memd) \
+ : "m" (mems))
+
+#endif
+
+
+/* 1x64 MOVe Quadword
+ (this is both a load and a store...
+ in fact, it is the only way to store)
+*/
+#define movq_m2r(var, reg) mmx_m2r(movq, var, reg)
+#define movq_r2m(reg, var) mmx_r2m(movq, reg, var)
+#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd)
+#define movq(vars, vard) \
+ __asm__ __volatile__ ("movq %1, %%mm0\n\t" \
+ "movq %%mm0, %0" \
+ : "=X" (vard) \
+ : "X" (vars))
+
+
+/* 1x32 MOVe Doubleword
+ (like movq, this is both load and store...
+ but is most useful for moving things between
+ mmx registers and ordinary registers)
+*/
+#define movd_m2r(var, reg) mmx_m2r(movd, var, reg)
+#define movd_r2m(reg, var) mmx_r2m(movd, reg, var)
+#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd)
+#define movd(vars, vard) \
+ __asm__ __volatile__ ("movd %1, %%mm0\n\t" \
+ "movd %%mm0, %0" \
+ : "=X" (vard) \
+ : "X" (vars))
+
+
+/* 2x32, 4x16, and 8x8 Parallel ADDs
+*/
+#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg)
+#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd)
+#define paddd(vars, vard) mmx_m2m(paddd, vars, vard)
+
+#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg)
+#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd)
+#define paddw(vars, vard) mmx_m2m(paddw, vars, vard)
+
+#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg)
+#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd)
+#define paddb(vars, vard) mmx_m2m(paddb, vars, vard)
+
+
+/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic
+*/
+#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg)
+#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd)
+#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard)
+
+#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg)
+#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd)
+#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard)
+
+
+/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic
+*/
+#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg)
+#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd)
+#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard)
+
+#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg)
+#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd)
+#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard)
+
+
+/* 2x32, 4x16, and 8x8 Parallel SUBs
+*/
+#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg)
+#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd)
+#define psubd(vars, vard) mmx_m2m(psubd, vars, vard)
+
+#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg)
+#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd)
+#define psubw(vars, vard) mmx_m2m(psubw, vars, vard)
+
+#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg)
+#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd)
+#define psubb(vars, vard) mmx_m2m(psubb, vars, vard)
+
+
+/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic
+*/
+#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg)
+#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd)
+#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard)
+
+#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg)
+#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd)
+#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard)
+
+
+/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic
+*/
+#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg)
+#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd)
+#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard)
+
+#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg)
+#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd)
+#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard)
+
+
+/* 4x16 Parallel MULs giving Low 4x16 portions of results
+*/
+#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg)
+#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd)
+#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard)
+
+
+/* 4x16 Parallel MULs giving High 4x16 portions of results
+*/
+#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg)
+#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd)
+#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard)
+
+
+/* 4x16->2x32 Parallel Mul-ADD
+ (muls like pmullw, then adds adjacent 16-bit fields
+ in the multiply result to make the final 2x32 result)
+*/
+#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg)
+#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd)
+#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard)
+
+
+/* 1x64 bitwise AND
+*/
+#ifdef BROKEN_PAND
+#define pand_m2r(var, reg) \
+ { \
+ mmx_m2r(pandn, (mmx_t) -1LL, reg); \
+ mmx_m2r(pandn, var, reg); \
+ }
+#define pand_r2r(regs, regd) \
+ { \
+ mmx_m2r(pandn, (mmx_t) -1LL, regd); \
+ mmx_r2r(pandn, regs, regd) \
+ }
+#define pand(vars, vard) \
+ { \
+ movq_m2r(vard, mm0); \
+ mmx_m2r(pandn, (mmx_t) -1LL, mm0); \
+ mmx_m2r(pandn, vars, mm0); \
+ movq_r2m(mm0, vard); \
+ }
+#else
+#define pand_m2r(var, reg) mmx_m2r(pand, var, reg)
+#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd)
+#define pand(vars, vard) mmx_m2m(pand, vars, vard)
+#endif
+
+
+/* 1x64 bitwise AND with Not the destination
+*/
+#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg)
+#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd)
+#define pandn(vars, vard) mmx_m2m(pandn, vars, vard)
+
+
+/* 1x64 bitwise OR
+*/
+#define por_m2r(var, reg) mmx_m2r(por, var, reg)
+#define por_r2r(regs, regd) mmx_r2r(por, regs, regd)
+#define por(vars, vard) mmx_m2m(por, vars, vard)
+
+
+/* 1x64 bitwise eXclusive OR
+*/
+#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg)
+#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd)
+#define pxor(vars, vard) mmx_m2m(pxor, vars, vard)
+
+
+/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality
+ (resulting fields are either 0 or -1)
+*/
+#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg)
+#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd)
+#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard)
+
+#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg)
+#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd)
+#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard)
+
+#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg)
+#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd)
+#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard)
+
+
+/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than
+ (resulting fields are either 0 or -1)
+*/
+#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg)
+#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd)
+#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard)
+
+#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg)
+#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd)
+#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard)
+
+#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg)
+#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd)
+#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard)
+
+
+/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical
+*/
+#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg)
+#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg)
+#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd)
+#define psllq(vars, vard) mmx_m2m(psllq, vars, vard)
+
+#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg)
+#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg)
+#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd)
+#define pslld(vars, vard) mmx_m2m(pslld, vars, vard)
+
+#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg)
+#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg)
+#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd)
+#define psllw(vars, vard) mmx_m2m(psllw, vars, vard)
+
+
+/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical
+*/
+#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg)
+#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg)
+#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd)
+#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard)
+
+#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg)
+#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg)
+#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd)
+#define psrld(vars, vard) mmx_m2m(psrld, vars, vard)
+
+#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg)
+#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg)
+#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd)
+#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard)
+
+
+/* 2x32 and 4x16 Parallel Shift Right Arithmetic
+*/
+#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg)
+#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg)
+#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd)
+#define psrad(vars, vard) mmx_m2m(psrad, vars, vard)
+
+#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg)
+#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg)
+#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd)
+#define psraw(vars, vard) mmx_m2m(psraw, vars, vard)
+
+
+/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate
+ (packs source and dest fields into dest in that order)
+*/
+#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg)
+#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd)
+#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard)
+
+#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg)
+#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd)
+#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard)
+
+
+/* 4x16->8x8 PACK and Unsigned Saturate
+ (packs source and dest fields into dest in that order)
+*/
+#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg)
+#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd)
+#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard)
+
+
+/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low
+ (interleaves low half of dest with low half of source
+ as padding in each result field)
+*/
+#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg)
+#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd)
+#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard)
+
+#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg)
+#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd)
+#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard)
+
+#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg)
+#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd)
+#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard)
+
+
+/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High
+ (interleaves high half of dest with high half of source
+ as padding in each result field)
+*/
+#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg)
+#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd)
+#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard)
+
+#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg)
+#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd)
+#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard)
+
+#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg)
+#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd)
+#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard)
+
+
+/* Empty MMx State
+ (used to clean-up when going from mmx to float use
+ of the registers that are shared by both; note that
+ there is no float-to-mmx operation needed, because
+ only the float tag word info is corruptible)
+*/
+#ifdef MMX_TRACE
+
+#define emms() \
+ { \
+ printf("emms()\n"); \
+ __asm__ __volatile__ ("emms" \
+ "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"); \
+ }
+
+#else
+
+#define emms() __asm__ __volatile__ ("emms"::: \
+ "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)")
+
+#endif
+
+#endif
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/motif_goom1.h b/src/visualizations/Goom/goom2k4-0/src/motif_goom1.h
new file mode 100644
index 0000000000..b4a9f3f1d2
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/motif_goom1.h
@@ -0,0 +1,1026 @@
+static Motif CONV_MOTIF1 = {
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,14,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,13,9,9,7,2,2,9,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11,
+ 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,12,7,4,0,0,0,2,0,0,3,14,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,12,10,9,9,4,1,0,
+ 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,10,3,0,0,0,1,1,3,5,0,0,1,14,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,14,6,3,1,1,4,9,1,
+ 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 10,3,0,0,2,7,13,14,14,14,7,0,0,2,14,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,12,1,9,15,15,15,15,3,
+ 0,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,4,
+ 0,0,2,10,15,15,15,15,15,15,1,0,0,10,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,9,0,2,14,15,15,15,7,
+ 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,14,6,0,0,
+ 2,9,15,15,15,15,15,15,15,13,0,0,3,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,11,0,0,10,15,15,15,9,
+ 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,13,3,0,1,5,
+ 5,4,4,4,6,12,15,15,15,13,0,0,7,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,14,0,0,5,15,15,15,10,
+ 0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,11,1,0,3,3,1,
+ 0,0,0,0,0,0,5,13,15,12,0,0,13,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,13,14,15,
+ 15,15,15,15,15,15,15,15,14,0,0,1,15,15,15,12,
+ 0,3,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,10,1,2,4,0,0,1,
+ 9,12,12,12,9,3,0,2,14,5,0,7,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,14,7,4,4,1,1,12,
+ 15,15,15,15,15,15,15,15,14,1,0,0,12,15,15,15,
+ 1,0,12,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,10,0,3,2,0,0,3,12,
+ 15,15,15,15,15,14,2,1,13,2,0,12,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,14,3,0,0,0,0,0,2,
+ 13,15,15,15,15,15,15,15,14,1,0,0,8,15,15,15,
+ 1,0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,12,2,1,0,0,0,9,14,15,
+ 15,15,15,15,15,14,1,1,11,0,3,14,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,7,4,11,12,10,1,0,
+ 3,12,15,15,15,15,15,15,13,1,1,0,4,15,15,15,
+ 2,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,14,2,1,0,0,3,12,15,15,15,
+ 15,15,15,15,15,11,0,5,9,1,12,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,5,1,13,15,15,12,1,
+ 0,1,9,15,15,15,15,15,14,2,5,0,1,14,15,15,
+ 2,0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,14,3,0,0,0,7,14,15,15,15,15,
+ 15,15,15,15,15,9,0,8,7,4,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,7,0,7,8,11,15,13,
+ 2,0,0,3,10,15,15,15,15,5,11,0,0,11,15,15,
+ 6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,6,0,0,0,8,15,15,15,15,15,15,
+ 15,15,15,15,15,6,0,4,0,6,15,15,15,15,15,15,
+ 14,9,14,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,11,0,3,3,0,8,15,
+ 14,5,0,0,0,4,12,15,15,5,13,2,0,6,15,15,
+ 12,0,0,11,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,10,0,0,0,8,15,15,15,15,15,15,15,
+ 15,15,15,15,10,1,7,6,4,13,15,15,15,15,13,11,
+ 6,0,8,11,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,1,1,11,2,0,5,
+ 14,15,8,0,0,0,0,7,15,5,14,6,0,2,15,15,
+ 15,3,0,5,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,13,1,0,0,7,15,15,15,15,15,15,15,15,
+ 15,15,15,15,7,9,15,15,15,15,15,15,12,6,2,1,
+ 1,1,8,6,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,4,0,6,12,1,0,
+ 3,13,15,11,2,0,0,0,8,4,14,10,0,0,13,15,
+ 15,7,0,1,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,5,0,0,5,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,13,15,15,15,15,14,8,3,1,2,7,11,
+ 5,4,5,6,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,8,0,1,14,11,0,
+ 0,1,9,15,14,5,0,0,2,4,14,13,0,0,10,15,
+ 15,12,0,0,12,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,10,0,0,1,14,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,14,13,7,2,0,5,9,15,15,15,
+ 5,3,6,9,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,13,0,0,9,15,12,
+ 2,0,0,4,13,14,4,0,3,2,12,15,1,0,5,15,
+ 15,14,1,0,8,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,2,0,0,9,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,12,11,6,1,0,2,3,10,15,15,15,15,7,
+ 1,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,5,0,3,14,15,
+ 9,2,0,0,1,6,12,13,13,1,9,12,0,0,2,14,
+ 15,15,4,0,4,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,10,0,0,2,14,15,15,15,15,15,15,15,15,15,15,
+ 13,9,6,0,1,2,9,10,15,15,15,15,14,7,1,0,
+ 6,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,15,
+ 4,4,11,6,1,0,0,1,1,0,10,4,0,0,0,12,
+ 15,15,9,0,1,14,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,3,0,0,8,15,15,15,15,15,15,15,13,12,4,4,
+ 1,1,3,10,12,15,15,15,15,15,9,2,1,0,1,6,
+ 6,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,4,0,3,14,
+ 4,3,15,15,14,9,7,9,1,0,0,0,0,1,0,7,
+ 15,15,13,0,0,9,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 13,0,0,1,14,15,15,15,15,15,12,9,1,0,1,4,
+ 7,15,15,15,15,15,15,14,8,2,0,0,0,2,13,9,
+ 0,4,14,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,
+ 3,0,8,14,15,15,15,15,10,5,4,4,7,4,0,3,
+ 15,15,15,4,0,3,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 5,0,0,5,15,15,15,15,14,8,7,8,10,12,14,15,
+ 15,15,15,15,15,15,11,1,0,0,0,5,11,15,13,1,
+ 1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,3,0,4,
+ 4,0,0,2,6,10,15,15,15,15,15,15,15,10,0,0,
+ 12,15,15,9,0,0,12,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 1,0,0,10,15,15,15,15,15,13,14,15,15,15,15,15,
+ 15,15,15,15,14,7,1,0,0,3,12,15,15,15,6,0,
+ 7,15,15,15,12,10,9,10,12,14,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,0,
+ 8,3,1,4,1,0,1,12,15,15,15,15,15,14,2,0,
+ 6,15,15,15,2,0,6,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 0,0,1,14,15,15,15,15,14,5,15,15,15,15,15,15,
+ 15,15,15,7,2,0,0,1,8,15,15,15,15,12,0,2,
+ 14,15,12,4,0,0,0,0,0,1,5,10,14,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,14,0,0,
+ 5,4,1,14,15,10,7,13,15,15,15,15,15,15,8,0,
+ 1,14,15,15,7,0,1,14,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,
+ 0,0,4,15,15,15,15,15,13,2,13,15,15,15,15,15,
+ 12,7,0,0,0,0,5,12,15,15,15,15,14,3,0,9,
+ 11,1,0,0,1,1,0,1,0,0,0,0,2,12,15,15,
+ 15,15,15,15,15,15,15,14,15,15,15,15,15,15,2,0,
+ 5,2,1,14,15,14,13,15,15,15,15,15,15,15,12,0,
+ 0,10,15,15,13,0,0,9,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,
+ 0,0,4,15,15,15,15,15,12,0,12,15,15,15,12,6,
+ 0,0,0,0,6,14,15,15,15,15,15,15,7,0,0,12,
+ 1,0,0,2,2,1,1,7,12,8,3,0,0,1,13,15,
+ 15,15,15,15,15,8,4,8,12,15,15,15,15,15,8,0,
+ 4,2,0,14,15,11,9,15,15,15,15,15,15,15,15,3,
+ 0,5,15,15,15,5,0,3,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,
+ 0,0,4,15,15,15,15,15,12,0,12,15,13,3,1,0,
+ 0,0,5,12,15,15,15,15,15,15,15,12,0,0,7,7,
+ 0,0,0,0,0,0,0,1,12,15,15,12,3,0,5,15,
+ 15,15,15,14,5,0,0,0,0,2,2,3,7,14,9,8,
+ 14,2,1,14,15,2,12,13,15,15,15,15,15,15,15,9,
+ 0,0,13,15,15,10,0,0,12,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,
+ 0,0,5,15,15,15,15,15,12,0,11,10,1,0,0,1,
+ 5,14,15,15,15,15,15,15,15,15,15,6,0,2,7,0,
+ 0,0,0,1,2,7,4,0,3,14,15,15,14,2,0,12,
+ 15,15,15,9,0,1,2,1,0,0,0,0,0,1,3,7,
+ 15,3,0,14,15,4,12,15,15,15,15,15,15,15,15,14,
+ 1,0,8,15,15,14,1,0,8,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,
+ 0,0,4,15,15,15,15,15,12,0,2,0,0,1,10,15,
+ 15,15,15,15,15,15,15,15,15,15,12,0,0,6,0,0,
+ 0,1,10,14,15,15,11,1,0,9,15,15,15,8,0,9,
+ 15,15,12,4,8,14,15,8,1,0,0,0,0,0,1,9,
+ 15,2,0,13,15,1,9,15,15,15,15,15,15,15,15,15,
+ 6,0,1,14,15,14,1,0,3,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14,
+ 1,0,1,14,15,15,15,15,12,1,3,7,9,13,15,15,
+ 15,15,15,15,15,15,15,15,15,15,3,0,2,3,0,4,
+ 0,8,15,15,15,15,15,13,1,2,14,15,15,10,0,6,
+ 15,14,2,6,15,15,15,1,3,7,3,0,0,0,0,1,
+ 11,1,0,11,12,0,12,15,15,15,15,15,15,15,15,15,
+ 11,0,0,9,15,15,4,0,0,12,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 6,0,0,9,15,15,15,15,15,12,14,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,11,0,0,3,0,8,14,
+ 2,5,15,15,15,15,15,15,5,0,8,15,15,12,0,4,
+ 15,5,2,14,15,15,10,0,13,15,13,2,4,5,5,0,
+ 9,1,0,10,9,1,14,15,15,15,15,15,15,15,15,15,
+ 13,0,0,3,15,15,9,0,0,8,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 12,0,0,3,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,3,0,1,1,5,14,15,
+ 11,0,12,15,15,15,15,15,14,1,1,14,15,12,0,4,
+ 10,0,9,15,15,11,1,8,15,15,8,1,14,15,14,2,
+ 5,0,0,10,6,2,15,15,15,15,15,15,15,15,15,15,
+ 15,3,0,0,12,15,13,0,0,2,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,3,0,0,10,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,10,0,0,1,0,11,15,15,
+ 15,2,6,15,15,15,15,15,15,6,0,9,15,13,0,6,
+ 3,0,13,15,14,2,6,15,15,13,1,8,15,15,15,4,
+ 3,1,0,10,7,2,15,15,15,15,15,15,15,15,15,15,
+ 15,9,0,0,6,15,15,3,0,0,13,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,9,0,0,2,14,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,11,10,2,0,3,0,3,15,15,15,
+ 15,8,1,14,15,15,15,15,15,13,0,2,15,9,1,10,
+ 0,3,15,15,6,2,14,15,14,3,1,14,15,15,15,2,
+ 4,0,0,12,5,3,15,15,15,15,15,15,15,15,15,15,
+ 15,14,1,0,1,14,15,5,0,0,12,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,4,0,0,6,15,15,15,15,15,15,15,15,14,12,
+ 12,9,5,4,4,3,0,0,0,0,4,0,8,15,15,15,
+ 15,13,1,10,15,15,15,15,15,15,2,0,11,3,5,10,
+ 0,7,15,9,1,11,15,15,8,0,6,15,15,15,10,0,
+ 3,0,0,13,3,6,15,15,15,15,15,15,15,15,15,15,
+ 15,15,6,0,0,12,15,5,0,0,7,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,13,1,0,0,8,14,15,15,13,6,4,4,1,0,
+ 0,0,0,0,0,0,2,0,0,4,3,0,12,15,15,15,
+ 15,15,5,3,15,15,15,15,14,8,0,0,1,1,12,9,
+ 0,9,10,0,6,15,15,15,2,2,14,15,15,13,2,0,
+ 4,0,1,13,0,10,15,15,15,15,15,15,15,15,15,15,
+ 15,15,13,1,0,10,15,10,0,0,5,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,9,0,0,0,3,2,2,1,0,0,0,1,4,
+ 4,5,10,12,12,12,11,0,0,11,4,0,12,15,15,15,
+ 15,15,12,0,7,13,15,15,5,0,0,0,1,6,15,9,
+ 0,3,0,0,1,6,14,10,0,12,15,15,11,2,0,2,
+ 3,0,3,12,1,11,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,3,0,6,8,7,0,0,5,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,9,1,0,0,0,2,6,10,12,12,14,15,
+ 15,15,15,15,11,5,4,0,2,14,4,0,12,15,15,15,
+ 15,15,15,4,0,3,13,6,0,0,0,1,2,14,15,12,
+ 0,0,0,0,0,0,2,2,6,15,14,8,0,0,0,7,
+ 4,0,4,12,0,12,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,12,0,0,0,0,0,0,1,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,12,2,0,0,0,1,6,11,15,15,15,
+ 15,15,15,15,2,1,0,0,9,15,6,0,7,15,15,15,
+ 15,15,15,13,2,0,0,0,0,0,0,1,12,15,15,15,
+ 4,0,0,0,0,0,0,6,13,6,1,0,0,4,13,15,
+ 6,0,6,12,0,12,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,14,5,0,0,0,0,0,5,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,14,5,0,0,0,0,0,2,4,5,
+ 7,3,6,3,0,2,0,2,15,15,11,0,0,9,15,15,
+ 15,15,15,15,11,0,0,0,0,0,2,11,15,15,15,15,
+ 12,1,0,0,1,4,6,10,2,0,0,0,7,14,15,15,
+ 9,0,9,9,0,12,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,13,9,8,9,7,13,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,12,6,1,0,0,0,0,0,
+ 0,0,0,2,8,0,0,9,15,15,14,4,0,0,3,10,
+ 14,15,15,15,15,13,3,0,0,4,14,15,15,15,15,15,
+ 15,11,2,0,0,1,1,0,0,0,1,11,15,15,15,15,
+ 9,0,10,5,3,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,14,12,10,5,4,6,
+ 2,4,10,14,8,0,1,14,15,15,15,14,5,0,0,0,
+ 1,2,4,4,4,3,1,2,9,14,15,15,15,15,15,15,
+ 15,15,15,11,11,13,10,9,9,11,15,15,15,15,15,15,
+ 10,0,8,2,4,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 2,7,15,14,1,0,6,15,15,15,15,15,15,10,6,4,
+ 2,2,4,4,4,3,9,14,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 11,0,3,1,4,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11,
+ 1,10,15,9,0,0,13,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 11,0,11,11,11,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,2,
+ 5,15,14,2,0,5,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 14,1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,
+ 13,15,11,0,0,12,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,1,
+ 15,15,5,0,3,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,10,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,12,2,3,
+ 15,14,1,0,7,15,15,15,15,15,13,15,15,15,15,14,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,13,12,12,11,9,4,7,14,15,
+ 14,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,12,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,14,3,0,10,
+ 15,9,0,0,8,7,4,2,2,1,0,3,4,3,4,9,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,14,13,11,7,4,2,0,0,0,0,0,0,1,12,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,14,13,11,7,4,2,2,13,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,12,0,3,11,
+ 7,1,0,0,0,0,0,1,4,9,11,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,14,12,11,9,7,4,
+ 3,1,0,0,0,0,0,0,0,0,0,2,11,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,13,11,8,
+ 4,3,1,0,0,0,0,3,8,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,14,11,3,0,0,0,
+ 0,0,0,2,6,9,12,14,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,13,9,6,3,1,0,0,0,0,0,0,
+ 0,0,0,0,1,4,7,11,12,12,12,14,15,15,15,15,
+ 15,15,15,15,15,15,15,14,12,11,7,4,2,0,0,0,
+ 0,0,0,1,5,10,13,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,14,12,7,3,1,0,0,0,2,5,
+ 2,0,2,14,15,15,15,15,15,15,15,15,15,14,13,12,
+ 11,9,6,4,2,0,0,0,0,0,0,0,0,1,2,4,
+ 5,9,11,13,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,14,12,11,7,4,3,1,0,0,0,0,0,0,0,1,
+ 4,5,10,14,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,13,10,5,1,0,0,0,1,0,0,2,13,14,
+ 1,0,8,15,15,14,12,11,9,8,4,3,2,1,0,0,
+ 0,0,0,0,1,3,2,3,5,9,10,12,13,14,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,13,11,10,6,4,
+ 3,1,0,0,0,0,0,0,0,0,1,4,7,11,13,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,11,4,0,0,0,1,4,9,13,13,1,0,0,1,7,
+ 0,0,7,8,5,2,0,0,0,0,0,0,1,2,3,4,
+ 5,9,10,12,14,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,14,11,8,4,3,1,0,0,0,0,0,
+ 0,0,0,0,1,4,5,9,12,13,15,15,15,15,15,15,
+ 15,15,14,12,9,8,8,7,4,2,5,4,5,5,12,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,14,10,5,
+ 1,0,1,3,6,11,14,15,15,15,15,13,12,8,3,2,
+ 0,0,1,1,3,3,4,5,8,10,12,13,14,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,
+ 11,9,6,4,2,1,0,0,0,0,0,0,0,1,2,4,
+ 6,10,11,13,15,15,15,15,15,15,15,15,13,11,9,7,
+ 4,2,1,0,0,0,0,2,4,7,12,14,14,14,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,10,5,1,1,3,
+ 8,12,14,15,15,15,15,15,15,15,15,15,15,15,15,9,
+ 3,11,14,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,8,6,9,9,9,9,9,8,5,4,4,3,1,0,
+ 0,0,0,0,1,2,3,2,4,5,9,11,12,14,15,15,
+ 15,15,15,15,15,15,15,14,12,9,5,2,0,0,0,0,
+ 0,1,2,4,7,10,14,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,14,9,4,1,3,9,13,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,
+ 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,13,3,1,1,1,1,1,1,1,0,0,0,0,2,3,
+ 5,8,10,12,14,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,12,5,2,0,0,0,1,3,4,7,10,
+ 12,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,13,11,13,13,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,14,12,12,12,13,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,8,1,0,1,4,7,11,13,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,13,7,8,11,14,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
+ };
diff --git a/src/visualizations/Goom/goom2k4-0/src/motif_goom2.h b/src/visualizations/Goom/goom2k4-0/src/motif_goom2.h
new file mode 100644
index 0000000000..4bde2a3d0a
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/motif_goom2.h
@@ -0,0 +1,1026 @@
+static Motif CONV_MOTIF2 = {
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,12,5,14,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,12,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,14,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,10,0,12,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,6,0,12,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,7,0,8,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,13,2,0,10,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,5,0,0,10,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,9,0,0,12,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,14,9,0,0,1,14,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,8,0,0,8,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,14,8,3,0,0,0,9,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,11,0,0,2,14,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,13,9,5,3,4,1,0,0,0,0,7,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,14,4,0,0,4,11,13,13,15,15,14,12,10,8,5,
+ 6,4,1,0,0,0,0,0,0,0,0,0,0,14,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,12,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,9,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 13,9,10,13,14,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,12,3,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,2,5,6,0,0,0,0,12,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 5,0,0,0,3,10,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,14,9,2,1,0,0,0,1,4,6,6,1,
+ 0,0,0,8,13,15,15,15,12,1,0,2,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14,
+ 2,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,3,0,0,10,15,15,15,10,
+ 0,0,4,15,15,15,15,15,15,2,0,6,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,5,
+ 3,11,5,0,0,0,0,0,4,11,14,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,7,0,0,13,15,15,15,11,
+ 0,0,7,15,15,15,15,15,15,1,0,9,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,
+ 13,15,15,12,5,0,0,0,0,0,1,8,14,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,7,0,1,14,15,15,15,11,
+ 0,0,7,15,15,15,15,15,14,0,0,9,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,11,1,10,
+ 15,15,15,15,15,11,5,0,0,0,0,0,1,6,13,15,
+ 15,15,15,15,14,8,11,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,6,0,2,15,15,15,15,11,
+ 0,0,6,15,15,15,15,15,13,0,0,11,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,11,1,6,15,
+ 15,15,15,15,15,15,15,14,5,0,0,0,0,0,0,6,
+ 14,15,15,15,6,0,4,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,7,0,5,15,15,15,15,11,
+ 0,0,5,15,15,15,15,15,12,0,0,12,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,13,2,1,13,15,
+ 15,15,15,15,15,15,15,15,15,12,2,0,0,0,0,0,
+ 1,6,11,7,0,0,4,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,7,0,7,15,15,15,15,11,
+ 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,5,0,7,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,11,5,0,0,0,
+ 0,0,0,0,0,1,11,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11,
+ 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,10,0,4,14,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,13,7,0,
+ 0,0,0,0,0,1,6,12,14,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11,
+ 0,0,7,15,15,15,15,15,12,0,0,12,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,13,1,1,12,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,
+ 5,0,0,0,0,0,0,0,3,10,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11,
+ 0,0,7,15,15,15,15,15,11,0,0,13,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,14,4,0,8,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 13,0,0,0,1,0,0,0,0,1,13,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11,
+ 0,0,8,15,15,15,15,15,8,0,2,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,9,0,4,14,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14,
+ 4,0,0,5,13,12,6,2,0,2,13,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11,
+ 0,0,7,15,15,15,15,15,4,0,4,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,13,1,1,13,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11,
+ 0,0,1,13,15,15,15,14,9,13,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,5,0,6,15,15,15,15,11,
+ 0,0,8,15,15,15,15,15,2,0,8,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,5,0,9,15,15,15,15,15,15,
+ 15,15,15,15,15,15,14,11,15,15,15,15,15,15,15,9,
+ 0,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11,
+ 0,0,7,15,15,15,15,13,0,0,11,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,10,0,3,14,15,15,15,15,15,15,
+ 15,15,15,15,15,14,3,0,13,15,15,15,15,15,15,14,
+ 9,11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11,
+ 0,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,14,2,1,12,15,15,15,15,15,15,15,
+ 15,15,15,15,14,3,0,0,9,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,6,0,3,15,15,15,15,13,
+ 1,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,9,0,5,15,15,15,15,15,15,15,15,
+ 15,15,15,14,4,0,0,0,10,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,8,0,2,15,15,15,15,15,
+ 3,0,13,15,15,15,15,12,0,0,12,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,13,2,1,12,15,15,15,15,15,15,15,15,
+ 15,15,15,7,0,0,0,0,8,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,10,0,1,14,15,15,15,15,
+ 11,5,15,15,15,15,15,12,0,0,11,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,6,0,7,15,15,15,15,15,15,15,15,15,
+ 15,15,8,0,0,0,0,0,0,9,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,12,0,0,12,15,15,15,15,
+ 15,14,15,15,15,15,15,10,0,0,12,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,13,1,2,14,15,15,15,15,15,15,15,15,15,
+ 15,10,0,0,0,6,6,0,0,0,5,12,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12,
+ 15,15,15,15,15,15,15,15,13,0,0,11,15,15,15,15,
+ 15,15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,7,0,8,15,15,15,15,15,15,15,15,15,15,
+ 15,9,0,0,4,15,15,8,0,0,0,1,5,13,15,15,
+ 15,15,15,15,15,15,15,15,15,15,12,8,7,6,5,3,
+ 3,3,4,12,15,15,15,15,15,15,15,15,15,7,0,6,
+ 15,15,15,15,15,15,15,15,14,1,0,10,15,15,15,15,
+ 15,15,15,15,15,15,15,6,0,3,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,13,1,0,13,15,15,15,15,15,15,15,15,15,15,
+ 15,14,7,8,13,15,15,15,11,2,0,0,0,0,5,11,
+ 15,15,15,15,15,15,15,15,13,3,0,0,0,0,0,0,
+ 0,0,0,5,15,15,15,15,15,15,15,15,12,1,0,0,
+ 3,11,15,15,15,15,15,15,13,1,0,10,15,15,15,15,
+ 15,15,15,15,15,15,15,3,0,5,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,9,0,5,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,14,8,1,0,0,0,0,
+ 4,12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,
+ 0,0,0,2,15,15,15,15,15,15,15,14,4,0,0,0,
+ 0,0,9,15,15,15,15,15,14,1,0,10,15,15,15,15,
+ 15,15,15,15,15,15,15,2,0,9,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,14,4,0,11,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,14,8,2,0,0,
+ 0,0,4,10,14,15,15,15,4,0,0,0,0,0,0,0,
+ 0,0,0,3,15,15,15,15,15,15,15,6,0,0,0,2,
+ 3,0,0,8,15,15,15,15,14,1,0,10,15,15,15,15,
+ 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 14,5,0,4,14,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,14,9,3,
+ 0,0,0,0,2,5,10,15,5,0,1,11,11,12,13,15,
+ 11,0,0,7,15,15,15,15,15,15,8,0,0,0,1,12,
+ 14,6,0,0,7,14,15,15,14,1,0,9,15,15,15,15,
+ 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 9,0,1,13,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14,
+ 10,2,0,0,0,0,1,14,4,0,1,14,15,15,15,15,
+ 9,0,0,9,15,15,15,15,15,9,0,0,0,0,9,15,
+ 15,15,7,0,0,6,14,15,15,3,0,6,15,15,15,15,
+ 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,
+ 0,0,1,10,14,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,13,1,0,0,0,1,14,3,0,0,14,15,15,15,15,
+ 5,0,0,11,15,15,15,15,13,1,0,0,0,6,15,15,
+ 15,15,15,8,0,0,2,10,15,6,0,3,15,15,15,15,
+ 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1,
+ 0,0,0,0,3,9,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,6,1,0,0,0,8,15,1,0,0,14,15,15,15,15,
+ 4,0,0,13,15,15,15,14,4,0,0,0,3,14,15,15,
+ 15,15,15,15,5,0,0,1,14,9,0,1,14,15,15,15,
+ 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1,
+ 0,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 9,0,0,0,0,7,15,15,1,0,0,14,15,15,15,14,
+ 2,0,1,14,15,15,15,12,0,0,0,3,13,15,15,15,
+ 15,15,15,9,0,0,0,1,14,12,0,0,12,15,15,15,
+ 15,15,15,15,15,15,14,1,0,10,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,
+ 3,0,0,0,0,0,0,1,8,14,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,
+ 0,0,0,0,7,15,15,15,1,0,0,14,15,15,15,13,
+ 0,0,1,15,15,15,15,12,0,0,0,6,14,15,15,15,
+ 15,15,12,0,0,0,0,3,14,12,0,0,12,15,15,15,
+ 15,15,15,15,15,15,12,0,0,12,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,13,3,0,0,0,0,0,0,1,6,13,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,0,
+ 0,0,0,3,15,15,15,12,0,0,0,14,15,15,15,11,
+ 0,0,3,15,15,15,15,15,12,7,0,0,4,14,15,15,
+ 15,11,1,0,0,0,4,13,15,12,0,0,12,15,15,15,
+ 15,15,15,15,15,15,10,0,1,14,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,12,7,0,0,0,0,0,0,0,3,8,12,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,0,
+ 0,0,1,13,15,15,15,6,0,0,0,14,15,15,15,8,
+ 0,0,7,15,15,15,15,15,15,15,8,1,0,2,13,15,
+ 14,2,0,0,0,4,14,15,15,13,1,0,10,15,15,15,
+ 15,15,15,15,15,15,9,0,2,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,11,6,2,0,0,0,0,0,0,0,1,
+ 10,15,15,15,15,15,15,15,15,15,15,15,15,8,0,0,
+ 0,0,10,15,15,15,15,4,0,0,1,15,15,15,15,4,
+ 0,0,8,15,15,15,15,15,15,15,15,10,1,0,1,8,
+ 2,0,0,0,5,15,15,15,15,15,2,0,6,15,15,15,
+ 15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,9,1,0,0,0,0,0,0,
+ 0,1,7,13,14,15,15,15,15,15,15,15,9,0,0,0,
+ 0,6,15,15,15,15,15,4,0,0,4,15,15,15,14,1,
+ 0,0,9,15,15,15,15,15,15,15,15,15,12,2,0,0,
+ 0,0,0,4,14,15,15,15,15,15,4,0,4,15,15,15,
+ 15,15,15,15,15,15,7,0,0,14,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,14,11,6,2,0,0,0,
+ 0,0,0,0,1,9,12,15,15,15,15,14,3,0,0,0,
+ 4,15,15,15,15,15,15,4,0,0,3,6,4,4,2,0,
+ 0,0,13,15,15,15,15,15,15,15,15,15,15,12,1,0,
+ 0,0,3,14,15,15,15,15,15,15,4,0,4,15,15,15,
+ 15,15,15,15,15,15,5,0,0,12,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,8,2,0,
+ 0,0,0,0,0,0,0,1,9,15,15,5,0,0,0,0,
+ 12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,0,
+ 0,3,15,15,15,15,15,15,15,15,15,15,15,14,4,0,
+ 0,1,12,15,15,15,15,15,15,15,6,0,1,14,15,15,
+ 15,15,15,15,15,15,5,0,0,13,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,
+ 7,1,0,0,0,0,0,0,0,5,7,0,0,0,0,10,
+ 15,15,15,15,15,15,15,7,0,0,0,0,0,0,0,0,
+ 1,10,15,15,15,15,15,15,15,15,15,15,15,14,3,0,
+ 3,12,15,15,15,15,15,15,15,15,12,0,0,12,15,15,
+ 15,15,15,15,15,15,5,0,0,1,1,4,11,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,11,6,1,0,0,0,0,0,0,0,0,0,7,15,
+ 15,15,15,15,15,15,15,14,7,4,4,4,5,9,12,13,
+ 14,15,15,15,15,15,15,15,15,15,15,15,15,15,11,9,
+ 14,15,15,14,12,11,11,11,10,9,7,0,0,5,13,15,
+ 15,15,15,15,15,12,1,0,0,0,0,0,0,10,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,14,7,1,0,0,0,0,0,3,14,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,13,2,0,0,0,0,0,0,0,0,0,0,0,8,
+ 15,15,15,15,15,11,0,0,0,0,0,0,0,9,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,13,5,0,0,0,0,12,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,5,
+ 15,15,15,15,15,15,10,5,6,7,7,7,9,14,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,8,3,2,2,2,2,5,14,15,
+ 15,15,15,15,15,15,15,15,15,10,3,0,6,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,13,3,1,0,1,0,1,1,2,4,4,3,9,14,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,12,4,0,1,6,7,7,4,1,3,13,
+ 15,15,15,15,15,15,15,15,15,15,14,10,13,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,11,11,15,15,15,15,
+ 15,15,15,14,14,14,14,14,14,14,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,14,2,0,4,13,15,15,15,15,10,0,12,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,14,13,14,12,12,12,12,12,12,12,
+ 12,14,15,15,15,15,15,15,15,15,4,14,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,7,1,5,14,15,15,15,15,15,12,1,11,
+ 15,15,15,13,12,13,15,15,14,11,13,15,15,15,15,15,
+ 15,15,15,11,6,3,1,1,1,0,0,0,0,0,0,0,
+ 0,1,4,7,11,14,15,15,15,14,4,15,13,10,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,14,7,4,5,
+ 12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,13,1,1,14,15,15,14,10,12,15,11,1,12,
+ 15,15,11,1,0,4,15,15,6,0,2,14,15,15,15,15,
+ 15,15,14,8,6,3,3,2,2,1,0,0,0,0,0,0,
+ 0,0,0,0,0,3,11,15,15,11,8,15,12,6,15,9,
+ 8,15,15,15,15,15,15,15,15,15,15,15,10,4,4,1,
+ 4,15,15,15,15,11,6,2,8,14,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,12,0,4,15,15,15,11,2,10,15,9,1,13,
+ 15,13,1,7,6,2,14,14,1,2,1,14,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,13,12,12,12,12,12,12,
+ 11,11,11,10,9,10,12,15,15,6,7,15,9,4,15,4,
+ 1,14,15,15,15,15,15,15,15,15,15,15,2,11,15,4,
+ 4,15,15,15,15,3,9,4,0,9,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,12,0,4,15,15,15,5,0,6,6,1,9,15,
+ 15,4,1,13,10,1,13,9,2,7,1,14,14,14,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,3,5,15,3,5,14,1,
+ 0,12,13,9,14,15,15,15,15,15,15,15,2,2,4,1,
+ 6,15,15,15,14,1,5,6,0,9,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,12,0,4,15,15,15,12,4,2,2,10,15,15,
+ 11,0,6,15,12,0,10,7,9,10,1,14,7,14,15,15,
+ 15,15,15,15,15,15,13,12,11,11,10,9,9,10,11,13,
+ 15,15,15,15,15,15,15,15,15,1,9,15,2,7,14,1,
+ 0,10,7,0,8,15,15,15,15,15,15,15,11,4,4,4,
+ 13,15,15,15,15,10,2,2,4,14,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,15,
+ 4,2,14,15,15,1,9,5,14,9,1,14,8,14,15,15,
+ 15,15,15,15,15,10,3,0,1,0,0,0,0,0,0,5,
+ 15,15,15,15,15,15,15,15,15,1,9,14,1,8,14,1,
+ 0,11,13,6,11,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,11,
+ 0,6,15,15,15,1,5,3,13,10,0,6,8,15,15,15,
+ 15,15,15,15,15,15,13,12,12,11,10,9,9,10,11,13,
+ 15,15,15,15,15,15,15,15,15,1,9,12,1,11,15,4,
+ 1,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 14,10,4,2,12,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,12,1,3,14,15,15,15,15,15,15,15,15,4,
+ 3,14,15,15,15,5,1,8,15,14,5,2,9,15,15,15,
+ 15,15,15,15,15,15,15,15,15,11,9,13,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,1,9,12,1,12,15,13,
+ 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 10,2,9,2,3,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,14,4,0,5,14,15,15,15,15,15,15,11,0,
+ 6,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,8,1,0,3,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,1,9,15,11,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 7,1,12,6,1,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,11,1,0,3,8,9,9,10,11,9,5,4,
+ 13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,12,9,13,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,5,11,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 10,3,4,1,5,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,12,2,0,0,0,0,0,0,1,8,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,14,12,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,13,8,8,10,9,10,11,14,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
+ };
diff --git a/src/visualizations/Goom/goom2k4-0/src/plugin_info.c b/src/visualizations/Goom/goom2k4-0/src/plugin_info.c
new file mode 100644
index 0000000000..7fbdd41254
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/plugin_info.c
@@ -0,0 +1,202 @@
+#include "goom_plugin_info.h"
+#include "goom_fx.h"
+#include "cpu_info.h"
+#include "default_scripts.h"
+#include "drawmethods.h"
+#include <math.h>
+#include <stdio.h>
+
+
+#ifdef CPU_POWERPC
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include "ppc_zoom_ultimate.h"
+#include "ppc_drawings.h"
+#endif /* CPU_POWERPC */
+
+
+#ifdef CPU_X86
+#include "mmx.h"
+#endif /* CPU_X86 */
+
+
+
+static void setOptimizedMethods(PluginInfo *p) {
+
+ unsigned int cpuFlavour = cpu_flavour();
+
+ /* set default methods */
+ p->methods.draw_line = draw_line;
+ p->methods.zoom_filter = zoom_filter_c;
+/* p->methods.create_output_with_brightness = create_output_with_brightness;*/
+
+#ifdef CPU_X86
+ if (cpuFlavour & CPU_OPTION_XMMX) {
+#ifdef VERBOSE
+ printf ("Extented MMX detected. Using the fastest methods !\n");
+#endif
+ p->methods.draw_line = draw_line_mmx;
+ p->methods.zoom_filter = zoom_filter_xmmx;
+ }
+ else if (cpuFlavour & CPU_OPTION_MMX) {
+#ifdef VERBOSE
+ printf ("MMX detected. Using fast methods !\n");
+#endif
+ p->methods.draw_line = draw_line_mmx;
+ p->methods.zoom_filter = zoom_filter_mmx;
+ }
+#ifdef VERBOSE
+ else
+ printf ("Too bad ! No SIMD optimization available for your CPU.\n");
+#endif
+#endif /* CPU_X86 */
+
+#ifdef CPU_POWERPC
+
+ if ((cpuFlavour & CPU_OPTION_64_BITS) != 0) {
+/* p->methods.create_output_with_brightness = ppc_brightness_G5; */
+ p->methods.zoom_filter = ppc_zoom_generic;
+ }
+ else if ((cpuFlavour & CPU_OPTION_ALTIVEC) != 0) {
+/* p->methods.create_output_with_brightness = ppc_brightness_G4; */
+ p->methods.zoom_filter = ppc_zoom_G4;
+ }
+ else
+ {
+/* p->methods.create_output_with_brightness = ppc_brightness_generic;*/
+ p->methods.zoom_filter = ppc_zoom_generic;
+ }
+#endif /* CPU_POWERPC */
+
+}
+
+void plugin_info_init(PluginInfo *pp, int nbVisuals) {
+
+ PluginInfo p;
+ int i;
+
+ p.sound.speedvar = p.sound.accelvar = p.sound.totalgoom = 0;
+ p.sound.prov_max = 0;
+ p.sound.goom_limit = 1;
+ p.sound.allTimesMax = 1;
+
+ p.sound.volume_p = secure_f_feedback("Sound Volume");
+ p.sound.accel_p = secure_f_feedback("Sound Acceleration");
+ p.sound.speed_p = secure_f_feedback("Sound Speed");
+ p.sound.goom_limit_p = secure_f_feedback("Goom Limit");
+ p.sound.last_goom_p = secure_f_feedback("Goom Detection");
+ p.sound.last_biggoom_p = secure_f_feedback("Big Goom Detection");
+ p.sound.goom_power_p = secure_f_feedback("Goom Power");
+
+ p.sound.biggoom_speed_limit_p = secure_i_param("Big Goom Speed Limit");
+ IVAL(p.sound.biggoom_speed_limit_p) = 10;
+ IMIN(p.sound.biggoom_speed_limit_p) = 0;
+ IMAX(p.sound.biggoom_speed_limit_p) = 100;
+ ISTEP(p.sound.biggoom_speed_limit_p) = 1;
+
+ p.sound.biggoom_factor_p = secure_i_param("Big Goom Factor");
+ IVAL(p.sound.biggoom_factor_p) = 10;
+ IMIN(p.sound.biggoom_factor_p) = 0;
+ IMAX(p.sound.biggoom_factor_p) = 100;
+ ISTEP(p.sound.biggoom_factor_p) = 1;
+
+ p.sound.params = plugin_parameters ("Sound", 11);
+
+ p.nbParams = 0;
+ p.nbVisuals = nbVisuals;
+ p.visuals = (VisualFX**)malloc(sizeof(VisualFX*)*nbVisuals);
+
+ *pp = p;
+ pp->sound.params.params[0] = &pp->sound.biggoom_speed_limit_p;
+ pp->sound.params.params[1] = &pp->sound.biggoom_factor_p;
+ pp->sound.params.params[2] = 0;
+ pp->sound.params.params[3] = &pp->sound.volume_p;
+ pp->sound.params.params[4] = &pp->sound.accel_p;
+ pp->sound.params.params[5] = &pp->sound.speed_p;
+ pp->sound.params.params[6] = 0;
+ pp->sound.params.params[7] = &pp->sound.goom_limit_p;
+ pp->sound.params.params[8] = &pp->sound.goom_power_p;
+ pp->sound.params.params[9] = &pp->sound.last_goom_p;
+ pp->sound.params.params[10] = &pp->sound.last_biggoom_p;
+
+ pp->statesNumber = 8;
+ pp->statesRangeMax = 510;
+ {
+ GoomState states[8] = {
+ {1,0,0,1,4, 0, 100},
+ {1,0,0,0,1, 101, 140},
+ {1,0,0,1,2, 141, 200},
+ {0,1,0,1,2, 201, 260},
+ {0,1,0,1,0, 261, 330},
+ {0,1,1,1,4, 331, 400},
+ {0,0,1,0,5, 401, 450},
+ {0,0,1,1,1, 451, 510}};
+ for (i=0;i<8;++i)
+ pp->states[i] = states[i];
+ }
+ pp->curGState = &(pp->states[6]);
+
+ /* datas for the update loop */
+ pp->update.lockvar = 0;
+ pp->update.goomvar = 0;
+ pp->update.loopvar = 0;
+ pp->update.stop_lines = 0;
+ pp->update.ifs_incr = 1; /* dessiner l'ifs (0 = non: > = increment) */
+ pp->update.decay_ifs = 0; /* disparition de l'ifs */
+ pp->update.recay_ifs = 0; /* dedisparition de l'ifs */
+ pp->update.cyclesSinceLastChange = 0;
+ pp->update.drawLinesDuration = 80;
+ pp->update.lineMode= pp->update.drawLinesDuration;
+
+ pp->update.switchMultAmount = (29.0f/30.0f);
+ pp->update.switchIncrAmount = 0x7f;
+ pp->update.switchMult = 1.0f;
+ pp->update.switchIncr = pp->update.switchIncrAmount;
+
+ pp->update.stateSelectionRnd = 0;
+ pp->update.stateSelectionBlocker = 0;
+ pp->update.previousZoomSpeed = 128;
+ pp->update.timeOfTitleDisplay = 0;
+
+ pp->update_message.affiche = 0;
+
+ {
+ ZoomFilterData zfd = {
+ 127, 8, 16,
+ 1, 1, 0, NORMAL_MODE,
+ 0, 0, 0, 0, 0
+ };
+ pp->update.zoomFilterData = zfd;
+ }
+
+ setOptimizedMethods(pp);
+
+ pp->scanner = gsl_new();
+ pp->main_scanner = gsl_new();
+ pp->main_script_str = GOOM_MAIN_SCRIPT;
+
+ for (i = 0; i < 0xffff; i++) {
+ pp->sintable[i] = (int) (1024 * sin ((double) i * 360 / (sizeof (pp->sintable) / sizeof (pp->sintable[0]) - 1) * 3.141592 / 180) + .5);
+ /* sintable [us] = (int)(1024.0f * sin (us*2*3.31415f/0xffff)) ; */
+ }
+}
+
+void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual) {
+ p->visuals[i] = visual;
+ if (i == p->nbVisuals-1) {
+ ++i;
+ p->nbParams = 1;
+ while (i--) {
+ if (p->visuals[i]->params)
+ p->nbParams++;
+ }
+ p->params = (PluginParameters *)malloc(sizeof(PluginParameters)*p->nbParams);
+ i = p->nbVisuals;
+ p->nbParams = 1;
+ p->params[0] = p->sound.params;
+ while (i--) {
+ if (p->visuals[i]->params)
+ p->params[p->nbParams++] = *(p->visuals[i]->params);
+ }
+ }
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/pngload.c b/src/visualizations/Goom/goom2k4-0/src/pngload.c
new file mode 100644
index 0000000000..5335eb2772
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/pngload.c
@@ -0,0 +1,144 @@
+#include <png.h>
+
+int
+loadpng (char *file_name, int *w, int *h, unsigned int ***buf)
+{
+ FILE *fp;
+ png_uint_32 width, height;
+ int bit_depth,
+
+ color_type, interlace_type, compression_type, filter_type;
+ int rowbytes;
+
+ png_structp png_ptr;
+ png_infop info_ptr;
+ png_infop end_info;
+
+ int x, y;
+ unsigned int **row_pointers;
+
+ /* OUVERTURE DU FICHIER */
+
+ fp = fopen (file_name, "rb");
+
+ if (!fp) {
+ // fprintf (stderr, "Couldn't open file\n");
+ return 1;
+ }
+
+ /* CREATION DES STRUCTURES */
+ png_ptr = png_create_read_struct
+ (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, NULL, NULL);
+ if (!png_ptr) {
+ fclose (fp);
+ fprintf (stderr, "Memory error\n");
+ return 1;
+ }
+
+ info_ptr = png_create_info_struct (png_ptr);
+ if (!info_ptr) {
+ png_destroy_read_struct (&png_ptr, (png_infopp) NULL, (png_infopp) NULL);
+ fclose (fp);
+ fprintf (stderr, "Read error 1\n");
+ return 1;
+ }
+
+ end_info = png_create_info_struct (png_ptr);
+ if (!end_info) {
+ png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp) NULL);
+ fclose (fp);
+ fprintf (stderr, "Read error 2\n");
+ return 1;
+ }
+
+ /* CHARGEMENT DE L'IMAGE */
+ if (setjmp (png_ptr->jmpbuf)) {
+ png_destroy_read_struct (&png_ptr, &info_ptr, &end_info);
+ fclose (fp);
+ fprintf (stderr, "Erreur de chargement\n");
+ return 1;
+ }
+
+ png_init_io (png_ptr, fp);
+ png_set_read_status_fn (png_ptr, NULL);
+
+ png_read_info (png_ptr, info_ptr);
+
+ png_get_IHDR (png_ptr, info_ptr, &width, &height,
+ &bit_depth, &color_type, &interlace_type,
+ &compression_type, &filter_type);
+/*
+ printf ("taille : %dx%d\n",width,height);
+ printf ("depth : %d\n",bit_depth);
+ printf ("color type : ");
+ switch (color_type) {
+ case PNG_COLOR_TYPE_GRAY:
+ printf ("PNG_COLOR_TYPE_GRAY (bit depths 1, 2, 4, 8, 16)\n");
+ break;
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
+ printf ("PNG_COLOR_TYPE_GRAY_ALPHA (bit depths 8, 16)\n");
+ break;
+ case PNG_COLOR_TYPE_PALETTE:
+ printf ("PNG_COLOR_TYPE_PALETTE (bit depths 1, 2, 4, 8)\n");
+ break;
+ case PNG_COLOR_TYPE_RGB:
+ printf ("PNG_COLOR_TYPE_RGB (bit_depths 8, 16)\n");
+ break;
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+ printf ("PNG_COLOR_TYPE_RGB_ALPHA (bit_depths 8, 16)\n");
+ break;
+ }
+ */
+ // printf ("PNG_COLOR_MASK_ALPHA : %x\n", PNG_COLOR_MASK_ALPHA);
+ // printf ("PNG_COLOR_MASK_COLOR : %x\n", PNG_COLOR_MASK_COLOR);
+ // printf ("PNG_COLOR_MASK_PALETTE : %x\n", PNG_COLOR_MASK_PALETTE);
+
+ if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8)
+ png_set_palette_to_rgb (png_ptr);
+
+ if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
+ png_set_expand_gray_1_2_4_to_8 (png_ptr);
+ else if (color_type == PNG_COLOR_TYPE_GRAY ||
+ color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+ png_set_gray_to_rgb (png_ptr);
+
+ if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS))
+ png_set_tRNS_to_alpha (png_ptr);
+
+ png_read_update_info (png_ptr, info_ptr);
+
+// printf ("channels : %d\n", png_get_channels (png_ptr, info_ptr));
+ rowbytes = png_get_rowbytes (png_ptr, info_ptr);
+// printf ("rowbytes : %d\n", rowbytes);
+
+ row_pointers = (unsigned int **) malloc (height * sizeof (unsigned int *));
+
+ for (y = 0; y < height; y++)
+ row_pointers[y] = (unsigned int *) malloc (4 * width);
+ png_read_image (png_ptr, (png_bytepp) row_pointers);
+
+ // for (y=0;y<height;y++) {
+// for (x=0;x<width;x++) {
+// if (row_pointers[y][x] & 0xf000)
+ // printf ("%x ",(((unsigned int**)row_pointers)[y][x])&0xf);
+ // else
+// printf (" ");
+ // }
+ // printf ("\n");
+ // }
+
+ png_read_end (png_ptr, end_info);
+ png_destroy_read_struct (&png_ptr, &info_ptr, &end_info);
+
+ (*buf) = (unsigned int **) malloc (height * sizeof (void *));
+
+ for (y = 0; y < height; y++) {
+ (*buf)[y] = (unsigned int *) malloc (width * 4);
+ for (x = 0; x < width; x++)
+ (*buf)[y][x] = row_pointers[y][x];
+ }
+ *w = width;
+ *h = height;
+
+ return 0;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s b/src/visualizations/Goom/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s
new file mode 100644
index 0000000000..c6f5027b08
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s
@@ -0,0 +1,305 @@
+; PowerPC optimized zoom for Goom
+; © 2001-2003 Guillaume Borios
+; This Source Code is released under the terms of the General Public License
+
+; Change log :
+; 21 Dec 2003 : Use of altivec is now determined with a parameter
+
+; Section definition : We use a read only section
+.text
+
+; name of the function to call by C program : ppc_zoom
+; We declare this label as a global to extend its scope outside this file
+.globl _ppc_zoom_generic
+.globl _ppc_zoom_G4
+
+; Description :
+; This routine dynamically computes and applies a zoom filter
+
+; parameters :
+; r3 <=> unsigned int * frompixmap
+; r4 <=> unsigned int * topixmap
+; r5 <=> unsigned int sizeX (in pixels)
+; r6 <=> unsigned int sizeY (in pixels)
+; r7 <=> unsigned int * brutS
+; r8 <=> unsigned int * brutD
+; r9 <=> unsigned int buffratio
+; r10 <=> int [16][16] precalccoeffs
+
+; globals after init
+; r3 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r3)
+; r4 <=> topixmap - 1 byte needed for preincremental fetch (replaces r4)
+; r5 <=> ax = x max in 16th of pixels (replaces old r5)
+; r6 <=> ay = y max in 16th of pixels (replaces old r6)
+; r20 <=> row size in bytes
+; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing)
+; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7)
+; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8)
+
+; ABI notes :
+; r1 is the Stack Pointer (SP) => Do not use
+; r13..r31 are non-volatiles => Do not use
+
+_ppc_zoom_generic:
+
+; Saves the used non volatile registers in the Mach-O stack s Red-Zone
+stmw r18,-56(r1)
+
+; init
+li r18,0 ; Default value if out of range : 0 (Black)
+mr r11,r10
+lis r12,0xFF
+mullw r2,r5,r6 ; Number of pixels to compute
+subi r30,r8,0
+slwi r20,r5,2
+srawi r19,r20,2
+ori r12,r12,0xFF
+subi r5,r5,1
+subi r6,r6,1
+mtspr ctr,r2 ; Init the loop count (one loop per pixel computed)
+subi r31,r7,0
+subi r4,r4,4
+slwi r5,r5,4
+slwi r6,r6,4
+
+;pre init for loop
+lwz r2,0(r31) ; px
+lwz r29,4(r31) ; py
+lwz r8,0(r30) ; px2
+lwz r10,4(r30) ; py2
+
+L1:
+
+; computes dynamically the position to fetch
+sub r8,r8,r2
+sub r10,r10,r29
+mullw r8,r8,r9
+addi r31,r31,8
+mullw r10,r10,r9
+addi r30,r30,8
+
+srawi r8,r8,16
+srawi r10,r10,16
+add r2,r2,r8
+add r29,r29,r10
+
+; if px>ax or py>ay goto outofrange
+; computes the attenuation coeffs and the original point address
+rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16)
+cmpl cr6,0,r2,r5
+rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10)
+cmpl cr7,0,r29,r6
+srawi r29,r29,4 ; pos computing
+bge- cr6,L4
+srawi r2,r2,4 ; pos computing
+mullw r29, r29,r19 ; pos computing
+bge- cr7,L4
+
+; Channels notation : 00112233 (AARRVVBB)
+
+add r2,r2,r29 ; pos computing
+lwzx r10,r11,r10 ; Loads coefs
+slwi r2,r2,2 ; pos computing
+add r2,r2,r3 ; pos computing
+rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011)
+lwz r25,0(r2) ; Loads col1 -> r25
+lwz r26,4(r2) ; Loads col2 -> r26
+rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022)
+rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033)
+add r2,r2,r20 ; Adds one line for future load of col3 and col4
+and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX
+rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044)
+andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00
+mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3
+
+
+; computes final pixel color
+and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX
+lwz r27,0(r2) ; Loads col3 -> r27
+mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3
+mullw r25,r25,r21 ; Applies coef1 on col1 channel 2
+andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00
+mullw r29,r29,r22 ; Applies coef2 on col2 channel 2
+lwz r28,4(r2) ; Loads col4 -> r28
+add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3
+and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX
+add r25,r25,r29 ; Adds col1 & col2 channel 2
+mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3
+andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00
+mullw r29,r29,r23 ; Applies coef3 on col3 channel 2
+lwz r2,0(r31) ; px
+add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3
+and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX
+mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3
+add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2
+lwz r8,0(r30) ; px2
+andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00
+add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3
+lwz r10,4(r30) ; py2
+mullw r28,r28,r24 ; Applies coef4 on col4 channel 2
+srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8
+lwz r29,4(r31) ; py
+add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2
+rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF)
+stwu r7,4(r4) ; Stores the computed pixel
+bdnz L1 ; Iterate again if needed
+b L3 ;goto end ; If not, returns from the function
+
+
+; if out of range
+L4:
+stwu r18,4(r4)
+lwz r8,0(r30) ; px2
+lwz r10,4(r30) ; py2
+lwz r2,0(r31) ; px
+lwz r29,4(r31) ; py
+bdnz L1
+
+
+L3:
+
+; Restore saved registers and return
+lmw r18,-56(r1)
+blr
+
+
+
+
+
+
+
+
+_ppc_zoom_G4:
+
+; Saves the used non volatile registers in the Mach-O stack s Red-Zone
+stmw r17,-60(r1)
+
+; init
+li r18,0 ; Default value if out of range : 0 (Black)
+mr r11,r10
+lis r12,0xFF
+mullw r2,r5,r6 ; Number of pixels to compute
+subi r30,r8,0
+slwi r20,r5,2
+srawi r19,r20,2
+ori r12,r12,0xFF
+subi r5,r5,1
+subi r6,r6,1
+mtspr ctr,r2 ; Init the loop count (one loop per pixel computed)
+subi r31,r7,0
+subi r4,r4,4
+slwi r5,r5,4
+slwi r6,r6,4
+
+;pre init for loop
+lwz r2,0(r31) ; px
+lwz r29,4(r31) ; py
+lwz r8,0(r30) ; px2
+lwz r10,4(r30) ; py2
+
+;*********************
+lis r17,0x0F01
+
+L100:
+
+; computes dynamically the position to fetch
+;mullw r8,r8,r29
+;mullw r2,r2,r29
+;add r2,r8,r2
+;srawi r2,r2,17
+
+sub r8,r8,r2
+sub r10,r10,r29
+mullw r8,r8,r9
+addi r31,r31,8
+mullw r10,r10,r9
+addi r30,r30,8
+
+dst r30,r17,0
+
+srawi r8,r8,16
+srawi r10,r10,16
+add r2,r2,r8
+add r29,r29,r10
+
+dst r31,r17,1
+
+; if px>ax or py>ay goto outofrange
+; computes the attenuation coeffs and the original point address
+rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16)
+cmpl cr6,0,r2,r5
+rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10)
+cmpl cr7,0,r29,r6
+srawi r29,r29,4 ; pos computing
+bge- cr6,L400
+srawi r2,r2,4 ; pos computing
+mullw r29, r29,r19 ; pos computing
+bge- cr7,L400
+
+; Channels notation : 00112233 (AARRVVBB)
+
+add r2,r2,r29 ; pos computing
+lwzx r10,r11,r10 ; Loads coefs
+slwi r2,r2,2 ; pos computing
+add r2,r2,r3 ; pos computing
+rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011)
+lwz r25,0(r2) ; Loads col1 -> r25
+lwz r26,4(r2) ; Loads col2 -> r26
+rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022)
+rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033)
+add r2,r2,r20 ; Adds one line for future load of col3 and col4
+and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX
+rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044)
+dst r2,r17,2
+andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00
+mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3
+
+
+; computes final pixel color
+and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX
+lwz r27,0(r2) ; Loads col3 -> r27
+mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3
+mullw r25,r25,r21 ; Applies coef1 on col1 channel 2
+andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00
+mullw r29,r29,r22 ; Applies coef2 on col2 channel 2
+lwz r28,4(r2) ; Loads col4 -> r28
+add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3
+and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX
+add r25,r25,r29 ; Adds col1 & col2 channel 2
+mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3
+andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00
+mullw r29,r29,r23 ; Applies coef3 on col3 channel 2
+lwz r2,0(r31) ; px
+add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3
+and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX
+mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3
+add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2
+lwz r8,0(r30) ; px2
+andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00
+add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3
+lwz r10,4(r30) ; py2
+mullw r28,r28,r24 ; Applies coef4 on col4 channel 2
+srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8
+lwz r29,4(r31) ; py
+add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2
+rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF)
+stwu r7,4(r4) ; Stores the computed pixel
+bdnz L100 ; Iterate again if needed
+b L300 ;goto end ; If not, returns from the function
+
+
+; if out of range
+L400:
+stwu r18,4(r4)
+lwz r8,0(r30) ; px2
+lwz r10,4(r30) ; py2
+lwz r2,0(r31) ; px
+lwz r29,4(r31) ; py
+bdnz L100
+
+
+L300:
+
+; Restore saved registers and return
+lmw r17,-60(r1)
+blr
diff --git a/src/visualizations/Goom/goom2k4-0/src/powerpc/ppc_doubling.s b/src/visualizations/Goom/goom2k4-0/src/powerpc/ppc_doubling.s
new file mode 100644
index 0000000000..161326152f
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/powerpc/ppc_doubling.s
@@ -0,0 +1,50 @@
+.section regular,__TEXT
+.globl _ppc_doubling ; name of the function to call by C program
+
+; width (src width)->r3
+; myx (src) ->r4
+; myX (dest) ->r5
+; myX2 (dest + 1 complete line)->r6
+; heigth (src height)->r7
+; inc (increment for next line in dest) ->r8
+
+_ppc_doubling:
+
+mtspr ctr,r3
+
+addi r4,r4,-4
+addi r5,r5,-4
+addi r6,r6,-4
+
+1:;boucle:
+
+lwzu r10,4(r4)
+stwu r10,4(r5)
+stwu r10,4(r5)
+stwu r10,4(r6)
+stwu r10,4(r6)
+
+bdnz 1boucle
+
+subi r7,r7,1
+add r5,r5,r8
+cmpwi cr1,r7,0
+add r6,r6,r8
+mtspr ctr,r3
+bgt cr1,1boucle
+
+blr
+
+;backup
+
+lwzu r10,4(r4)
+stwu r10,4(r5)
+stwu r10,4(r6)
+stwu r10,4(r5)
+stwu r10,4(r6)
+
+lwzu r10,4(r4)
+stwu r10,4(r5)
+stwu r10,4(r6)
+stwu r10,4(r5)
+stwu r10,4(r6)
diff --git a/src/visualizations/Goom/goom2k4-0/src/ppc_drawings.h b/src/visualizations/Goom/goom2k4-0/src/ppc_drawings.h
new file mode 100644
index 0000000000..ee438c2895
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/ppc_drawings.h
@@ -0,0 +1,18 @@
+/*
+ * ppc_drawings.h
+ * Goom
+ *
+ * Created by Guillaume Borios on Sun Dec 28 2003.
+ * Copyright (c) 2003 iOS. All rights reserved.
+ *
+ */
+
+/* Generic PowerPC Code */
+void ppc_brightness_generic(Pixel *src, Pixel *dest, int size, int coeff);
+
+/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */
+void ppc_brightness_G4(Pixel *src, Pixel *dest, int size, int coeff);
+
+/* G5 Specific PowerPC Code (Possible use of Altivec) */
+void ppc_brightness_G5(Pixel *src, Pixel *dest, int size, int coeff);
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/ppc_drawings.s b/src/visualizations/Goom/goom2k4-0/src/ppc_drawings.s
new file mode 100644
index 0000000000..845e5ea166
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/ppc_drawings.s
@@ -0,0 +1,381 @@
+; PowerPC optimized drawing methods for Goom
+; © 2003 Guillaume Borios
+; This Source Code is released under the terms of the General Public License
+
+; Change log :
+; 30 May 2003 : File creation
+
+; Section definition : We use a read only code section for the whole file
+.section __TEXT,__text,regular,pure_instructions
+
+
+; --------------------------------------------------------------------------------------
+; Single 32b pixel drawing macros
+; Usage :
+; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4
+; Only the work registers (WR) can be touched by the macros
+;
+; Available methods :
+; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW)
+; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST)
+; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing
+; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST)
+; DRAWMETHOD_B_OR_MACRO : Bitwise OR
+; DRAWMETHOD_BAND_MACRO : Bitwise AND
+; DRAWMETHOD_BXOR_MACRO : Bitwise XOR
+; DRAWMETHOD_BNOT_MACRO : Bitwise NOT
+; --------------------------------------------------------------------------------------
+
+.macro DRAWMETHOD_OVRW_MACRO
+ stw $2,0($1) ;; *$1 <- $2
+.endmacro
+
+.macro DRAWMETHOD_B_OR_MACRO
+ lwz $3,0($0) ;; $3 <- *$0
+ or $3,$3,$2 ;; $3 <- $3 | $2
+ stw $3,0($1) ;; *$1 <- $3
+.endmacro
+
+.macro DRAWMETHOD_BAND_MACRO
+ lwz $3,0($0) ;; $3 <- *$0
+ and $3,$3,$2 ;; $3 <- $3 & $2
+ stw $3,0($1) ;; *$1 <- $3
+.endmacro
+
+.macro DRAWMETHOD_BXOR_MACRO
+ lwz $3,0($0) ;; $3 <- *$0
+ xor $3,$3,$2 ;; $3 <- $3 ^ $2
+ stw $3,0($1) ;; *$1 <- $3
+.endmacro
+
+.macro DRAWMETHOD_BNOT_MACRO
+ lwz $3,0($0) ;; $3 <- *$0
+ nand $3,$3,$3 ;; $3 <- ~$3
+ stw $3,0($1) ;; *$1 <- $3
+.endmacro
+
+.macro DRAWMETHOD_PLUS_MACRO
+ lwz $4,0($0) ;; $4 <- *$0
+ andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00
+ andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00
+ add $3,$3,$5 ;; $3 <- $3 + $5
+ rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15)
+ srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension)
+ or $3,$3,$5 ;; $3 <- $3 | $5
+ lis $5,0xFF ;; $5 <- 0x00FF00FF
+ addi $5,$5,0xFF
+ and $4,$4,$5 ;; $4 <- $4 & $5
+ and $6,$2,$5 ;; $6 <- $2 & $5
+ add $4,$4,$6 ;; $4 <- $4 + $6
+ rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7)
+ srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension)
+ rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23)
+ srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension)
+ rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31]
+ or $4,$4,$6 ;; $4 <- $4 | $6
+ rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23]
+ stw $4,0($1) ;; *$1 <- $4
+.endmacro
+
+.macro DRAWMETHOD_HALF_MACRO
+ lwz $4,0($0) ;; $4 <- *$0
+ andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00
+ andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00
+ add $3,$3,$5 ;; $3 <- $3 + $5
+ lis $5,0xFF ;; $5 <- 0x00FF00FF
+ addi $5,$5,0xFF
+ and $4,$4,$5 ;; $4 <- $4 & $5
+ and $5,$2,$5 ;; $5 <- $2 & $5
+ add $4,$4,$5 ;; $4 <- $4 + $5
+ srwi $4,$4,1 ;; $4 <- $4 >> 1
+ rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22]
+ stw $4,0($1) ;; *$1 <- $4
+.endmacro
+
+.macro DRAWMETHOD_DFLT_MACRO
+ DRAWMETHOD_PLUS_MACRO
+.endmacro
+
+; --------------------------------------------------------------------------------------
+
+
+
+; **************************************************************************************
+; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col);
+; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col);
+; **************************************************************************************
+.globl _DRAWMETHOD_PLUS_2_PPC
+.align 3
+_DRAWMETHOD_PLUS_2_PPC:
+ DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9
+ blr ;; return
+
+.globl _DRAWMETHOD_PLUS_PPC
+.align 3
+_DRAWMETHOD_PLUS_PPC:
+ DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9
+ blr ;; return
+
+
+; **************************************************************************************
+; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col);
+; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col);
+; **************************************************************************************
+.globl _DRAWMETHOD_HALF_2_PPC
+.align 3
+_DRAWMETHOD_HALF_2_PPC:
+ DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8
+ blr ;; return
+
+.globl _DRAWMETHOD_HALF_PPC
+.align 3
+_DRAWMETHOD_HALF_PPC:
+ DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7
+ blr ;; return
+
+
+; **************************************************************************************
+; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col,
+; unsigned int screenx, unsigned int screeny)
+; **************************************************************************************
+.globl _DRAW_LINE_PPC
+.align 3
+_DRAW_LINE_PPC:
+ ;; NOT IMPLEMENTED YET
+ blr ;; return
+
+
+; **************************************************************************************
+; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff)
+; **************************************************************************************
+
+
+.const
+.align 4
+vectorZERO:
+ .long 0,0,0,0
+ .long 0x10101000, 0x10101001, 0x10101002, 0x10101003
+ .long 0x10101004, 0x10101005, 0x10101006, 0x10101007
+ .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B
+ .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F
+
+
+.section __TEXT,__text,regular,pure_instructions
+
+.globl _ppc_brightness_G4
+.align 3
+_ppc_brightness_G4:
+
+
+;; PowerPC Altivec code
+ srwi r5,r5,2
+ mtctr r5
+
+;;vrsave
+ mfspr r11,256
+ lis r12,0xCFFC
+ mtspr 256,r12
+
+ mflr r0
+ bcl 20,31,"L00000000001$pb"
+"L00000000001$pb":
+ mflr r10
+ mtlr r0
+
+ addis r9,r10,ha16(vectorZERO-"L00000000001$pb")
+ addi r9,r9,lo16(vectorZERO-"L00000000001$pb")
+
+ vxor v0,v0,v0 ;; V0 = NULL vector
+
+ addi r9,r9,16
+ lvx v10,0,r9
+ addi r9,r9,16
+ lvx v11,0,r9
+ addi r9,r9,16
+ lvx v12,0,r9
+ addi r9,r9,16
+ lvx v13,0,r9
+
+ addis r9,r10,ha16(vectortmpwork-"L00000000001$pb")
+ addi r9,r9,lo16(vectortmpwork-"L00000000001$pb")
+ stw r6,0(r9)
+ li r6,8
+ stw r6,4(r9)
+ lvx v9,0,r9
+ li r9,128
+ vspltw v8,v9,0
+ vspltw v9,v9,1
+
+;; elt counter
+ li r9,0
+ lis r7,0x0F01
+ b L7
+.align 4
+L7:
+ lvx v1,r9,r3
+
+ vperm v4,v1,v0,v10
+ ;*********************
+ add r10,r9,r3
+ ;*********************
+ vperm v5,v1,v0,v11
+ vperm v6,v1,v0,v12
+ vperm v7,v1,v0,v13
+
+ vmulouh v4,v4,v8
+ ;*********************
+ dst r10,r7,3
+ ;*********************
+ vmulouh v5,v5,v8
+ vmulouh v6,v6,v8
+ vmulouh v7,v7,v8
+ vsrw v4,v4,v9
+ vsrw v5,v5,v9
+ vsrw v6,v6,v9
+ vsrw v7,v7,v9
+
+ vpkuwus v4,v4,v5
+ vpkuwus v6,v6,v7
+ vpkuhus v1,v4,v6
+
+ stvx v1,r9,r4
+ addi r9,r9,16
+
+ bdnz L7
+
+ mtspr 256,r11
+ blr
+
+
+.globl _ppc_brightness_G5
+.align 3
+_ppc_brightness_G5:
+
+;; PowerPC Altivec G5 code
+ srwi r5,r5,2
+ mtctr r5
+
+;;vrsave
+ mfspr r11,256
+ lis r12,0xCFFC
+ mtspr 256,r12
+
+ mflr r0
+ bcl 20,31,"L00000000002$pb"
+"L00000000002$pb":
+ mflr r10
+ mtlr r0
+
+ addis r9,r10,ha16(vectorZERO-"L00000000002$pb")
+ addi r9,r9,lo16(vectorZERO-"L00000000002$pb")
+
+ vxor v0,v0,v0 ;; V0 = NULL vector
+
+ addi r9,r9,16
+ lvx v10,0,r9
+ addi r9,r9,16
+ lvx v11,0,r9
+ addi r9,r9,16
+ lvx v12,0,r9
+ addi r9,r9,16
+ lvx v13,0,r9
+
+ addis r9,r10,ha16(vectortmpwork-"L00000000002$pb")
+ addi r9,r9,lo16(vectortmpwork-"L00000000002$pb")
+ stw r6,0(r9)
+ li r6,8
+ stw r6,4(r9)
+ lvx v9,0,r9
+ li r9,128
+ vspltw v8,v9,0
+ vspltw v9,v9,1
+
+;; elt counter
+ li r9,0
+ lis r7,0x0F01
+ b L6
+.align 4
+L6:
+ lvx v1,r9,r3
+
+ vperm v4,v1,v0,v10
+ ;*********************
+ add r10,r9,r3
+ ;*********************
+ vperm v5,v1,v0,v11
+ vperm v6,v1,v0,v12
+ vperm v7,v1,v0,v13
+
+ vmulouh v4,v4,v8
+ vmulouh v5,v5,v8
+ vmulouh v6,v6,v8
+ vmulouh v7,v7,v8
+ vsrw v4,v4,v9
+ vsrw v5,v5,v9
+ vsrw v6,v6,v9
+ vsrw v7,v7,v9
+
+ vpkuwus v4,v4,v5
+ vpkuwus v6,v6,v7
+ vpkuhus v1,v4,v6
+
+ stvx v1,r9,r4
+ addi r9,r9,16
+
+ bdnz L6
+
+ mtspr 256,r11
+ blr
+
+
+.globl _ppc_brightness_generic
+.align 3
+_ppc_brightness_generic:
+ lis r12,0x00FF
+ ori r12,r12,0x00FF
+ subi r3,r3,4
+ subi r4,r4,4
+ mtctr r5
+ b L1
+.align 4
+L1:
+ lwzu r7,4(r3)
+
+ rlwinm r8,r7,16,24,31
+ rlwinm r9,r7,24,24,31
+ mullw r8,r8,r6
+ rlwinm r10,r7,0,24,31
+ mullw r9,r9,r6
+ srwi r8,r8,8
+ mullw r10,r10,r6
+ srwi r9,r9,8
+
+ rlwinm. r11,r8,0,0,23
+ beq L2
+ li r8,0xFF
+L2:
+ srwi r10,r10,8
+ rlwinm. r11,r9,0,0,23
+ beq L3
+ li r9,0xFF
+L3:
+ rlwinm r7,r8,16,8,15
+ rlwinm. r11,r10,0,0,23
+ beq L4
+ li r10,0xFF
+L4:
+ rlwimi r7,r9,8,16,23
+ rlwimi r7,r10,0,24,31
+
+ stwu r7,4(r4)
+ bdnz L1
+
+ blr
+
+
+
+.static_data
+.align 4
+vectortmpwork:
+ .long 0,0,0,0
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.h b/src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.h
new file mode 100644
index 0000000000..d6932e7e61
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.h
@@ -0,0 +1,14 @@
+/*
+ * ppc_zoom_ultimate.h
+ * Goom
+ *
+ * Created by Guillaume Borios on Sun Dec 28 2003.
+ * Copyright (c) 2003 iOS. All rights reserved.
+ *
+ */
+
+/* Generic PowerPC Code */
+void ppc_zoom_generic (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
+
+/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */
+void ppc_zoom_G4 (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); \ No newline at end of file
diff --git a/src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.s b/src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.s
new file mode 100644
index 0000000000..da252c676f
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.s
@@ -0,0 +1,323 @@
+; PowerPC optimized zoom for Goom
+; © 2001-2003 Guillaume Borios
+; This Source Code is released under the terms of the General Public License
+
+; Change log :
+; 21 Dec 2003 : Use of altivec is now determined with a parameter
+
+; Section definition : We use a read only section
+.text
+
+; name of the function to call by C program : ppc_zoom
+; We declare this label as a global to extend its scope outside this file
+.globl _ppc_zoom_generic
+.globl _ppc_zoom_G4
+
+; Description :
+; This routine dynamically computes and applies a zoom filter
+
+; parameters :
+; r3 <=> unsigned int sizeX (in pixels)
+; r4 <=> unsigned int sizeY (in pixels)
+; r5 <=> unsigned int * frompixmap
+; r6 <=> unsigned int * topixmap
+; r7 <=> unsigned int * brutS
+; r8 <=> unsigned int * brutD
+; r9 <=> unsigned int buffratio
+; r10 <=> int [16][16] precalccoeffs
+
+; globals after init
+; r5 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r5)
+; r6 <=> topixmap - 1 byte needed for preincremental fetch (replaces r6)
+; r3 <=> ax = x max in 16th of pixels (replaces old r3)
+; r4 <=> ay = y max in 16th of pixels (replaces old r4)
+; r20 <=> row size in bytes
+; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing)
+; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7)
+; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8)
+
+; ABI notes :
+; r1 is the Stack Pointer (SP) => Do not use
+; r13..r31 are non-volatiles => Do not use
+
+_ppc_zoom_generic:
+
+; Saves the used non volatile registers in the Mach-O stack s Red-Zone
+stmw r18,-56(r1)
+
+; init
+li r18,0 ; Default value if out of range : 0 (Black)
+mr r11,r10
+lis r12,0xFF
+mullw r2,r3,r4 ; Number of pixels to compute
+subi r30,r8,0
+slwi r20,r3,2
+srawi r19,r20,2
+ori r12,r12,0xFF
+subi r3,r3,1
+subi r4,r4,1
+mtspr ctr,r2 ; Init the loop count (one loop per pixel computed)
+subi r31,r7,0
+subi r6,r6,4
+slwi r3,r3,4
+slwi r4,r4,4
+
+;pre init for loop
+lwz r2,0(r31) ; px
+lwz r29,4(r31) ; py
+lwz r8,0(r30) ; px2
+lwz r10,4(r30) ; py2
+
+b L1
+.align 5
+L1:
+
+; computes dynamically the position to fetch
+sub r8,r8,r2
+sub r10,r10,r29
+mullw r8,r8,r9
+addi r31,r31,8
+mullw r10,r10,r9
+addi r30,r30,8
+
+srawi r8,r8,16
+srawi r10,r10,16
+add r2,r2,r8
+add r29,r29,r10
+
+; if px>ax or py>ay goto outofrange
+; computes the attenuation coeffs and the original point address
+rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16)
+cmpl cr4,0,r2,r3
+rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10)
+cmpl cr7,0,r29,r4
+srawi r29,r29,4 ; pos computing
+bge- cr4,L4
+srawi r2,r2,4 ; pos computing
+mullw r29, r29,r19 ; pos computing
+bge- cr7,L4
+
+; Channels notation : 00112233 (AARRVVBB)
+
+add r2,r2,r29 ; pos computing
+lwzx r10,r11,r10 ; Loads coefs
+slwi r2,r2,2 ; pos computing
+add r2,r2,r5 ; pos computing
+rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011)
+lwz r25,0(r2) ; Loads col1 -> r25
+lwz r26,4(r2) ; Loads col2 -> r26
+rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022)
+rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033)
+add r2,r2,r20 ; Adds one line for future load of col3 and col4
+and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX
+rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044)
+andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00
+mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3
+
+
+; computes final pixel color
+and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX
+lwz r27,0(r2) ; Loads col3 -> r27
+mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3
+mullw r25,r25,r21 ; Applies coef1 on col1 channel 2
+andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00
+mullw r29,r29,r22 ; Applies coef2 on col2 channel 2
+lwz r28,4(r2) ; Loads col4 -> r28
+add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3
+and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX
+add r25,r25,r29 ; Adds col1 & col2 channel 2
+mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3
+andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00
+mullw r29,r29,r23 ; Applies coef3 on col3 channel 2
+lwz r2,0(r31) ; px
+add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3
+and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX
+mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3
+add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2
+lwz r8,0(r30) ; px2
+andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00
+add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3
+lwz r10,4(r30) ; py2
+mullw r28,r28,r24 ; Applies coef4 on col4 channel 2
+srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8
+lwz r29,4(r31) ; py
+add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2
+rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF)
+stwu r7,4(r6) ; Stores the computed pixel
+bdnz L1 ; Iterate again if needed
+b L3 ;goto end ; If not, returns from the function
+
+
+; if out of range
+L4:
+stwu r18,4(r6)
+lwz r8,0(r30) ; px2
+lwz r10,4(r30) ; py2
+lwz r2,0(r31) ; px
+lwz r29,4(r31) ; py
+bdnz L1
+
+
+L3:
+
+; Restore saved registers and return
+lmw r18,-56(r1)
+blr
+
+
+
+
+
+
+
+
+_ppc_zoom_G4:
+
+; Saves the used non volatile registers in the Mach-O stack s Red-Zone
+stmw r17,-60(r1)
+
+; init
+li r18,0 ; Default value if out of range : 0 (Black)
+mr r11,r10
+lis r12,0xFF
+mullw r2,r3,r4 ; Number of pixels to compute
+subi r30,r8,0
+slwi r20,r3,2
+srawi r19,r20,2
+ori r12,r12,0xFF
+subi r3,r3,1
+subi r4,r4,1
+mtspr ctr,r2 ; Init the loop count (one loop per pixel computed)
+subi r31,r7,0
+subi r6,r6,4
+slwi r3,r3,4
+slwi r4,r4,4
+
+;pre init for loop
+lwz r2,0(r31) ; px
+lwz r29,4(r31) ; py
+lwz r8,0(r30) ; px2
+lwz r10,4(r30) ; py2
+
+;*********************
+lis r17,0x0F01
+
+b L100
+.align 5
+L100:
+
+addi r6,r6,4
+
+; Optimization to ensure the destination buffer
+; won't be loaded into the data cache
+rlwinm. r0,r6,0,27,31
+bne+ L500
+dcbz 0,r6
+;dcba 0,r6
+L500:
+
+; computes dynamically the position to fetch
+;mullw r8,r8,r29
+;mullw r2,r2,r29
+;add r2,r8,r2
+;srawi r2,r2,17
+
+sub r8,r8,r2
+sub r10,r10,r29
+mullw r8,r8,r9
+addi r31,r31,8
+mullw r10,r10,r9
+addi r30,r30,8
+
+dst r30,r17,0
+
+srawi r8,r8,16
+srawi r10,r10,16
+add r2,r2,r8
+add r29,r29,r10
+
+dst r31,r17,1
+
+; if px>ax or py>ay goto outofrange
+; computes the attenuation coeffs and the original point address
+rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16)
+cmpl cr4,0,r2,r3
+rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10)
+cmpl cr7,0,r29,r4
+srawi r29,r29,4 ; pos computing
+bge- cr4,L400
+srawi r2,r2,4 ; pos computing
+mullw r29, r29,r19 ; pos computing
+bge- cr7,L400
+
+; Channels notation : 00112233 (AARRVVBB)
+
+add r2,r2,r29 ; pos computing
+lwzx r10,r11,r10 ; Loads coefs
+slwi r2,r2,2 ; pos computing
+add r2,r2,r5 ; pos computing
+rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011)
+lwz r25,0(r2) ; Loads col1 -> r25
+lwz r26,4(r2) ; Loads col2 -> r26
+rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022)
+rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033)
+add r2,r2,r20 ; Adds one line for future load of col3 and col4
+and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX
+rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044)
+dst r2,r17,2
+rlwinm r25,r25,0,16,23 ; Masks col1 channel 2 : 0x0000XX00
+;andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00
+mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3
+
+
+; computes final pixel color
+and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX
+lwz r27,0(r2) ; Loads col3 -> r27
+mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3
+mullw r25,r25,r21 ; Applies coef1 on col1 channel 2
+rlwinm r29,r26,0,16,23 ; Masks col2 channel 2 : 0x0000XX00
+;andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00
+mullw r29,r29,r22 ; Applies coef2 on col2 channel 2
+lwz r28,4(r2) ; Loads col4 -> r28
+add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3
+and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX
+add r25,r25,r29 ; Adds col1 & col2 channel 2
+mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3
+rlwinm r29,r27,0,16,23 ; Masks col3 channel 2 : 0x0000XX00
+;andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00
+mullw r29,r29,r23 ; Applies coef3 on col3 channel 2
+lwz r2,0(r31) ; px
+add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3
+and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX
+mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3
+add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2
+lwz r8,0(r30) ; px2
+rlwinm r28,r28,0,16,23 ; Masks col4 channel 2 : 0x0000XX00
+;andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00
+add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3
+lwz r10,4(r30) ; py2
+mullw r28,r28,r24 ; Applies coef4 on col4 channel 2
+srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8
+lwz r29,4(r31) ; py
+add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2
+rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF)
+stw r7,0(r6) ; Stores the computed pixel
+bdnz L100 ; Iterate again if needed
+b L300 ;goto end ; If not, returns from the function
+
+
+; if out of range
+L400:
+stw r18,0(r6)
+lwz r8,0(r30) ; px2
+lwz r10,4(r30) ; py2
+lwz r2,0(r31) ; px
+lwz r29,4(r31) ; py
+bdnz L100
+
+
+L300:
+
+; Restore saved registers and return
+lmw r17,-60(r1)
+blr
diff --git a/src/visualizations/Goom/goom2k4-0/src/sound_tester.c b/src/visualizations/Goom/goom2k4-0/src/sound_tester.c
new file mode 100644
index 0000000000..ac50a11b26
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/sound_tester.c
@@ -0,0 +1,138 @@
+#include "sound_tester.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* some constants */
+#define BIG_GOOM_DURATION 100
+#define BIG_GOOM_SPEED_LIMIT 0.1f
+
+#define ACCEL_MULT 0.95f
+#define SPEED_MULT 0.99f
+
+
+void evaluate_sound(gint16 data[2][512], SoundInfo *info) {
+
+ int i;
+ float difaccel;
+ float prevspeed;
+
+ /* find the max */
+ int incvar = 0;
+ for (i = 0; i < 512; i+=2) {
+ if (incvar < data[0][i])
+ incvar = data[0][i];
+ }
+
+ if (incvar > info->allTimesMax)
+ info->allTimesMax = incvar;
+
+ /* volume sonore */
+ info->volume = (float)incvar / (float)info->allTimesMax;
+ memcpy(info->samples[0],data[0],512*sizeof(short));
+ memcpy(info->samples[1],data[1],512*sizeof(short));
+
+ difaccel = info->accelvar;
+ info->accelvar = info->volume; /* accel entre 0 et 1 */
+
+ /* transformations sur la vitesse du son */
+ if (info->speedvar > 1.0f)
+ info->speedvar = 1.0f;
+
+ if (info->speedvar < 0.1f)
+ info->accelvar *= (1.0f - (float)info->speedvar);
+ else if (info->speedvar < 0.3f)
+ info->accelvar *= (0.9f - (float)(info->speedvar-0.1f)/2.0f);
+ else
+ info->accelvar *= (0.8f - (float)(info->speedvar-0.3f)/4.0f);
+
+ /* adoucissement de l'acceleration */
+ info->accelvar *= ACCEL_MULT;
+ if (info->accelvar < 0)
+ info->accelvar = 0;
+
+ difaccel = info->accelvar - difaccel;
+ if (difaccel < 0)
+ difaccel = - difaccel;
+
+ /* mise a jour de la vitesse */
+ prevspeed = info->speedvar;
+ info->speedvar = (info->speedvar + difaccel * 0.5f) / 2;
+ info->speedvar *= SPEED_MULT;
+ info->speedvar = (info->speedvar + 3.0f * prevspeed) / 4.0f;
+ if (info->speedvar < 0)
+ info->speedvar = 0;
+ if (info->speedvar > 1)
+ info->speedvar = 1;
+
+ /* temps du goom */
+ info->timeSinceLastGoom++;
+ info->timeSinceLastBigGoom++;
+ info->cycle++;
+
+ /* detection des nouveaux gooms */
+ if ((info->speedvar > (float)IVAL(info->biggoom_speed_limit_p)/100.0f)
+ && (info->accelvar > info->bigGoomLimit)
+ && (info->timeSinceLastBigGoom > BIG_GOOM_DURATION)) {
+ info->timeSinceLastBigGoom = 0;
+ }
+
+ if (info->accelvar > info->goom_limit) {
+ /* TODO: tester && (info->timeSinceLastGoom > 20)) { */
+ info->totalgoom ++;
+ info->timeSinceLastGoom = 0;
+ info->goomPower = info->accelvar - info->goom_limit;
+ }
+
+ if (info->accelvar > info->prov_max)
+ info->prov_max = info->accelvar;
+
+ if (info->goom_limit>1)
+ info->goom_limit=1;
+
+ /* toute les 2 secondes : vérifier si le taux de goom est correct
+ * et le modifier sinon.. */
+ if (info->cycle % 64 == 0) {
+ if (info->speedvar<0.01f)
+ info->goom_limit *= 0.91;
+ if (info->totalgoom > 4) {
+ info->goom_limit+=0.02;
+ }
+ if (info->totalgoom > 7) {
+ info->goom_limit*=1.03f;
+ info->goom_limit+=0.03;
+ }
+ if (info->totalgoom > 16) {
+ info->goom_limit*=1.05f;
+ info->goom_limit+=0.04;
+ }
+ if (info->totalgoom == 0) {
+ info->goom_limit = info->prov_max - 0.02;
+ }
+ if ((info->totalgoom == 1) && (info->goom_limit > 0.02))
+ info->goom_limit-=0.01;
+ info->totalgoom = 0;
+ info->bigGoomLimit = info->goom_limit * (1.0f + (float)IVAL(info->biggoom_factor_p)/500.0f);
+ info->prov_max = 0;
+ }
+
+ /* mise a jour des parametres pour la GUI */
+ FVAL(info->volume_p) = info->volume;
+ info->volume_p.change_listener(&info->volume_p);
+ FVAL(info->speed_p) = info->speedvar * 4;
+ info->speed_p.change_listener(&info->speed_p);
+ FVAL(info->accel_p) = info->accelvar;
+ info->accel_p.change_listener(&info->accel_p);
+
+ FVAL(info->goom_limit_p) = info->goom_limit;
+ info->goom_limit_p.change_listener(&info->goom_limit_p);
+ FVAL(info->goom_power_p) = info->goomPower;
+ info->goom_power_p.change_listener(&info->goom_power_p);
+ FVAL(info->last_goom_p) = 1.0-((float)info->timeSinceLastGoom/20.0f);
+ info->last_goom_p.change_listener(&info->last_goom_p);
+ FVAL(info->last_biggoom_p) = 1.0-((float)info->timeSinceLastBigGoom/40.0f);
+ info->last_biggoom_p.change_listener(&info->last_biggoom_p);
+
+ /* bigGoomLimit ==goomLimit*9/8+7 ? */
+ }
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/sound_tester.h b/src/visualizations/Goom/goom2k4-0/src/sound_tester.h
new file mode 100644
index 0000000000..51545a80e1
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/sound_tester.h
@@ -0,0 +1,11 @@
+#ifndef _SOUND_TESTER_H
+#define _SOUND_TESTER_H
+
+#include "goom_plugin_info.h"
+#include "goom_config.h"
+
+/** change les donnees du SoundInfo */
+void evaluate_sound(gint16 data[2][512], SoundInfo *sndInfo);
+
+#endif
+
diff --git a/src/visualizations/Goom/goom2k4-0/src/surf3d.c b/src/visualizations/Goom/goom2k4-0/src/surf3d.c
new file mode 100644
index 0000000000..ba8c69094d
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/surf3d.c
@@ -0,0 +1,107 @@
+#include "surf3d.h"
+#include "goom_plugin_info.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center) {
+ int x = defx;
+ int y = defz;
+ grid3d *g = malloc (sizeof(grid3d));
+ surf3d *s = &(g->surf);
+ s->nbvertex = x*y;
+ s->vertex = malloc (x*y*sizeof(v3d));
+ s->svertex = malloc (x*y*sizeof(v3d));
+ s->center = center;
+
+ g->defx=defx;
+ g->sizex=sizex;
+ g->defz=defz;
+ g->sizez=sizez;
+ g->mode=0;
+
+ while (y) {
+ --y;
+ x = defx;
+ while (x) {
+ --x;
+ s->vertex[x+defx*y].x = (float)(x-defx/2)*sizex/defx;
+ s->vertex[x+defx*y].y = 0;
+ s->vertex[x+defx*y].z = (float)(y-defz/2)*sizez/defz;
+ }
+ }
+ return g;
+}
+
+void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow,
+ int dist, Pixel *buf, Pixel *back, int W,int H) {
+
+ int x;
+ v2d v2,v2x;
+
+ v2d *v2_array = malloc(g->surf.nbvertex * sizeof(v2d));
+ v3d_to_v2d(g->surf.svertex, g->surf.nbvertex, W, H, dist, v2_array);
+
+ for (x=0;x<g->defx;x++) {
+ int z;
+ v2x = v2_array[x];
+
+ for (z=1;z<g->defz;z++) {
+ v2 = v2_array[z*g->defx + x];
+ if (((v2.x != -666) || (v2.y!=-666))
+ && ((v2x.x != -666) || (v2x.y!=-666))) {
+ plug->methods.draw_line (buf,v2x.x,v2x.y,v2.x,v2.y, colorlow, W, H);
+ plug->methods.draw_line (back,v2x.x,v2x.y,v2.x,v2.y, color, W, H);
+ }
+ v2x = v2;
+ }
+ }
+
+ free(v2_array);
+}
+
+void surf3d_rotate (surf3d *s, float angle) {
+ int i;
+ float cosa;
+ float sina;
+ SINCOS(angle,sina,cosa);
+ for (i=0;i<s->nbvertex;i++) {
+ Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina);
+ }
+}
+
+void surf3d_translate (surf3d *s) {
+ int i;
+ for (i=0;i<s->nbvertex;i++) {
+ TRANSLATE_V3D(s->center,s->svertex[i]);
+ }
+}
+
+void grid3d_update (grid3d *g, float angle, float *vals, float dist) {
+ int i;
+ float cosa;
+ float sina;
+ surf3d *s = &(g->surf);
+ v3d cam = s->center;
+ cam.z += dist;
+
+ SINCOS((angle/4.3f),sina,cosa);
+ cam.y += sina*2.0f;
+ SINCOS(angle,sina,cosa);
+
+ if (g->mode==0) {
+ if (vals)
+ for (i=0;i<g->defx;i++)
+ s->vertex[i].y = s->vertex[i].y*0.2 + vals[i]*0.8;
+
+ for (i=g->defx;i<s->nbvertex;i++) {
+ s->vertex[i].y *= 0.255f;
+ s->vertex[i].y += (s->vertex[i-g->defx].y * 0.777f);
+ }
+ }
+
+ for (i=0;i<s->nbvertex;i++) {
+ Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina);
+ TRANSLATE_V3D(cam,s->svertex[i]);
+ }
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/surf3d.h b/src/visualizations/Goom/goom2k4-0/src/surf3d.h
new file mode 100644
index 0000000000..482b6a090c
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/surf3d.h
@@ -0,0 +1,38 @@
+#ifndef _SURF3D_H
+#define _SURF3D_H
+
+#include "v3d.h"
+#include "goom_graphic.h"
+#include "goom_typedefs.h"
+
+typedef struct {
+ v3d *vertex;
+ v3d *svertex;
+ int nbvertex;
+
+ v3d center;
+} surf3d;
+
+typedef struct {
+ surf3d surf;
+
+ int defx;
+ int sizex;
+ int defz;
+ int sizez;
+ int mode;
+} grid3d;
+
+/* hi-level */
+
+/* works on grid3d */
+grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center);
+void grid3d_update (grid3d *s, float angle, float *vals, float dist);
+
+/* low level */
+void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H);
+void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, int dist, Pixel *buf, Pixel *back, int W,int H);
+void surf3d_rotate (surf3d *s, float angle);
+void surf3d_translate (surf3d *s);
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/surf3d.s b/src/visualizations/Goom/goom2k4-0/src/surf3d.s
new file mode 100644
index 0000000000..f8c8c5d440
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/surf3d.s
@@ -0,0 +1,484 @@
+ .file "surf3d.c"
+ .version "01.01"
+gcc2_compiled.:
+.text
+ .align 4
+.globl grid3d_new
+ .type grid3d_new,@function
+grid3d_new:
+ pushl %ebp
+ movl %esp,%ebp
+ subl $44,%esp
+ pushl %edi
+ pushl %esi
+ pushl %ebx
+ movl 20(%ebp),%eax
+ movl 12(%ebp),%esi
+ movl %eax,-8(%ebp)
+ addl $-12,%esp
+ pushl $44
+ call malloc
+ movl %esi,%edx
+ imull -8(%ebp),%edx
+ movl %eax,%edi
+ movl %edx,-12(%ebp)
+ leal (%edx,%edx,2),%ebx
+ movl %edx,8(%edi)
+ addl $-12,%esp
+ sall $2,%ebx
+ pushl %ebx
+ call malloc
+ addl $32,%esp
+ movl %eax,(%edi)
+ addl $-12,%esp
+ pushl %ebx
+ call malloc
+ movl %eax,4(%edi)
+ movl 24(%ebp),%eax
+ movl %eax,12(%edi)
+ movl 28(%ebp),%eax
+ movl %eax,16(%edi)
+ movl 32(%ebp),%eax
+ movl %eax,20(%edi)
+ movl 8(%ebp),%eax
+ movl %eax,28(%edi)
+ movl %esi,24(%edi)
+ movl -8(%ebp),%edx
+ movl 16(%ebp),%eax
+ movl %edx,32(%edi)
+ movl %eax,36(%edi)
+ movl $0,40(%edi)
+ testl %edx,%edx
+ je .L480
+ movl %esi,%eax
+ movl %esi,-28(%ebp)
+ shrl $31,%eax
+ addl %eax,%esi
+ movl -8(%ebp),%eax
+ shrl $31,%eax
+ addl -8(%ebp),%eax
+ movl -12(%ebp),%edx
+ sarl $1,%eax
+ movl %edx,-24(%ebp)
+ negl -28(%ebp)
+ movl %esi,-16(%ebp)
+ movl %eax,-20(%ebp)
+ .p2align 4,,7
+.L481:
+ movl -28(%ebp),%eax
+ addl %eax,-24(%ebp)
+ decl -8(%ebp)
+ movl 12(%ebp),%esi
+ testl %esi,%esi
+ je .L479
+ movl -8(%ebp),%eax
+ subl -20(%ebp),%eax
+ movl %eax,-4(%ebp)
+ fildl -4(%ebp)
+ movl %esi,-4(%ebp)
+ movl -24(%ebp),%edx
+ leal (%edx,%esi),%eax
+ movl -16(%ebp),%ebx
+ fildl 16(%ebp)
+ leal (%eax,%eax,2),%eax
+ sarl $1,%ebx
+ leal 0(,%eax,4),%ecx
+ fmulp %st,%st(1)
+ fildl 20(%ebp)
+ fdivrp %st,%st(1)
+ fildl 8(%ebp)
+ fildl -4(%ebp)
+ jmp .L484
+.L487:
+ fxch %st(2)
+ .p2align 4,,7
+.L484:
+ decl %esi
+ movl %esi,%eax
+ movl (%edi),%edx
+ subl %ebx,%eax
+ movl %eax,-4(%ebp)
+ fildl -4(%ebp)
+ addl $-12,%ecx
+ fmul %st(2),%st
+ fdiv %st(1),%st
+ fstps (%edx,%ecx)
+ fxch %st(2)
+ movl (%edi),%eax
+ movl $0,4(%eax,%ecx)
+ movl (%edi),%eax
+ fsts 8(%eax,%ecx)
+ testl %esi,%esi
+ jne .L487
+ fstp %st(0)
+ fstp %st(0)
+ fstp %st(0)
+.L479:
+ cmpl $0,-8(%ebp)
+ jne .L481
+.L480:
+ leal -56(%ebp),%esp
+ popl %ebx
+ movl %edi,%eax
+ popl %esi
+ popl %edi
+ leave
+ ret
+.Lfe1:
+ .size grid3d_new,.Lfe1-grid3d_new
+.section .rodata
+ .align 8
+.LC48:
+ .long 0x0,0x3fe00000
+ .align 4
+.LC49:
+ .long 0x3f19999a
+ .align 4
+.LC50:
+ .long 0x3ee3d70a
+.text
+ .align 4
+.globl grid3d_update
+ .type grid3d_update,@function
+grid3d_update:
+ pushl %ebp
+ movl %esp,%ebp
+ subl $32,%esp
+ pushl %esi
+ pushl %ebx
+ flds 12(%ebp)
+ movl 8(%ebp),%ebx
+ movl 16(%ebp),%ecx
+ fld %st(0)
+#APP
+ fsin
+#NO_APP
+ fstps -4(%ebp)
+ flds -4(%ebp)
+ fxch %st(1)
+#APP
+ fcos
+#NO_APP
+ fstps -4(%ebp)
+ flds -4(%ebp)
+ cmpl $0,40(%ebx)
+ jne .L519
+ testl %ecx,%ecx
+ je .L520
+ xorl %esi,%esi
+ cmpl 24(%ebx),%esi
+ jge .L520
+ fldl .LC48
+ xorl %edx,%edx
+ .p2align 4,,7
+.L524:
+ movl (%ebx),%eax
+ fld %st(0)
+ fld %st(1)
+ fxch %st(1)
+ fmuls 4(%eax,%edx)
+ fxch %st(1)
+ fmuls (%ecx,%esi,4)
+ faddp %st,%st(1)
+ incl %esi
+ fstps 4(%eax,%edx)
+ addl $12,%edx
+ cmpl 24(%ebx),%esi
+ jl .L524
+ fstp %st(0)
+.L520:
+ movl 24(%ebx),%esi
+ cmpl 8(%ebx),%esi
+ jge .L519
+ leal (%esi,%esi,2),%eax
+ flds .LC49
+ flds .LC50
+ leal 0(,%eax,4),%ecx
+ .p2align 4,,7
+.L529:
+ movl (%ebx),%eax
+ flds 4(%eax,%ecx)
+ fmul %st(2),%st
+ fstps 4(%eax,%ecx)
+ movl %esi,%eax
+ subl 24(%ebx),%eax
+ movl (%ebx),%edx
+ leal (%eax,%eax,2),%eax
+ flds 4(%edx,%eax,4)
+ fmul %st(1),%st
+ fadds 4(%edx,%ecx)
+ incl %esi
+ fstps 4(%edx,%ecx)
+ addl $12,%ecx
+ cmpl 8(%ebx),%esi
+ jl .L529
+ fstp %st(0)
+ fstp %st(0)
+.L519:
+ xorl %esi,%esi
+ cmpl 8(%ebx),%esi
+ jge .L536
+ xorl %ecx,%ecx
+ .p2align 4,,7
+.L534:
+ movl (%ebx),%eax
+ flds (%eax,%ecx)
+ flds 8(%eax,%ecx)
+ fmul %st(2),%st
+ fxch %st(1)
+ fmul %st(3),%st
+ fsubp %st,%st(1)
+ movl 4(%ebx),%edx
+ incl %esi
+ fstps (%edx,%ecx)
+ movl (%ebx),%eax
+ flds (%eax,%ecx)
+ flds 8(%eax,%ecx)
+ fxch %st(1)
+ fmul %st(2),%st
+ fxch %st(1)
+ fmul %st(3),%st
+ faddp %st,%st(1)
+ movl 4(%ebx),%edx
+ fstps 8(%edx,%ecx)
+ movl (%ebx),%eax
+ flds 4(%eax,%ecx)
+ movl 4(%ebx),%edx
+ fstps 4(%edx,%ecx)
+ movl 4(%ebx),%eax
+ flds (%eax,%ecx)
+ fadds 12(%ebx)
+ fstps (%eax,%ecx)
+ movl 4(%ebx),%eax
+ flds 4(%eax,%ecx)
+ fadds 16(%ebx)
+ fstps 4(%eax,%ecx)
+ movl 4(%ebx),%eax
+ flds 8(%eax,%ecx)
+ fadds 20(%ebx)
+ fstps 8(%eax,%ecx)
+ addl $12,%ecx
+ cmpl 8(%ebx),%esi
+ jl .L534
+.L536:
+ fstp %st(0)
+ fstp %st(0)
+ popl %ebx
+ popl %esi
+ leave
+ ret
+.Lfe2:
+ .size grid3d_update,.Lfe2-grid3d_update
+.section .rodata
+ .align 4
+.LC51:
+ .long 0x40000000
+ .align 8
+.LC52:
+ .long 0x0,0x42380000
+.text
+ .align 4
+.globl surf3d_draw
+ .type surf3d_draw,@function
+surf3d_draw:
+ pushl %ebp
+ movl %esp,%ebp
+ subl $60,%esp
+ pushl %edi
+ pushl %esi
+ pushl %ebx
+ movl $0,-20(%ebp)
+ movl -20(%ebp),%edx
+ movl 8(%ebp),%eax
+ cmpl 8(%eax),%edx
+ jge .L493
+ fldl .LC52
+ flds .LC51
+ xorl %edi,%edi
+ .p2align 4,,7
+.L495:
+ movl 8(%ebp),%eax
+ movl 4(%eax),%eax
+ movl %eax,-36(%ebp)
+ fcoms 8(%eax,%edi)
+ fnstsw %ax
+ andb $69,%ah
+ cmpb $1,%ah
+ jne .L496
+ fildl 16(%ebp)
+ movl -36(%ebp),%edx
+ fld %st(0)
+ fmuls (%edx,%edi)
+ fdivs 8(%edx,%edi)
+ fld %st(3)
+ faddp %st,%st(1)
+ fstpl -32(%ebp)
+ movl -32(%ebp),%eax
+ movl -28(%ebp),%edx
+ movl %eax,-40(%ebp)
+ sarl $16,-40(%ebp)
+ movl -36(%ebp),%edx
+ fmuls 4(%edx,%edi)
+ fdivs 8(%edx,%edi)
+ movl -40(%ebp),%ecx
+ fld %st(2)
+ faddp %st,%st(1)
+ fstpl -32(%ebp)
+ movl -32(%ebp),%eax
+ movl -28(%ebp),%edx
+ movl %eax,-44(%ebp)
+ movl 28(%ebp),%eax
+ sarl $1,%eax
+ addl %eax,%ecx
+ movl 32(%ebp),%eax
+ sarl $16,-44(%ebp)
+ sarl $1,%eax
+ movl %ecx,%ebx
+ subl -44(%ebp),%eax
+ movl %eax,%esi
+ cmpl 28(%ebp),%ebx
+ jge .L496
+ testl %ecx,%ecx
+ jl .L496
+ cmpl 32(%ebp),%esi
+ jge .L496
+ testl %eax,%eax
+ jge .L499
+.L496:
+ xorl %esi,%esi
+ xorl %ebx,%ebx
+.L499:
+ movl 20(%ebp),%eax
+ movl %ebx,%edx
+ leal (%eax,%edx,4),%edx
+ movl 28(%ebp),%eax
+ imull %esi,%eax
+ leal (%edx,%eax,4),%eax
+ testl %ebx,%ebx
+ je .L494
+ testl %esi,%esi
+ je .L494
+#APP
+ movd (%eax), %mm0
+ paddusb 12(%ebp), %mm0
+ movd %mm0, (%eax)
+#NO_APP
+.L494:
+ incl -20(%ebp)
+ addl $12,%edi
+ movl -20(%ebp),%eax
+ movl 8(%ebp),%edx
+ cmpl 8(%edx),%eax
+ jl .L495
+ fstp %st(0)
+ fstp %st(0)
+.L493:
+ popl %ebx
+ popl %esi
+ popl %edi
+ leave
+ ret
+.Lfe3:
+ .size surf3d_draw,.Lfe3-surf3d_draw
+ .align 4
+.globl surf3d_rotate
+ .type surf3d_rotate,@function
+surf3d_rotate:
+ pushl %ebp
+ movl %esp,%ebp
+ subl $32,%esp
+ pushl %esi
+ pushl %ebx
+ flds 12(%ebp)
+ movl 8(%ebp),%ebx
+ fld %st(0)
+#APP
+ fsin
+#NO_APP
+ fstps -4(%ebp)
+ flds -4(%ebp)
+ fxch %st(1)
+#APP
+ fcos
+#NO_APP
+ fstps -4(%ebp)
+ xorl %esi,%esi
+ flds -4(%ebp)
+ cmpl 8(%ebx),%esi
+ jge .L537
+ xorl %ecx,%ecx
+ .p2align 4,,7
+.L508:
+ movl (%ebx),%eax
+ flds (%eax,%ecx)
+ flds 8(%eax,%ecx)
+ fmul %st(2),%st
+ fxch %st(1)
+ fmul %st(3),%st
+ fsubp %st,%st(1)
+ movl 4(%ebx),%edx
+ incl %esi
+ fstps (%edx,%ecx)
+ movl (%ebx),%eax
+ flds (%eax,%ecx)
+ flds 8(%eax,%ecx)
+ fxch %st(1)
+ fmul %st(2),%st
+ fxch %st(1)
+ fmul %st(3),%st
+ faddp %st,%st(1)
+ movl 4(%ebx),%edx
+ fstps 8(%edx,%ecx)
+ movl (%ebx),%eax
+ flds 4(%eax,%ecx)
+ movl 4(%ebx),%edx
+ fstps 4(%edx,%ecx)
+ addl $12,%ecx
+ cmpl 8(%ebx),%esi
+ jl .L508
+.L537:
+ fstp %st(0)
+ fstp %st(0)
+ popl %ebx
+ popl %esi
+ leave
+ ret
+.Lfe4:
+ .size surf3d_rotate,.Lfe4-surf3d_rotate
+ .align 4
+.globl surf3d_translate
+ .type surf3d_translate,@function
+surf3d_translate:
+ pushl %ebp
+ movl %esp,%ebp
+ pushl %ebx
+ movl 8(%ebp),%ecx
+ xorl %ebx,%ebx
+ cmpl 8(%ecx),%ebx
+ jge .L512
+ xorl %edx,%edx
+ .p2align 4,,7
+.L514:
+ movl 4(%ecx),%eax
+ flds (%eax,%edx)
+ fadds 12(%ecx)
+ incl %ebx
+ fstps (%eax,%edx)
+ movl 4(%ecx),%eax
+ flds 4(%eax,%edx)
+ fadds 16(%ecx)
+ fstps 4(%eax,%edx)
+ movl 4(%ecx),%eax
+ flds 8(%eax,%edx)
+ fadds 20(%ecx)
+ fstps 8(%eax,%edx)
+ addl $12,%edx
+ cmpl 8(%ecx),%ebx
+ jl .L514
+.L512:
+ popl %ebx
+ leave
+ ret
+.Lfe5:
+ .size surf3d_translate,.Lfe5-surf3d_translate
+ .ident "GCC: (GNU) 2.95.3 19991030 (prerelease)"
diff --git a/src/visualizations/Goom/goom2k4-0/src/tentacle3d.c b/src/visualizations/Goom/goom2k4-0/src/tentacle3d.c
new file mode 100644
index 0000000000..343c106cc6
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/tentacle3d.c
@@ -0,0 +1,299 @@
+#include <stdlib.h>
+
+#include "v3d.h"
+#include "surf3d.h"
+#include "goom_tools.h"
+#include "goom_config.h"
+#include "goom_plugin_info.h"
+#include "tentacle3d.h"
+
+#define D 256.0f
+
+#define nbgrid 6
+#define definitionx 15
+#define definitionz 45
+
+typedef struct _TENTACLE_FX_DATA {
+ PluginParam enabled_bp;
+ PluginParameters params;
+
+ float cycle;
+ grid3d *grille[nbgrid];
+ float *vals;
+
+#define NB_TENTACLE_COLORS 4
+ int colors[NB_TENTACLE_COLORS];
+
+ int col;
+ int dstcol;
+ float lig;
+ float ligs;
+
+ /* statics from pretty_move */
+ float distt;
+ float distt2;
+ float rot; /* entre 0 et 2 * M_PI */
+ int happens;
+ int rotation;
+ int lock;
+} TentacleFXData;
+
+static void tentacle_new (TentacleFXData *data);
+static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H,
+ short[2][512], float, int drawit, TentacleFXData *data);
+static void tentacle_free (TentacleFXData *data);
+
+/*
+ * VisualFX wrapper for the tentacles
+ */
+
+static void tentacle_fx_init(VisualFX *_this, PluginInfo *info) {
+
+ TentacleFXData *data = (TentacleFXData*)malloc(sizeof(TentacleFXData));
+
+ data->enabled_bp = secure_b_param("Enabled", 1);
+ data->params = plugin_parameters ("3D Tentacles", 1);
+ data->params.params[0] = &data->enabled_bp;
+
+ data->cycle = 0.0f;
+ data->col = (0x28<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x5f<<(BLEU*8));
+ data->dstcol = 0;
+ data->lig = 1.15f;
+ data->ligs = 0.1f;
+
+ data->distt = 10.0f;
+ data->distt2 = 0.0f;
+ data->rot = 0.0f; /* entre 0 et 2 * M_PI */
+ data->happens = 0;
+
+ data->rotation = 0;
+ data->lock = 0;
+ data->colors[0] = (0x18<<(ROUGE*8))|(0x4c<<(VERT*8))|(0x2f<<(BLEU*8));
+ data->colors[1] = (0x48<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x6f<<(BLEU*8));
+ data->colors[2] = (0x58<<(ROUGE*8))|(0x3c<<(VERT*8))|(0x0f<<(BLEU*8));
+ data->colors[3] = (0x87<<(ROUGE*8))|(0x55<<(VERT*8))|(0x74<<(BLEU*8));
+ tentacle_new(data);
+
+ _this->params = &data->params;
+ _this->fx_data = (void*)data;
+}
+
+static void tentacle_fx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo)
+{
+ TentacleFXData *data = (TentacleFXData*)_this->fx_data;
+ if (BVAL(data->enabled_bp)) {
+ tentacle_update(goomInfo, dest, src, goomInfo->screen.width,
+ goomInfo->screen.height, goomInfo->sound.samples,
+ (float)goomInfo->sound.accelvar,
+ goomInfo->curGState->drawTentacle, data);
+ }
+}
+
+static void tentacle_fx_free(VisualFX *_this) {
+ TentacleFXData *data = (TentacleFXData*)_this->fx_data;
+ free(data->params.params);
+ tentacle_free(data);
+ free(_this->fx_data);
+}
+
+VisualFX tentacle_fx_create(void) {
+ VisualFX fx;
+ fx.init = tentacle_fx_init;
+ fx.apply = tentacle_fx_apply;
+ fx.free = tentacle_fx_free;
+ return fx;
+}
+
+/* ----- */
+
+static void tentacle_free (TentacleFXData *data) {
+ /* TODO : un vrai FREE GRID!! */
+ int tmp;
+ for (tmp=0;tmp<nbgrid;tmp++){
+ grid3d *g = data->grille[tmp];
+ free (g->surf.vertex);
+ free (g->surf.svertex);
+ free (g);
+ }
+ free (data->vals);
+}
+
+static void tentacle_new (TentacleFXData *data) {
+ int tmp;
+
+ v3d center = {0,-17.0,0};
+ data->vals = (float*)malloc ((definitionx+20)*sizeof(float));
+
+ for (tmp=0;tmp<nbgrid;tmp++) {
+ int x,z;
+ z = 45 + rand() % 30;
+ x = 85 + rand() % 5;
+ center.z = z;
+ data->grille[tmp] = grid3d_new (x, definitionx, z, definitionz + rand() % 10, center);
+ center.y += 8;
+ }
+}
+
+static inline unsigned char lighten (unsigned char value, float power)
+{
+ int val = value;
+ float t = (float) val * log10(power) / 2.0;
+
+ if (t > 0) {
+ val = (int) t; /* (32.0f * log (t)); */
+ if (val > 255)
+ val = 255;
+ if (val < 0)
+ val = 0;
+ return val;
+ }
+ else {
+ return 0;
+ }
+}
+
+static void lightencolor (int *col, float power)
+{
+ unsigned char *color;
+
+ color = (unsigned char *) col;
+ *color = lighten (*color, power);
+ color++;
+ *color = lighten (*color, power);
+ color++;
+ *color = lighten (*color, power);
+ color++;
+ *color = lighten (*color, power);
+}
+
+/* retourne x>>s , en testant le signe de x */
+#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s))
+
+static int evolutecolor (unsigned int src,unsigned int dest,
+ unsigned int mask, unsigned int incr) {
+
+ int color = src & (~mask);
+ src &= mask;
+ dest &= mask;
+
+ if ((src!=mask)
+ &&(src<dest))
+ src += incr;
+
+ if (src>dest)
+ src -= incr;
+ return (src&mask)|color;
+}
+
+static void pretty_move (PluginInfo *goomInfo, float cycle, float *dist, float *dist2, float *rotangle, TentacleFXData *fx_data) {
+
+ float tmp;
+
+ /* many magic numbers here... I don't really like that. */
+ if (fx_data->happens)
+ fx_data->happens -= 1;
+ else if (fx_data->lock == 0) {
+ fx_data->happens = goom_irand(goomInfo->gRandom,200)?0:100+goom_irand(goomInfo->gRandom,60);
+ fx_data->lock = fx_data->happens * 3 / 2;
+ }
+ else fx_data->lock --;
+
+ tmp = fx_data->happens?8.0f:0;
+ *dist2 = fx_data->distt2 = (tmp + 15.0f*fx_data->distt2)/16.0f;
+
+ tmp = 30+D-90.0f*(1.0f+sin(cycle*19/20));
+ if (fx_data->happens)
+ tmp *= 0.6f;
+
+ *dist = fx_data->distt = (tmp + 3.0f*fx_data->distt)/4.0f;
+
+ if (!fx_data->happens){
+ tmp = M_PI*sin(cycle)/32+3*M_PI/2;
+ }
+ else {
+ fx_data->rotation = goom_irand(goomInfo->gRandom,500)?fx_data->rotation:goom_irand(goomInfo->gRandom,2);
+ if (fx_data->rotation)
+ cycle *= 2.0f*M_PI;
+ else
+ cycle *= -1.0f*M_PI;
+ tmp = cycle - (M_PI*2.0) * floor(cycle/(M_PI*2.0));
+ }
+
+ if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot+2.0*M_PI))) {
+ fx_data->rot = (tmp + 15.0f*(fx_data->rot+2*M_PI)) / 16.0f;
+ if (fx_data->rot>2.0*M_PI)
+ fx_data->rot -= 2.0*M_PI;
+ *rotangle = fx_data->rot;
+ }
+ else if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot-2.0*M_PI))) {
+ fx_data->rot = (tmp + 15.0f*(fx_data->rot-2.0*M_PI)) / 16.0f;
+ if (fx_data->rot<0.0f)
+ fx_data->rot += 2.0*M_PI;
+ *rotangle = fx_data->rot;
+ }
+ else
+ *rotangle = fx_data->rot = (tmp + 15.0f*fx_data->rot) / 16.0f;
+}
+
+static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H,
+ short data[2][512], float rapport, int drawit, TentacleFXData *fx_data) {
+
+ int tmp;
+ int tmp2;
+
+ int color;
+ int colorlow;
+
+ float dist,dist2,rotangle;
+
+ if ((!drawit) && (fx_data->ligs>0.0f))
+ fx_data->ligs = -fx_data->ligs;
+
+ fx_data->lig += fx_data->ligs;
+
+ if (fx_data->lig > 1.01f) {
+ if ((fx_data->lig>10.0f) | (fx_data->lig<1.1f)) fx_data->ligs = -fx_data->ligs;
+
+ if ((fx_data->lig<6.3f)&&(goom_irand(goomInfo->gRandom,30)==0))
+ fx_data->dstcol=goom_irand(goomInfo->gRandom,NB_TENTACLE_COLORS);
+
+ fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff,0x01);
+ fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff00,0x0100);
+ fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff0000,0x010000);
+ fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff000000,0x01000000);
+
+ color = fx_data->col;
+ colorlow = fx_data->col;
+
+ lightencolor(&color,fx_data->lig * 2.0f + 2.0f);
+ lightencolor(&colorlow,(fx_data->lig/3.0f)+0.67f);
+
+ rapport = 1.0f + 2.0f * (rapport - 1.0f);
+ rapport *= 1.2f;
+ if (rapport > 1.12f)
+ rapport = 1.12f;
+
+ pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data);
+
+ for (tmp=0;tmp<nbgrid;tmp++) {
+ for (tmp2=0;tmp2<definitionx;tmp2++) {
+ float val = (float)(ShiftRight(data[0][goom_irand(goomInfo->gRandom,511)],10)) * rapport;
+ fx_data->vals[tmp2] = val;
+ }
+
+ grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2);
+ }
+ fx_data->cycle+=0.01f;
+ for (tmp=0;tmp<nbgrid;tmp++)
+ grid3d_draw (goomInfo, fx_data->grille[tmp],color,colorlow,dist,buf,back,W,H);
+ }
+ else {
+ fx_data->lig = 1.05f;
+ if (fx_data->ligs < 0.0f)
+ fx_data->ligs = -fx_data->ligs;
+ pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data);
+ fx_data->cycle+=0.1f;
+ if (fx_data->cycle > 1000)
+ fx_data->cycle = 0;
+ }
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/tentacle3d.h b/src/visualizations/Goom/goom2k4-0/src/tentacle3d.h
new file mode 100644
index 0000000000..ad0858fadf
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/tentacle3d.h
@@ -0,0 +1,8 @@
+#ifndef _TENTACLE3D_H
+#define _TENTACLE3D_H
+
+#include "goom_visual_fx.h"
+
+VisualFX tentacle_fx_create(void);
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/v3d.c b/src/visualizations/Goom/goom2k4-0/src/v3d.c
new file mode 100644
index 0000000000..1614e8afdb
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/v3d.c
@@ -0,0 +1,15 @@
+#include "v3d.h"
+
+void v3d_to_v2d(v3d *v3, int nbvertex, int width, int height, float distance, v2d *v2) {
+ int i;
+ for (i=0;i<nbvertex;++i) {
+ if (v3[i].z > 2) {
+ int Xp, Yp;
+ F2I((distance * v3[i].x / v3[i].z),Xp);
+ F2I((distance * v3[i].y / v3[i].z),Yp);
+ v2[i].x = Xp + (width>>1);
+ v2[i].y = -Yp + (height>>1);
+ }
+ else v2[i].x=v2[i].y=-666;
+ }
+}
diff --git a/src/visualizations/Goom/goom2k4-0/src/v3d.h b/src/visualizations/Goom/goom2k4-0/src/v3d.h
new file mode 100644
index 0000000000..7690847f20
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/v3d.h
@@ -0,0 +1,65 @@
+#ifndef _V3D_H
+#define _V3D_H
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "mathtools.h"
+
+typedef struct {
+ float x,y,z;
+} v3d;
+
+typedef struct {
+ int x,y;
+} v2d;
+
+typedef struct {
+ double x,y;
+} v2g;
+
+/*
+ * projete le vertex 3D sur le plan d'affichage
+ * retourne (0,0) si le point ne doit pas etre affiche.
+ *
+ * bonne valeur pour distance : 256
+ */
+#define V3D_TO_V2D(v3,v2,width,height,distance) \
+{ \
+ int Xp, Yp; \
+ if (v3.z > 2) { \
+ F2I((distance * v3.x / v3.z),Xp) ; \
+ F2I((distance * v3.y / v3.z),Yp) ; \
+ v2.x = Xp + (width>>1); \
+ v2.y = -Yp + (height>>1); \
+ } \
+ else v2.x=v2.y=-666; \
+}
+
+void v3d_to_v2d(v3d *src, int nbvertex, int width, int height, float distance, v2d *v2_array);
+
+/*
+ * rotation selon Y du v3d vi d'angle a (cosa=cos(a), sina=sin(a))
+ * centerz = centre de rotation en z
+ */
+#define Y_ROTATE_V3D(vi,vf,sina,cosa)\
+{\
+ vf.x = vi.x * cosa - vi.z * sina;\
+ vf.z = vi.x * sina + vi.z * cosa;\
+ vf.y = vi.y;\
+}
+
+/*
+ * translation
+ */
+#define TRANSLATE_V3D(vsrc,vdest)\
+{\
+ vdest.x += vsrc.x;\
+ vdest.y += vsrc.y;\
+ vdest.z += vsrc.z;\
+}
+
+#define MUL_V3D(lf,v) {v.x*=lf;v.y*=lf;v.z*=lf;}
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/xmmx.c b/src/visualizations/Goom/goom2k4-0/src/xmmx.c
new file mode 100644
index 0000000000..217e17cfbc
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/xmmx.c
@@ -0,0 +1,390 @@
+
+#ifdef HAVE_MMX
+
+/* a definir pour avoir exactement le meme resultat que la fonction C
+ * (un chouillat plus lent).. mais la difference est assez peu notable.
+ */
+// #define STRICT_COMPAT
+
+#define BUFFPOINTNB 16
+#define BUFFPOINTMASK 0xffff
+#define BUFFINCR 0xff
+
+#define sqrtperte 16
+/* faire : a % sqrtperte <=> a & pertemask*/
+#define PERTEMASK 0xf
+/* faire : a / sqrtperte <=> a >> PERTEDEC*/
+#define PERTEDEC 4
+
+
+/*#define MMX_TRACE*/
+#include "mmx.h"
+/*#include "xmmx.h"*/
+#include "goom_graphic.h"
+
+int xmmx_supported (void) {
+ return (mm_support()&0x8)>>3;
+}
+
+void zoom_filter_xmmx (int prevX, int prevY,
+ Pixel *expix1, Pixel *expix2,
+ int *lbruS, int *lbruD, int buffratio,
+ int precalCoef[16][16])
+{
+ int bufsize = prevX * prevY; /* taille du buffer */
+ volatile int loop; /* variable de boucle */
+
+ mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */
+ mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */
+
+ volatile mmx_t prevXY;
+ volatile mmx_t ratiox;
+ /* volatile mmx_t interpix; */
+
+ expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0;
+
+ prevXY.ud[0] = (prevX-1)<<PERTEDEC;
+ prevXY.ud[1] = (prevY-1)<<PERTEDEC;
+
+ ratiox.d[0] = buffratio;
+ ratiox.d[1] = buffratio;
+
+ asm volatile
+ ("\n\t movq %[ratio], %%mm6"
+ "\n\t pslld $16, %%mm6" /* mm6 = [rat16=buffratio<<16 | rat16=buffratio<<16] */
+ "\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */
+ ::[ratio]"m"(ratiox));
+
+ loop=0;
+
+ /*
+ * NOTE : mm6 et mm7 ne sont pas modifies dans la boucle.
+ */
+ while (loop < bufsize)
+ {
+ /* Thread #1
+ * pre : mm6 = [rat16|rat16]
+ * post : mm0 = S + ((D-S)*rat16 format [X|Y]
+ * modified = mm0,mm1,mm2
+ */
+
+ asm volatile ("#1 \n\t movq 0(%[brutS]), %%mm0"
+ "#1 \n\t movq 0(%[brutD]), %%mm1"
+ "#1 \n\t psubd %%mm0, %%mm1" /* mm1 = D - S */
+ "#1 \n\t movq %%mm1, %%mm2" /* mm2 = D - S */
+ "#1 \n\t pslld $16, %%mm1"
+ "#1 \n\t pmullw %%mm6, %%mm2"
+ "#1 \n\t pmulhuw %%mm6, %%mm1"
+ "#1 \n\t pslld $16, %%mm0"
+ "#1 \n\t paddd %%mm2, %%mm1" /* mm1 = (D - S) * buffratio >> 16 */
+
+ "#1 \n\t paddd %%mm1, %%mm0" /* mm0 = S + mm1 */
+ "#1 \n\t psrld $16, %%mm0"
+ :
+ :[brutS] "r" (&brutS[loop]) ,[brutD] "r" (&brutD[loop])
+ ); /* mm0 = S */
+
+ /*
+ * pre : mm0 : position vector on screen
+ * prevXY : coordinate of the lower-right point on screen
+ * post : clipped mm0
+ * modified : mm0,mm1,mm2
+ */
+ asm volatile
+ ("#1 \n\t movq %[prevXY], %%mm1"
+ "#1 \n\t pcmpgtd %%mm0, %%mm1"
+ /* mm0 en X contient (idem pour Y) :
+ * 1111 si prevXY > px
+ * 0000 si prevXY <= px */
+#ifdef STRICT_COMPAT
+ "#1 \n\t movq %%mm1, %%mm2"
+ "#1 \n\t punpckhdq %%mm2, %%mm2"
+ "#1 \n\t punpckldq %%mm1, %%mm1"
+ "#1 \n\t pand %%mm2, %%mm0"
+#endif
+
+ "#1 \n\t pand %%mm1, %%mm0" /* on met a zero la partie qui deborde */
+ ::[prevXY]"m"(prevXY));
+
+ /* Thread #2
+ * pre : mm0 : clipped position on screen
+ *
+ * post : mm3 : coefs for this position
+ * mm1 : X vector [0|X]
+ *
+ * modif : eax,esi
+ */
+ __asm__ __volatile__ (
+ "#2 \n\t movd %%mm0,%%esi"
+ "#2 \n\t movq %%mm0,%%mm1"
+
+ "#2 \n\t andl $15,%%esi"
+ "#2 \n\t psrlq $32,%%mm1"
+
+ "#2 \n\t shll $6,%%esi"
+ "#2 \n\t movd %%mm1,%%eax"
+
+ "#2 \n\t addl %[precalCoef],%%esi"
+ "#2 \n\t andl $15,%%eax"
+
+ "#2 \n\t movd (%%esi,%%eax,4),%%mm3"
+ ::[precalCoef]"g"(precalCoef):"eax","esi");
+
+ /*
+ * extraction des coefficients... (Thread #3)
+ *
+ * pre : coef dans mm3
+ *
+ * post : coef extraits dans mm3 (c1 & c2)
+ * et mm4 (c3 & c4)
+ *
+ * modif : mm5
+ */
+
+ /* (Thread #4)
+ * pre : mm0 : Y pos [*|Y]
+ * mm1 : X pos [*|X]
+ *
+ * post : mm0 : expix1[position]
+ * mm2 : expix1[position+largeur]
+ *
+ * modif : eax, esi
+ */
+ __asm__ __volatile__ (
+ "#2 \n\t psrld $4, %%mm0"
+ "#2 \n\t psrld $4, %%mm1" /* PERTEDEC = $4 */
+
+ "#4 \n\t movd %%mm1,%%eax"
+ "#3 \n\t movq %%mm3,%%mm5"
+
+ "#4 \n\t mull %[prevX]"
+ "#4 \n\t movd %%mm0,%%esi"
+
+ "#3 \n\t punpcklbw %%mm5, %%mm3"
+ "#4 \n\t addl %%esi, %%eax"
+
+ "#3 \n\t movq %%mm3, %%mm4"
+ "#3 \n\t movq %%mm3, %%mm5"
+
+ "#4 \n\t movl %[expix1], %%esi"
+ "#3 \n\t punpcklbw %%mm5, %%mm3"
+
+ "#4 \n\t movq (%%esi,%%eax,4),%%mm0"
+ "#3 \n\t punpckhbw %%mm5, %%mm4"
+
+ "#4 \n\t addl %[prevX],%%eax"
+ "#4 \n\t movq (%%esi,%%eax,4),%%mm2"
+
+ :
+ : [expix1] "g"(expix1)
+ , [prevX] "g"(prevX)
+ :"eax","esi"
+ );
+
+ /*
+ * pre : mm0 : expix1[position]
+ * mm2 : expix1[position+largeur]
+ * mm3 & mm4 : coefs
+ */
+
+ /* recopie des deux premiers pixels dans mm0 et mm1 */
+ movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */
+
+ /* depackage du premier pixel */
+ punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */
+
+ /* extraction des coefficients... */
+
+ movq_r2r (mm3, mm5); /* c2-c2-c2-c2-c1-c1-c1-c1 */
+
+ /*^en parrallele^*/ /* depackage du 2ieme pixel */
+ /*^*/ punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */
+
+ punpcklbw_r2r (mm7, mm5); /* 00-c1-00-c1-00-c1-00-c1 */
+ punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */
+
+ /* multiplication des pixels par les coefficients */
+ pmullw_r2r (mm5, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */
+ pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */
+ paddw_r2r (mm1, mm0);
+
+ /* ...extraction des 2 derniers coefficients */
+ movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */
+ punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */
+ punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */
+
+ /* recuperation des 2 derniers pixels */
+ movq_r2r (mm2, mm1);
+
+ /* depackage des pixels */
+ punpcklbw_r2r (mm7, mm1);
+ punpckhbw_r2r (mm7, mm2);
+
+ /* multiplication pas les coeffs */
+ pmullw_r2r (mm4, mm1);
+ pmullw_r2r (mm5, mm2);
+
+ /* ajout des valeurs obtenues à la valeur finale */
+ paddw_r2r (mm1, mm0);
+ paddw_r2r (mm2, mm0);
+
+ /* division par 256 = 16+16+16+16, puis repackage du pixel final */
+ psrlw_i2r (8, mm0);
+ packuswb_r2r (mm7, mm0);
+
+ movd_r2m (mm0,expix2[loop]);
+
+ ++loop;
+ }
+ __asm__ __volatile__ ("emms\n");
+}
+
+#define DRAWMETHOD_PLUS_XMMX(_out,_backbuf,_col) \
+{ \
+ movd_m2r(_backbuf, mm0); \
+ paddusb_m2r(_col, mm0); \
+ movd_r2m(mm0, _out); \
+}
+
+#define DRAWMETHOD DRAWMETHOD_PLUS_XMMX(*p,*p,col)
+
+void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny)
+{
+ int x, y, dx, dy, yy, xx;
+ Pixel *p;
+
+ if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx))
+ goto end_of_line;
+
+ dx = x2 - x1;
+ dy = y2 - y1;
+ if (x1 >= x2) {
+ int tmp;
+
+ tmp = x1;
+ x1 = x2;
+ x2 = tmp;
+ tmp = y1;
+ y1 = y2;
+ y2 = tmp;
+ dx = x2 - x1;
+ dy = y2 - y1;
+ }
+
+ /* vertical line */
+ if (dx == 0) {
+ if (y1 < y2) {
+ p = &(data[(screenx * y1) + x1]);
+ for (y = y1; y <= y2; y++) {
+ DRAWMETHOD;
+ p += screenx;
+ }
+ }
+ else {
+ p = &(data[(screenx * y2) + x1]);
+ for (y = y2; y <= y1; y++) {
+ DRAWMETHOD;
+ p += screenx;
+ }
+ }
+ goto end_of_line;
+ }
+ /* horizontal line */
+ if (dy == 0) {
+ if (x1 < x2) {
+ p = &(data[(screenx * y1) + x1]);
+ for (x = x1; x <= x2; x++) {
+ DRAWMETHOD;
+ p++;
+ }
+ goto end_of_line;
+ }
+ else {
+ p = &(data[(screenx * y1) + x2]);
+ for (x = x2; x <= x1; x++) {
+ DRAWMETHOD;
+ p++;
+ }
+ goto end_of_line;
+ }
+ }
+ /* 1 */
+ /* \ */
+ /* \ */
+ /* 2 */
+ if (y2 > y1) {
+ /* steep */
+ if (dy > dx) {
+ dx = ((dx << 16) / dy);
+ x = x1 << 16;
+ for (y = y1; y <= y2; y++) {
+ xx = x >> 16;
+ p = &(data[(screenx * y) + xx]);
+ DRAWMETHOD;
+ if (xx < (screenx - 1)) {
+ p++;
+ /* DRAWMETHOD; */
+ }
+ x += dx;
+ }
+ goto end_of_line;
+ }
+ /* shallow */
+ else {
+ dy = ((dy << 16) / dx);
+ y = y1 << 16;
+ for (x = x1; x <= x2; x++) {
+ yy = y >> 16;
+ p = &(data[(screenx * yy) + x]);
+ DRAWMETHOD;
+ if (yy < (screeny - 1)) {
+ p += screeny;
+ /* DRAWMETHOD; */
+ }
+ y += dy;
+ }
+ }
+ }
+ /* 2 */
+ /* / */
+ /* / */
+ /* 1 */
+ else {
+ /* steep */
+ if (-dy > dx) {
+ dx = ((dx << 16) / -dy);
+ x = (x1 + 1) << 16;
+ for (y = y1; y >= y2; y--) {
+ xx = x >> 16;
+ p = &(data[(screenx * y) + xx]);
+ DRAWMETHOD;
+ if (xx < (screenx - 1)) {
+ p--;
+ /* DRAWMETHOD; */
+ }
+ x += dx;
+ }
+ goto end_of_line;
+ }
+ /* shallow */
+ else {
+ dy = ((dy << 16) / dx);
+ y = y1 << 16;
+ for (x = x1; x <= x2; x++) {
+ yy = y >> 16;
+ p = &(data[(screenx * yy) + x]);
+ DRAWMETHOD;
+ if (yy < (screeny - 1)) {
+ p += screeny;
+ /* DRAWMETHOD; */
+ }
+ y += dy;
+ }
+ goto end_of_line;
+ }
+ }
+end_of_line:
+ __asm__ __volatile__ ("emms\n");
+}
+
+#endif
diff --git a/src/visualizations/Goom/goom2k4-0/src/xmmx.h b/src/visualizations/Goom/goom2k4-0/src/xmmx.h
new file mode 100644
index 0000000000..70ef36143e
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/src/xmmx.h
@@ -0,0 +1,537 @@
+/* xmmx.h
+
+ eXtended MultiMedia eXtensions GCC interface library for IA32.
+
+ To use this library, simply include this header file
+ and compile with GCC. You MUST have inlining enabled
+ in order for xmmx_ok() to work; this can be done by
+ simply using -O on the GCC command line.
+
+ Compiling with -DXMMX_TRACE will cause detailed trace
+ output to be sent to stderr for each mmx operation.
+ This adds lots of code, and obviously slows execution to
+ a crawl, but can be very useful for debugging.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
+ LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR ANY PARTICULAR PURPOSE.
+
+ 1999 by R. Fisher
+ Based on libmmx, 1997-99 by H. Dietz and R. Fisher
+
+ Notes:
+ It appears that the latest gas has the pand problem fixed, therefore
+ I'll undefine BROKEN_PAND by default.
+*/
+
+#ifndef _XMMX_H
+#define _XMMX_H
+
+
+/* Warning: at this writing, the version of GAS packaged
+ with most Linux distributions does not handle the
+ parallel AND operation mnemonic correctly. If the
+ symbol BROKEN_PAND is defined, a slower alternative
+ coding will be used. If execution of mmxtest results
+ in an illegal instruction fault, define this symbol.
+*/
+#undef BROKEN_PAND
+
+
+/* The type of an value that fits in an (Extended) MMX register
+ (note that long long constant values MUST be suffixed
+ by LL and unsigned long long values by ULL, lest
+ they be truncated by the compiler)
+*/
+#ifndef _MMX_H
+typedef union {
+ long long q; /* Quadword (64-bit) value */
+ unsigned long long uq; /* Unsigned Quadword */
+ int d[2]; /* 2 Doubleword (32-bit) values */
+ unsigned int ud[2]; /* 2 Unsigned Doubleword */
+ short w[4]; /* 4 Word (16-bit) values */
+ unsigned short uw[4]; /* 4 Unsigned Word */
+ char b[8]; /* 8 Byte (8-bit) values */
+ unsigned char ub[8]; /* 8 Unsigned Byte */
+ float s[2]; /* Single-precision (32-bit) value */
+} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */
+#endif
+
+
+
+/* Function to test if multimedia instructions are supported...
+*/
+static int
+mm_support(void)
+{
+ /* Returns 1 if MMX instructions are supported,
+ 3 if Cyrix MMX and Extended MMX instructions are supported
+ 5 if AMD MMX and 3DNow! instructions are supported
+ 0 if hardware does not support any of these
+ */
+ register int rval = 0;
+
+ __asm__ __volatile__ (
+ /* See if CPUID instruction is supported ... */
+ /* ... Get copies of EFLAGS into eax and ecx */
+ "pushf\n\t"
+ "popl %%eax\n\t"
+ "movl %%eax, %%ecx\n\t"
+
+ /* ... Toggle the ID bit in one copy and store */
+ /* to the EFLAGS reg */
+ "xorl $0x200000, %%eax\n\t"
+ "push %%eax\n\t"
+ "popf\n\t"
+
+ /* ... Get the (hopefully modified) EFLAGS */
+ "pushf\n\t"
+ "popl %%eax\n\t"
+
+ /* ... Compare and test result */
+ "xorl %%eax, %%ecx\n\t"
+ "testl $0x200000, %%ecx\n\t"
+ "jz NotSupported1\n\t" /* CPUID not supported */
+
+
+ /* Get standard CPUID information, and
+ go to a specific vendor section */
+ "movl $0, %%eax\n\t"
+ "cpuid\n\t"
+
+ /* Check for Intel */
+ "cmpl $0x756e6547, %%ebx\n\t"
+ "jne TryAMD\n\t"
+ "cmpl $0x49656e69, %%edx\n\t"
+ "jne TryAMD\n\t"
+ "cmpl $0x6c65746e, %%ecx\n"
+ "jne TryAMD\n\t"
+ "jmp Intel\n\t"
+
+ /* Check for AMD */
+ "\nTryAMD:\n\t"
+ "cmpl $0x68747541, %%ebx\n\t"
+ "jne TryCyrix\n\t"
+ "cmpl $0x69746e65, %%edx\n\t"
+ "jne TryCyrix\n\t"
+ "cmpl $0x444d4163, %%ecx\n"
+ "jne TryCyrix\n\t"
+ "jmp AMD\n\t"
+
+ /* Check for Cyrix */
+ "\nTryCyrix:\n\t"
+ "cmpl $0x69727943, %%ebx\n\t"
+ "jne NotSupported2\n\t"
+ "cmpl $0x736e4978, %%edx\n\t"
+ "jne NotSupported3\n\t"
+ "cmpl $0x64616574, %%ecx\n\t"
+ "jne NotSupported4\n\t"
+ /* Drop through to Cyrix... */
+
+
+ /* Cyrix Section */
+ /* See if extended CPUID level 80000001 is supported */
+ /* The value of CPUID/80000001 for the 6x86MX is undefined
+ according to the Cyrix CPU Detection Guide (Preliminary
+ Rev. 1.01 table 1), so we'll check the value of eax for
+ CPUID/0 to see if standard CPUID level 2 is supported.
+ According to the table, the only CPU which supports level
+ 2 is also the only one which supports extended CPUID levels.
+ */
+ "cmpl $0x2, %%eax\n\t"
+ "jne MMXtest\n\t" /* Use standard CPUID instead */
+
+ /* Extended CPUID supported (in theory), so get extended
+ features */
+ "movl $0x80000001, %%eax\n\t"
+ "cpuid\n\t"
+ "testl $0x00800000, %%eax\n\t" /* Test for MMX */
+ "jz NotSupported5\n\t" /* MMX not supported */
+ "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */
+ "jnz EMMXSupported\n\t"
+ "movl $1, %0:\n\n\t" /* MMX Supported */
+ "jmp Return\n\n"
+ "EMMXSupported:\n\t"
+ "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */
+ "jmp Return\n\t"
+
+
+ /* AMD Section */
+ "AMD:\n\t"
+
+ /* See if extended CPUID is supported */
+ "movl $0x80000000, %%eax\n\t"
+ "cpuid\n\t"
+ "cmpl $0x80000000, %%eax\n\t"
+ "jl MMXtest\n\t" /* Use standard CPUID instead */
+
+ /* Extended CPUID supported, so get extended features */
+ "movl $0x80000001, %%eax\n\t"
+ "cpuid\n\t"
+ "testl $0x00800000, %%edx\n\t" /* Test for MMX */
+ "jz NotSupported6\n\t" /* MMX not supported */
+ "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */
+ "jnz ThreeDNowSupported\n\t"
+ "movl $1, %0:\n\n\t" /* MMX Supported */
+ "jmp Return\n\n"
+ "ThreeDNowSupported:\n\t"
+ "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */
+ "jmp Return\n\t"
+
+
+ /* Intel Section */
+ "Intel:\n\t"
+
+ /* Check for MMX */
+ "MMXtest:\n\t"
+ "movl $1, %%eax\n\t"
+ "cpuid\n\t"
+ "testl $0x00800000, %%edx\n\t" /* Test for MMX */
+ "jz NotSupported7\n\t" /* MMX Not supported */
+ "movl $1, %0:\n\n\t" /* MMX Supported */
+ "jmp Return\n\t"
+
+ /* Nothing supported */
+ "\nNotSupported1:\n\t"
+ "#movl $101, %0:\n\n\t"
+ "\nNotSupported2:\n\t"
+ "#movl $102, %0:\n\n\t"
+ "\nNotSupported3:\n\t"
+ "#movl $103, %0:\n\n\t"
+ "\nNotSupported4:\n\t"
+ "#movl $104, %0:\n\n\t"
+ "\nNotSupported5:\n\t"
+ "#movl $105, %0:\n\n\t"
+ "\nNotSupported6:\n\t"
+ "#movl $106, %0:\n\n\t"
+ "\nNotSupported7:\n\t"
+ "#movl $107, %0:\n\n\t"
+ "movl $0, %0:\n\n\t"
+
+ "Return:\n\t"
+ : "=a" (rval)
+ : /* no input */
+ : "eax", "ebx", "ecx", "edx"
+ );
+
+ /* Return */
+ return(rval);
+}
+
+/* Function to test if mmx instructions are supported...
+*/
+#ifndef _XMMX_H
+inline extern int
+mmx_ok(void)
+{
+ /* Returns 1 if MMX instructions are supported, 0 otherwise */
+ return ( mm_support() & 0x1 );
+}
+#endif
+
+/* Function to test if xmmx instructions are supported...
+*/
+inline extern int
+xmmx_ok(void)
+{
+ /* Returns 1 if Extended MMX instructions are supported, 0 otherwise */
+ return ( (mm_support() & 0x2) >> 1 );
+}
+
+
+/* Helper functions for the instruction macros that follow...
+ (note that memory-to-register, m2r, instructions are nearly
+ as efficient as register-to-register, r2r, instructions;
+ however, memory-to-memory instructions are really simulated
+ as a convenience, and are only 1/3 as efficient)
+*/
+#ifdef XMMX_TRACE
+
+/* Include the stuff for printing a trace to stderr...
+*/
+
+#include <stdio.h>
+
+#define mmx_i2r(op, imm, reg) \
+ { \
+ mmx_t mmx_trace; \
+ mmx_trace.uq = (imm); \
+ fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ fprintf(stderr, #reg "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ (#op " %0, %%" #reg \
+ : /* nothing */ \
+ : "X" (imm)); \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ fprintf(stderr, #reg "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#define mmx_m2r(op, mem, reg) \
+ { \
+ mmx_t mmx_trace; \
+ mmx_trace = (mem); \
+ fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ fprintf(stderr, #reg "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ (#op " %0, %%" #reg \
+ : /* nothing */ \
+ : "X" (mem)); \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ fprintf(stderr, #reg "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#define mmx_r2m(op, reg, mem) \
+ { \
+ mmx_t mmx_trace; \
+ __asm__ __volatile__ ("movq %%" #reg ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ mmx_trace = (mem); \
+ fprintf(stderr, #mem "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ (#op " %%" #reg ", %0" \
+ : "=X" (mem) \
+ : /* nothing */ ); \
+ mmx_trace = (mem); \
+ fprintf(stderr, #mem "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#define mmx_r2r(op, regs, regd) \
+ { \
+ mmx_t mmx_trace; \
+ __asm__ __volatile__ ("movq %%" #regs ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ ("movq %%" #regd ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ fprintf(stderr, #regd "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ (#op " %" #regs ", %" #regd); \
+ __asm__ __volatile__ ("movq %%" #regd ", %0" \
+ : "=X" (mmx_trace) \
+ : /* nothing */ ); \
+ fprintf(stderr, #regd "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#define mmx_m2m(op, mems, memd) \
+ { \
+ mmx_t mmx_trace; \
+ mmx_trace = (mems); \
+ fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ mmx_trace = (memd); \
+ fprintf(stderr, #memd "=0x%08x%08x) => ", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+ #op " %1, %%mm0\n\t" \
+ "movq %%mm0, %0" \
+ : "=X" (memd) \
+ : "X" (mems)); \
+ mmx_trace = (memd); \
+ fprintf(stderr, #memd "=0x%08x%08x\n", \
+ mmx_trace.d[1], mmx_trace.d[0]); \
+ }
+
+#else
+
+/* These macros are a lot simpler without the tracing...
+*/
+
+#define mmx_i2r(op, imm, reg) \
+ __asm__ __volatile__ (#op " %0, %%" #reg \
+ : /* nothing */ \
+ : "X" (imm) )
+
+#define mmx_m2r(op, mem, reg) \
+ __asm__ __volatile__ (#op " %0, %%" #reg \
+ : /* nothing */ \
+ : "X" (mem))
+
+#define mmx_m2ir(op, mem, rs) \
+ __asm__ __volatile__ (#op " %0, %%" #rs \
+ : /* nothing */ \
+ : "X" (mem) )
+
+#define mmx_r2m(op, reg, mem) \
+ __asm__ __volatile__ (#op " %%" #reg ", %0" \
+ : "=X" (mem) \
+ : /* nothing */ )
+
+#define mmx_r2r(op, regs, regd) \
+ __asm__ __volatile__ (#op " %" #regs ", %" #regd)
+
+#define mmx_r2ir(op, rs1, rs2) \
+ __asm__ __volatile__ (#op " %%" #rs1 ", %%" #rs2 \
+ : /* nothing */ \
+ : /* nothing */ )
+
+#define mmx_m2m(op, mems, memd) \
+ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \
+ #op " %1, %%mm0\n\t" \
+ "movq %%mm0, %0" \
+ : "=X" (memd) \
+ : "X" (mems))
+
+#endif
+
+
+
+/* 1x64 MOVe Quadword
+ (this is both a load and a store...
+ in fact, it is the only way to store)
+*/
+#define movq_m2r(var, reg) mmx_m2r(movq, var, reg)
+#define movq_r2m(reg, var) mmx_r2m(movq, reg, var)
+#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd)
+#define movq(vars, vard) \
+ __asm__ __volatile__ ("movq %1, %%mm0\n\t" \
+ "movq %%mm0, %0" \
+ : "=X" (vard) \
+ : "X" (vars))
+
+
+/* 1x32 MOVe Doubleword
+ (like movq, this is both load and store...
+ but is most useful for moving things between
+ mmx registers and ordinary registers)
+*/
+#define movd_m2r(var, reg) mmx_m2r(movd, var, reg)
+#define movd_r2m(reg, var) mmx_r2m(movd, reg, var)
+#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd)
+#define movd(vars, vard) \
+ __asm__ __volatile__ ("movd %1, %%mm0\n\t" \
+ "movd %%mm0, %0" \
+ : "=X" (vard) \
+ : "X" (vars))
+
+
+
+/* 4x16 Parallel MAGnitude
+*/
+#define pmagw_m2r(var, reg) mmx_m2r(pmagw, var, reg)
+#define pmagw_r2r(regs, regd) mmx_r2r(pmagw, regs, regd)
+#define pmagw(vars, vard) mmx_m2m(pmagw, vars, vard)
+
+
+/* 4x16 Parallel ADDs using Saturation arithmetic
+ and Implied destination
+*/
+#define paddsiw_m2ir(var, rs) mmx_m2ir(paddsiw, var, rs)
+#define paddsiw_r2ir(rs1, rs2) mmx_r2ir(paddsiw, rs1, rs2)
+#define paddsiw(vars, vard) mmx_m2m(paddsiw, vars, vard)
+
+
+/* 4x16 Parallel SUBs using Saturation arithmetic
+ and Implied destination
+*/
+#define psubsiw_m2ir(var, rs) mmx_m2ir(psubsiw, var, rs)
+#define psubsiw_r2ir(rs1, rs2) mmx_r2ir(psubsiw, rs1, rs2)
+#define psubsiw(vars, vard) mmx_m2m(psubsiw, vars, vard)
+
+
+/* 4x16 Parallel MULs giving High 4x16 portions of results
+ Rounded with 1/2 bit 15.
+*/
+#define pmulhrw_m2r(var, reg) mmx_m2r(pmulhrw, var, reg)
+#define pmulhrw_r2r(regs, regd) mmx_r2r(pmulhrw, regs, regd)
+#define pmulhrw(vars, vard) mmx_m2m(pmulhrw, vars, vard)
+
+
+/* 4x16 Parallel MULs giving High 4x16 portions of results
+ Rounded with 1/2 bit 15, storing to Implied register
+*/
+#define pmulhriw_m2ir(var, rs) mmx_m2ir(pmulhriw, var, rs)
+#define pmulhriw_r2ir(rs1, rs2) mmx_r2ir(pmulhriw, rs1, rs2)
+#define pmulhriw(vars, vard) mmx_m2m(pmulhriw, vars, vard)
+
+
+/* 4x16 Parallel Muls (and ACcumulate) giving High 4x16 portions
+ of results Rounded with 1/2 bit 15, accumulating with Implied register
+*/
+#define pmachriw_m2ir(var, rs) mmx_m2ir(pmachriw, var, rs)
+#define pmachriw_r2ir(rs1, rs2) mmx_r2ir(pmachriw, rs1, rs2)
+#define pmachriw(vars, vard) mmx_m2m(pmachriw, vars, vard)
+
+
+/* 8x8u Parallel AVErage
+*/
+#define paveb_m2r(var, reg) mmx_m2r(paveb, var, reg)
+#define paveb_r2r(regs, regd) mmx_r2r(paveb, regs, regd)
+#define paveb(vars, vard) mmx_m2m(paveb, vars, vard)
+
+
+/* 8x8u Parallel DISTance and accumulate with
+ unsigned saturation to Implied register
+*/
+#define pdistib_m2ir(var, rs) mmx_m2ir(pdistib, var, rs)
+#define pdistib(vars, vard) mmx_m2m(pdistib, vars, vard)
+
+
+/* 8x8 Parallel conditional MoVe
+ if implied register field is Zero
+*/
+#define pmvzb_m2ir(var, rs) mmx_m2ir(pmvzb, var, rs)
+
+
+/* 8x8 Parallel conditional MoVe
+ if implied register field is Not Zero
+*/
+#define pmvnzb_m2ir(var, rs) mmx_m2ir(pmvnzb, var, rs)
+
+
+/* 8x8 Parallel conditional MoVe
+ if implied register field is Less than Zero
+*/
+#define pmvlzb_m2ir(var, rs) mmx_m2ir(pmvlzb, var, rs)
+
+
+/* 8x8 Parallel conditional MoVe
+ if implied register field is Greater than or Equal to Zero
+*/
+#define pmvgezb_m2ir(var, rs) mmx_m2ir(pmvgezb, var, rs)
+
+
+/* Fast Empty MMx State
+ (used to clean-up when going from mmx to float use
+ of the registers that are shared by both; note that
+ there is no float-to-xmmx operation needed, because
+ only the float tag word info is corruptible)
+*/
+#ifdef XMMX_TRACE
+
+#define femms() \
+ { \
+ fprintf(stderr, "femms()\n"); \
+ __asm__ __volatile__ ("femms"); \
+ }
+
+#else
+
+#define femms() __asm__ __volatile__ ("femms")
+
+#endif
+
+#endif
+
diff --git a/src/visualizations/Goom/goom2k4-0/test/testapp.c b/src/visualizations/Goom/goom2k4-0/test/testapp.c
new file mode 100644
index 0000000000..6d24676472
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/test/testapp.c
@@ -0,0 +1,17 @@
+#include <goom/goom.h>
+#include <stdio.h>
+
+gint16 data[2][512];
+
+int main()
+{
+ int i;
+ PluginInfo *goom;
+ goom = goom_init (640, 480);
+ for (i = 0; i<100; i++)
+ {
+ fprintf(stderr,"*");
+ goom_update (goom, data, 0, -1, 0, 0);
+ }
+ return 0;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/tools/Makefile.devel b/src/visualizations/Goom/goom2k4-0/tools/Makefile.devel
new file mode 100644
index 0000000000..00f414d2dc
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/tools/Makefile.devel
@@ -0,0 +1,5 @@
+minicompress:minicompress.c
+ gcc -o minicompress -Wall minicompress.c
+
+clean:
+ rm -f *~ *.o minicompress
diff --git a/src/visualizations/Goom/goom2k4-0/tools/gfont.c b/src/visualizations/Goom/goom2k4-0/tools/gfont.c
new file mode 100644
index 0000000000..71440bb3f8
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/tools/gfont.c
@@ -0,0 +1,3483 @@
+/* GIMP RGBA C-Source image dump (gfont.c) */
+
+static const struct {
+ unsigned int width;
+ unsigned int height;
+ unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */
+ char *comment;
+ unsigned char pixel_data[1277 * 21 * 4];
+} the_font = {
+ 1277, 21, 4,
+ "Created with The GIMP",
+ "y\21\244\377y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0y\21\244"
+ "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377"
+ "y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244"
+ "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21"
+ "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377"
+ "y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21"
+ "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21"
+ "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21"
+ "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244"
+ "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244"
+ "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377"
+ "y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0"
+ "\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21"
+ "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21"
+ "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21"
+ "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21"
+ "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244"
+ "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244"
+ "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244"
+ "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377"
+ "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21"
+ "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244"
+ "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21"
+ "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21"
+ "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21"
+ "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21"
+ "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21"
+ "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244"
+ "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21"
+ "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244"
+ "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21"
+ "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21"
+ "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244"
+ "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244"
+ "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244"
+ "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21"
+ "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244"
+ "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21"
+ "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244"
+ "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244"
+ "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244"
+ "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244"
+ "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21"
+ "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21"
+ "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21"
+ "\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21"
+ "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21"
+ "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244"
+ "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21"
+ "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21"
+ "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244"
+ "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244"
+ "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244"
+ "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21"
+ "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21"
+ "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21"
+ "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21"
+ "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244"
+ "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0"
+ "y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377y\21\244"
+ "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244"
+ "\377y\21\244\377\15\4\21\0\15\4\21\0\15\4\21\0\20\5\26\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26"
+ "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4"
+ "\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23"
+ "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23"
+ "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20"
+ "\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23"
+ "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4"
+ "\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26"
+ "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26"
+ "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0"
+ "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16"
+ "\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26"
+ "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20"
+ "\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0"
+ "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0"
+ "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26"
+ "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0"
+ "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0"
+ "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26"
+ "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16"
+ "\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0"
+ "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0"
+ "\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\20\5\26\0\16\4\23\0\15\4\21\0\15\4\21\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\10\6\3""9\12\10\5U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""6\11\10\4`\11"
+ "\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4O\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\10\6\3""3\12\10\5U\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\10\6\3U\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9"
+ "\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\5\4\2\16\10\6\3U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\10\6\3J\11\7\4q\10\6\3\247\10\6\3\213\11\7\4U\5\4\2\16\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\10\4"
+ "n\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\24\11\7\4"
+ "U\11\10\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4""9\11\10\4U\6\5\3""0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\21\10"
+ "\6\3U\11\7\4R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\11"
+ "\7\4]\10\6\3\231\10\6\3\241\10\6\3n\11\10\4U\10\6\3U\6\5\3\37\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\12\10"
+ "\5U\12\7\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\5\4\2""9\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6"
+ "\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2"
+ "*\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3"
+ "G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\11\10\4U\11\7\4J\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\10\6\3*\11\7\4U\10\6\3U\11\7\4U\10\6\3}\10\6\3\252\7\6\4"
+ "\252\11\7\4\252\14\11\7\252\23\16\12\252\23\15\12\216\10\6\5\34\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\5\4\2""3\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10"
+ "\6\3\244\10\6\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12"
+ "\10\5""9\11\7\4\252\10\6\3\252\10\6\3\252\10\6\3\241\10\6\3\216\11\7\4`\11"
+ "\7\4U\10\6\3U\11\7\4U\11\7\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4"
+ "\2*\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5"
+ "\3L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14"
+ "\11\7\252\17\13\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10\7\241"
+ "\12\10\7U\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3"
+ "J\11\10\4U\10\6\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\7\6\4\34\11\7\4U\11\7\4U\5\4\2\21\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2*\10\6\3U\11"
+ "\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3U\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5U\12\10\7\205\14\11\7\252\17\12"
+ "\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10\7\226\10\6\5>\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14\11\7\252"
+ "\17\12\10\252\16\12\7\252\11\7\4\252\10\6\5\223\12\10\5U\7\6\4U\5\4\4\3\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7""9\13\10\6\241\11\7\6\252\12\10\7"
+ "\252\15\12\10\252\16\12\7\252\15\12\10\252\14\11\7\252\12\10\7\234\12\10"
+ "\7U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\7\5U\11"
+ "\7\4n\11\7\4\252\12\10\5\252\12\10\5\252\13\10\6\252\12\10\7\226\12\10\7"
+ "U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10""9\13\10\6\252\11\7\6"
+ "\252\12\10\7\252\15\12\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10"
+ "\7\237\12\10\7U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10;\13\11"
+ "\6\252\11\7\4}\12\10\5U\10\6\3\205\10\6\3\247\10\6\3\252\10\6\3\252\11\10"
+ "\4q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3*\12\10\5U\12\7\5U\11\7\4}\12\10"
+ "\5\252\14\12\7\252\16\13\7\252\23\16\12\252\23\16\12\216\10\6\5\34\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14\11\7\252\17\13\10\252\17"
+ "\13\10\252\17\13\10\252\15\12\10\252\12\10\7\241\12\10\7U\6\5\5\31\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7J\16\12\7\252\14\11\7\213\7\6\4\34\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7n\16\12\7\252\15\12\10}\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\15\12\10G\17\13\10\252\15\12\10\202\5\5\4\10\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\13\10\6U\11\7\4\252\12\10\5]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11"
+ "\7""9\12\10\5\247\13\10\6n\6\5\3\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10"
+ "\6""9\12\7\5\237\13\10\6f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""3\12\10"
+ "\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\12\7\5""9\13\11\6U\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\12\10\5U\13\10\6U\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\5\4\2-\10\6\3U\11\7\4U\11\7\4X\11\7\4l\11\10\4]\11\7\4U\10\6\3U\6\5"
+ "\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3-\11\7\4U\10\6\3U\11\7"
+ "\4U\10\6\3}\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3J\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\7\5U\12\10\5U\11\7\4w\10\6\3"
+ "\216\11\7\4\202\12\10\5[\12\7\5U\6\5\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\11\7\4""9\12\10\5U\12\7\5U\12\10\5U\10\6\3\220\10\6\3\252\10\6\3\244"
+ "\10\6\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5"
+ "\4\2-\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\11\7\4i\10\6\3U\6"
+ "\5\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\4;\11\7\4\252\10\6\3"
+ "\244\11\7\4[\10\6\3U\10\6\3U\10\6\3U\11\7\4U\10\6\3\216\11\6\4\252\11\10"
+ "\4t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10"
+ "\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6"
+ "\3""6\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9"
+ "\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\12\7\5\231\12"
+ "\10\5]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7]\16\13\7\252\15\12"
+ "\10\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6[\13\10\6\252\11\7\4\252\11"
+ "\7\4\252\10\6\5\252\10\6\3w\11\7\4U\10\6\3U\10\6\3U\11\7\4U\11\7\4L\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3*\11\7\4U\10\6\3U\10\6\3z\11\10\4f\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""3\11\7\4U\6\5\3-\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\10\5""9\10"
+ "\6\3\234\12\7\5]\13\10\6U\13\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\6\5\5\16\15\12\10U\10\7\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\12"
+ "\7\5\234\12\10\5`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4""9\12\10\5]\12\10\5U\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7n\15\12\10\252\14\11"
+ "\7\205\5\5\4\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5O\12\10\7\177\15\12\10\252\20"
+ "\14\11\216\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\10\6\3""9\12\10\5U\11\6\4U\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17"
+ "\13\10q\31\22\14\252\24\17\13\216\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10\202\26\20\13\252\24\17\13\216\7\6\6\27"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10D\14\11\7\252\13\10\6t\6\5\3\10\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\14\11\7R\17\12\10\252\15\12\10\202\5\5\4\10\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\6\10\6\3U\10\6"
+ "\3\234\11\10\4q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""0\11\10\4[\11\7\4"
+ "L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\11\6\4\252\10\6\3c\5\4\2\"\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10"
+ "\6\3G\11\10\4]\11\10\4`\10\6\3U\6\5\3-\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3L\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X-\13\377\14\12\5q\0\0\0\0\7"
+ "\6\4\34""6\35\11\377].\14\377X-\13\377\14\11\5z\0\0\0\0\7\5\4%6\35\11\377"
+ "].\14\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3U:\37"
+ "\11\377]2\14\377X,\13\377\11\7\4\252\0\0\0\0\5\4\2U4\34\11\377]0\14\377X"
+ ",\13\377\14\12\5\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\0\0"
+ "\0\0\0\0\0\0\7\6\4U:\37\11\377]2\14\377X-\13\377\14\11\5\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\10\6\3""9:\37\11\377]2\14\377X-\13\377"
+ "\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23\14\6\343"
+ "L%\13\377X-\13\377\16\12\5\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\252"
+ "E#\12\377\\/\13\377\\/\13\377X-\13\377X-\13\377\20\13\5\343\7\5\4\34\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377"
+ "].\14\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23"
+ "\14\6\343R'\13\377\\/\13\377\16\12\5i\0\0\0\0\0\0\0\0\7\5\4\24""6\35\11\377"
+ "d2\15\377\36\23\7\377\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\6\5\3\34\23\14\6\343L%\13\377X-\13\377\16\12\5\202\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\7\6\4A\21\13\6\343G%\12\377X-\13\377\\/\13\377\\/\13\377X-\13\377"
+ "X,\13\377X,\13\377\31\20\6\377\10\6\3\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\7\5\4U\21\14\6\345M'\14\377k3\16\377q7\20\377\24\16\11\262"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\35\22"
+ "\10\377J'\13\377X-\13\377X-\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377"
+ ")\27\10\377\14\11\5\343\5\5\4\27\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\32\21"
+ "\6\377J'\13\377X-\13\377X-\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377)"
+ "\30\10\377\14\11\5\343\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3U\20\13\5\343G%\12\377X-\13\377X,\13"
+ "\377\14\12\5q\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11\377\\/\13\377X,\13\377X"
+ "-\13\377\\.\15\377d4\15\377m5\20\377y?\24\377\236J\27\377\264X\33\377\267"
+ "Z\34\377\32\21\13\216\0\0\0\0\0\0\0\0\0\0\0\0\12\7\5\252\32\21\6\377J'\13"
+ "\377X-\13\377\\/\13\377\\/\13\377\\/\13\377X-\13\377X-\13\377)\30\10\377"
+ "\14\11\5\343\6\5\3\34\0\0\0\0\0\0\0\0\7\6\4\10=\40\12\377f3\15\377\\.\15"
+ "\377\\.\15\377\\.\15\377\\.\15\377\\.\15\377Z-\13\377T,\13\377X-\13\377X"
+ ",\13\377\16\12\5w\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\231\32\21\6\377J'\13\377"
+ "X-\13\377\\/\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377-\31\10\377\15\12"
+ "\6\343\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\21\15\12\252@'\25\377\233N\32\377"
+ "\251S\32\377\245P\30\377\241O\30\377\221G\26\377\210F\25\377\206E\25\377"
+ "X2\27\377\26\21\13\350\11\10\6\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\27\14\11\5"
+ "\255G\"\12\377\\+\15\377!\24\10\377\12\10\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\16\7\343S*\14\377\\.\15\377\23\15\6\343"
+ "\6\5\3\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\12\10\5\252\32\21\6\377L%\13\377Z.\13\377\\.\15\377\\.\15\377Z-\13\377Z"
+ "-\13\377X,\13\377.\32\11\377\22\15\11\343\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\17\14\10\252:#\23\377\206I\27\377\231L\30\377\216E\25\377\203@\24\377"
+ "y;\22\377y;\22\377y>\22\377+\33\14\377\13\11\6\252\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\21\15\12\252@'\25\377\244U\33\377\261V\32\377\232K\27\377y>\22"
+ "\377s8\20\377w=\22\377{=\24\377P-\23\377\26\20\13\343\10\7\5\34\0\0\0\0\0"
+ "\0\0\0\15\12\10""9`0\23\377\245P\30\377\237N\30\377\237N\30\377\245P\30\377"
+ "\245P\30\377\245P\30\377\237N\30\377\244Q\31\377[4\30\377\26\21\13\343\10"
+ "\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10\252&\30\13\377c/\20\377t;\21\377"
+ "~A\25\377\216E\25\377\231L\30\377\235J\30\377\233L\30\377[4\30\377\27\22"
+ "\14\343\10\7\5\34\0\0\0\0\0\0\0\0\15\12\10""9h4\25\377\253T\32\377\233L\30"
+ "\377\244Q\31\377\255Q\32\377\264X\33\377\264X\33\377\261V\32\377\251P\32"
+ "\377\\7\31\377\26\21\13\343\10\7\5\34\0\0\0\0\0\0\0\0\15\12\10""9r?\31\377"
+ "\261V\32\377r8\21\377\\.\15\377\\/\13\377].\14\377\\.\15\377`0\15\377\\."
+ "\15\377\22\14\5[\0\0\0\0\0\0\0\0\10\6\3(7\35\12\377l2\17\377r8\21\377\202"
+ "C\25\377\231L\30\377\241R\30\377\253T\32\377\263T\32\377\263T\32\377\31\21"
+ "\12\216\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\252@'\25\377\242T\33\377\263X\34"
+ "\377\267Z\34\377\265Y\34\377\265Y\34\377\254X\33\377\234M\31\377X2\27\377"
+ "\26\21\13\343\10\7\5\34\0\0\0\0\0\0\0\0\15\11\6""9`0\23\377\231G\26\377\206"
+ "E\25\377\24\16\11\301\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6q|>\31\377\271[\34\377"
+ "\251P\32\377\26\17\11\216\0\0\0\0\0\0\0\0\13\10\6""9o=\30\377\270Z\33\377"
+ "\261V\32\377\27\20\12\255\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6qr;\27\377\220I\25\377~?\25\377\24"
+ "\16\11\216\0\0\0\0\0\0\0\0\13\11\6""9a3\24\377\230G\27\377\206E\25\377\24"
+ "\16\11\273\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7`a0\22\377\214G\25\377\212G\25"
+ "\377\24\17\11\216\0\0\0\0\0\0\0\0\10\6\3(4\34\11\377]2\14\377X-\13\377\16"
+ "\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\15\12\10R[0\20\377\204G\25\377?$\22\377\12\10\7\210\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\7\6\6>\37\25\14\364|B\27\377\206E\25\377\24\17\11\216"
+ "\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11\377].\14\377P'\13\377\16\12\5\216\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X,\13\377\16\12\5t\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\11\7\4\231\32\21\6\377J'\13\377X-\13\377X-\13\377X-"
+ "\13\377X-\13\377X,\13\377X,\13\377)\27\10\377\14\11\5\343\5\4\4\21\0\0\0"
+ "\0\0\0\0\0\10\6\3\"6\35\11\377\\+\13\377X,\13\377X-\13\377\\+\13\377\\/\13"
+ "\377\\/\13\377X-\13\377X,\13\377-\31\10\377\14\12\5\343\6\5\3\34\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\15\12\6\252(\30\13\377a0\20\377q7\20\377s8\20\377t9\21\377"
+ "t9\21\377q7\20\377q7\20\377<!\15\377\22\16\11\343\10\6\5\34\0\0\0\0\0\0\0"
+ "\0\14\11\7""9M&\16\377v9\21\377t;\21\377v<\21\377m5\20\377b/\15\377\\/\13"
+ "\377X-\13\377X,\13\377)\27\10\377\14\11\5\343\6\5\3\34\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\12\10\5\252\34\22\7\377L%\13\377Z-\13\377\\.\15\377^-\15\377^-\15"
+ "\377\\.\15\377\\.\15\377.\32\11\377\15\12\6\343\6\5\5\34\0\0\0\0\0\0\0\0"
+ "\7\6\4\10=\40\12\377d2\15\377\\.\15\377\\.\15\377\\.\15\377\\.\15\377\\."
+ "\15\377\\.\15\377^/\15\377b1\15\377^/\15\377\22\14\5]\0\0\0\0\0\0\0\0\10"
+ "\6\3*<\40\11\377`0\15\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\10"
+ "\6\3""9:\37\11\377]2\14\377X,\13\377\14\12\5q\0\0\0\0\0\0\0\0\10\6\3\34""6"
+ "\35\11\377]2\14\377X,\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9"
+ ":\37\11\377]2\14\377X,\13\377\14\12\5q\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11"
+ "\377]2\14\377X,\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\10\6\3""9:\37\11\377]2\14\377X,\13\377\14\12\5q\0\0\0\0\0\0\0\0\7\6\4"
+ "\34""6\35\11\377]2\14\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\10"
+ "\7\3""9<\37\11\377`0\15\377\\.\15\377\16\12\5\177\0\0\0\0\0\0\0\0\12\10\5"
+ """9R*\17\377\207B\24\377y<\24\377\24\17\11\260\0\0\0\0\0\0\0\0\0\0\0\0\13"
+ "\11\6lk8\26\377\254T\31\377\236J\27\377\26\17\11\216\0\0\0\0\0\0\0\0\13\10"
+ "\6""6b3\23\377\216H\25\377\210F\25\377\212G\25\377y;\22\377d4\15\377Z.\13"
+ "\377X,\13\377X,\13\377X,\13\377X-\13\377\14\12\5q\0\0\0\0\0\0\0\0\10\6\3"
+ "\34""6\35\11\377\\/\13\377X,\13\377\\/\13\377\\/\13\377\22\14\5U\0\0\0\0"
+ "\0\0\0\0\7\6\4-6\36\11\377^/\15\377\37\24\10\377\11\7\4U\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""0A!\12\377r7\17"
+ "\377w:\22\377~?\25\377\200B\25\377\26\17\11\244\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\5\5\4\34\23\16\12\343\215H\32\377+\33\20\377\7\6\6U\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12"
+ "\7G`1\21\377\212G\25\377\202C\25\377\26\17\11\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7LM'\16\377v9\21\377m5\20"
+ "\377\26\17\11\231\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6"
+ "`g5\24\377\220I\25\377y<\24\377\30\20\11\231\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\270"
+ "=$\24\377\215D\30\377\250R\31\377\253T\32\377\32\22\13\237\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4""9<\40\11\377`"
+ "0\15\377\\.\15\377\23\14\6\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\7L\201C\32\377\276a\35\377\264"
+ "X\33\377\32\21\13\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\16"
+ "\12\7U\201C\32\377\276a\35\377\264X\33\377\31\21\12}\0\0\0\0\0\0\0\0\13\10"
+ "\6""9m<\30\377\257V\32\377\216I\27\377\24\16\11\273\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7]yA\30"
+ "\377\267Y\32\377\250R\31\377\25\17\12\262\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\12\10\5\252'\27\10\377N)\13\377\20\13\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3U\20\13\5\343G%\12\377"
+ "\\/\13\377\\/\13\377\22\14\5U\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11\377].\14"
+ "\377X-\13\377\14\12\5q\0\0\0\0\0\0\0\0\0\0\0\0:\37\11\377]2\14\377X-\13\377"
+ "\31\21\6\377\10\6\3\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4"
+ "\4\3\31\12\10\5\255A!\12\377\\.\15\377\\.\15\377C\"\12\377\33\22\10\377\11"
+ "\7\4\234\3\3\2U\12\10\5\270E#\12\377\23\15\6\223\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4qp7\15\377"
+ "\215E\20\377\215K\20\377\22\15\5\252\0\0\0\0\10\6\3Un6\15\377\217L\20\377"
+ "\213D\20\377\23\15\6\252\0\0\0\0\10\6\3Un6\15\377\217L\20\377\215H\20\377"
+ "\27\17\6\252\0\0\0\0\0\0\0\0\0\0\0\0\12\11\5n#\25\10\377\201?\16\377\215"
+ "E\20\377\213D\20\3774\33\11\377\11\7\4\377\33\21\10\377\207B\20\377\232K"
+ "\21\377\233O\22\377[2\20\377\24\17\11\317\12\11\7\34\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\5\4\4\24\10\6\3\177\37\24\10\377\202B\17\377\217L\20\377\217"
+ "L\20\377C\"\12\377\12\10\5\327\12\10\5\252\15\12\6\216\7\5\4\27\0\0\0\0\0"
+ "\0\0\0\14\11\5Us;\16\377\225H\20\377\217L\20\377\22\14\5\353\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\7\6\4\34\16\12\5\343\\.\15\377\217I\20\377\217F\20\377"
+ "\22\15\5\252\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\2525\34\12\377r8\15\3778\35"
+ "\11\377\20\13\5\377\"\24\7\377p7\15\377W*\14\377\23\15\6\353\10\7\5(\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5Ur8\15\377\217F\20\377"
+ "\215H\20\377\27\17\6\252\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\34\16\12\5\343Z,\15"
+ "\377p9\15\377/\32\10\377\13\10\4""9\0\0\0\0\0\0\0\0\0\0\0\0\31\20\6\343`"
+ "0\15\377p9\15\377\32\20\7\377\10\6\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\15\12\6U\10\7\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6"
+ "\5\3\34\17\13\6U\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4i\12\10\5\252\12\10\5\202\6\5\3\27\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\10\6\3\210M'\14\377\217I\20\377\213J\20\377\22\14\5\252"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\25\16\6\343p9\15\377\215E\20\377P(\13\377\20\13"
+ "\5\377\16\12\5\343\22\15\5\377H#\13\377\210E\17\377\202B\17\377.\32\11\377"
+ "\10\6\3i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""9*\33\15\377\226O\25\377"
+ "\270^\25\377\303c\26\377\307j\30\377\32\22\13\377\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7cS-\22\377\220J\21\377\217F\20\377^/\15\377"
+ "\22\15\5\377\20\13\5\255\16\12\5\3434\33\11\377\204C\17\377\213D\20\377K"
+ "'\14\377\12\7\5t\0\0\0\0\0\0\0\0\6\5\3""94\33\11\377\211I\20\377\217L\20"
+ "\377^/\15\377\22\15\5\377\20\13\5\255\16\12\5\3434\33\11\377\204C\17\377"
+ "\213J\20\377K'\14\377\12\10\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5U\26\17\7\377f3\15\377\211C\20\377\214G\17"
+ "\377\215K\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11\6\4Ul7\15\377\215E\20\377"
+ "\213J\20\377J$\13\377\22\14\7\377\24\15\7\265\26\17\11\317\24\15\11\356\22"
+ "\15\11\374\27\20\12\377\37\25\14\332\16\13\7*\0\0\0\0\0\0\0\0\7\6\4""9(\26"
+ "\11\377\202B\17\377\215K\20\377T*\13\377\22\14\5\377\20\14\5\265\16\12\5"
+ "\361E#\12\377\214E\21\377\232N\21\377u<\22\377\21\15\10\216\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\25\16\10\276\34\22\11\377\27\17\10\377\25\16\10\377\25\16\10\377"
+ "\27\17\10\377&\30\13\377b5\21\377\227J\22\377\226L\21\377\215K\20\377\25"
+ "\17\6\252\0\0\0\0\0\0\0\0\5\4\2\34!\24\10\377\202B\17\377\215H\20\377T*\13"
+ "\377\22\14\5\377\22\14\5\260\16\12\5\3539\35\12\377\214H\21\377\245U\24\377"
+ "yC\30\377\16\13\7\216\0\0\0\0\0\0\0\0\10\6\5""9H.\27\377\306q\35\377\310"
+ "f\27\377\203D\26\377!\25\14\377\21\15\10\377\25\16\10\377X/\23\377\300c\27"
+ "\377\313q\32\377\222W\35\377\15\13\10\244\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5"
+ "U\15\12\6\252\13\11\6\216\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10q\22\16"
+ "\11\252\20\15\11\223\12\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\12\10\7\34\24\17\13\343h>\25\377\270^\25\377u>\26\377\21\14\10\343"
+ "\7\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6"
+ "\252C#\20\377\244U\25\377s:\20\377\24\16\7\374\10\6\5U\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4RB%\15\377\221K\22\377\232N\21\377s"
+ ":\20\377\35\22\10\377\16\12\7\377\20\13\7\377A\"\14\377\226J\23\377\275a"
+ "\26\377\212O\33\377\16\14\11\216\0\0\0\0\0\0\0\0\7\6\6""97!\20\377\236Q\23"
+ "\377\242P\23\377f5\21\377\30\17\7\377\23\14\6\252\16\12\5\314.\32\11\377"
+ "\211C\20\377\213G\20\3771\33\12\377\7\6\4i\0\0\0\0\0\0\0\0\7\6\6>H.\27\377"
+ "\307s\40\377\315o\34\377\233T\32\377)\30\16\377\22\15\11\377\31\20\12\377"
+ "n=\31\377\307d\34\377\315p\36\377\222W\35\377\15\13\10\216\0\0\0\0\0\0\0"
+ "\0\12\10\7\223\264W\31\377\316o\33\377\313i\32\377\244U\33\377(\30\17\377"
+ "\24\16\11\377\32\21\13\377y@\32\377\311e\34\377\315p\36\377\222W\35\377\16"
+ "\13\7\216\0\0\0\0\0\0\0\0\10\6\5""9G,\26\377\300l\31\377\306e\27\377\226"
+ "N\31\377)\30\16\377\40\25\15\377J)\25\377\270i\33\377\312h\31\377\312v\33"
+ "\377\256f\37\377\21\16\12\216\0\0\0\0\0\0\0\0\13\11\6\210\266\\\31\377\316"
+ "p\35\377\315o\34\377\246O\33\377+\31\20\377\25\17\12\377\35\23\14\377tC\33"
+ "\377\312k\37\377\316q\37\377\222W\35\377\14\12\7\216\0\0\0\0\0\0\0\0\13\10"
+ "\6\220\271]\32\377\312g\27\377\235M\22\377S*\14\377\23\15\6\377\15\12\6\377"
+ "\24\15\7\377\33\21\10\377\34\22\11\343\12\10\5-\0\0\0\0\0\0\0\0\13\11\6\216"
+ "\213I\24\377\306`\25\377\307j\30\377\233N\32\377)\31\16\377\25\17\12\377"
+ "\34\22\13\377&\30\17\377(\30\17\343\16\12\7>\0\0\0\0\0\0\0\0\10\7\5""9A)"
+ "\24\377\305l\34\377\315o\34\377\252X\33\377+\33\20\377\23\16\12\377\35\23"
+ "\14\377{B\30\377\265T\24\377\252W\23\377r<\21\377\13\12\6\216\0\0\0\0\0\0"
+ "\0\0\13\11\6Uw<\17\377\232K\21\377\232N\21\377\22\15\7\377\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\15\12\10\252\277f\36\377\321v\36\377\317q\36\377\34\23\13\311"
+ "\0\0\0\0\0\0\0\0\15\12\10i\246W\27\377\306e\27\377\306a\27\377\32\22\13\377"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\15\12\10\252\275d\34\377\316o\33\377\314f\33\377\34\24\13\311\0"
+ "\0\0\0\0\0\0\0\14\12\7t\270]\33\377\316k\33\377\313q\32\377\27\21\12\377"
+ "\0\0\0\0\0\0\0\0\6\5\5\34\31\22\14\364\300i\33\377\316p\35\377\317u\36\377"
+ "\40\26\15\252\0\0\0\0\0\0\0\0\13\11\6Xp9\15\377\217F\20\377\215E\20\377\21"
+ "\14\6\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\16\13\11\252\270\\\31\377\316o\33\377\300o\37\3771!\22\377\12\10\7z\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\7\7\6;\26\20\13\350\247d\34\377\315p\36\377\315t\36"
+ "\377\32\22\13\322\0\0\0\0\0\0\0\0\10\7\3Un6\15\377\215E\20\377\215K\20\377"
+ "\31\20\6\377\5\4\4(\0\0\0\0\0\0\0\0\12\10\5Up7\15\377\215K\20\377\215K\20"
+ "\377\24\15\5\252\0\0\0\0\0\0\0\0\5\4\2\34!\24\10\377\202B\17\377\215H\20"
+ "\377p7\15\377-\31\10\377\32\21\6\377!\24\10\377^/\15\377\215E\20\377\220"
+ "G\21\377P(\15\377\11\7\4}\0\0\0\0\0\0\0\0\12\10\5Up9\15\377\224O\21\377\215"
+ "K\20\377W*\14\377\23\15\6\377\16\12\5\327\17\12\6\377<\37\13\377\217G\22"
+ "\377\240R\23\377`6\21\377\14\11\7\216\0\0\0\0\0\0\0\0\10\6\5""9G,\26\377"
+ "\300d\31\377\307j\30\377\271]\32\377[2\26\377:!\21\377H)\23\377\236Q\31\377"
+ "\307j\30\377\307j\30\377\212O\33\377\15\13\10\216\0\0\0\0\0\0\0\0\12\10\7"
+ "\223\246W\27\377\313l\30\377\312l\31\377\231M\32\377&\26\15\377\17\13\6\377"
+ "\16\12\5\3774\34\11\377\204F\17\377\215K\20\377P)\15\377\12\10\5\213\0\0"
+ "\0\0\0\0\0\0\7\6\6""90\35\15\377\232O\23\377\240U\23\377l8\21\377\36\22\11"
+ "\377\20\13\7\377\30\17\11\377`3\21\377\247V\24\377\265X\24\377\214K\27\377"
+ "\22\16\11\220\0\0\0\0\0\0\0\0\0\0\0\0\26\16\7\301\26\15\7\377\24\15\7\377"
+ "N(\17\377\245Q\24\377\261Z\24\377\261Z\24\377s:\24\377\40\24\13\377\30\17"
+ "\11\377\36\23\11\343\13\10\6""6\0\0\0\0\0\0\0\0\13\11\6\216\213D\24\377\246"
+ "N\23\377\220G\21\377\23\14\6\327\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\210r8\15"
+ "\377\217F\20\377\213D\20\377\23\15\6\252\0\0\0\0\0\0\0\0\12\7\5Up7\15\377"
+ "\217F\20\377\213J\20\377\21\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\210r"
+ "8\15\377\217F\20\377\215K\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11\6\4Un6\15"
+ "\377\215E\20\377\215H\20\377\21\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\11\7\4\210r8\15\377\217I\20\377\213J\20\377\23\15\6\252\0\0\0\0"
+ "\0\0\0\0\10\6\3Un6\15\377\217L\20\377\215E\20\377\22\14\5\374\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\13\11\6\252\203E\22\377\252W\23\377\250V\23\377\34\23\11\252"
+ "\0\0\0\0\0\0\0\0\13\10\6U\221J\32\377\314f\33\377\313i\32\3774!\21\377\6"
+ "\5\5""9\0\0\0\0\0\0\0\0\21\16\12\343\276k\31\377\314q\31\377\256V\33\377"
+ "\22\15\11\252\0\0\0\0\0\0\0\0\0\0\0\0\34\22\13\306%\27\16\377\40\25\15\377"
+ "\25\17\12\377\24\16\11\377&\27\13\377W,\14\377\211F\20\377\215H\20\377\217"
+ "F\20\377\215H\20\377\22\14\5\252\0\0\0\0\0\0\0\0\11\6\4Un6\15\377\221J\20"
+ "\377\215E\20\377^/\15\377\33\21\10\343\14\10\5\34\0\0\0\0\0\0\0\0\16\12\7"
+ "Uy>\22\377\254W\23\377\213E\22\377\24\17\11\343\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\16\10\343u=\30\377\307"
+ "d\34\377\315j\32\377\314n\33\377\32\22\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\10\7\5\34\24\17\13\343\207I\26\377\300a\25\377\245S\26\377!\26\14\377"
+ "\12\11\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\13\11\6\252\270a\33\377\316p\35\377\314n\33\377\34\23\13\377\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\263]\30"
+ "\377\312g\27\377\306a\27\377\26\17\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\11\7\6\252}?\22\377\236M\21\377\222K\21\377\21\14\6\377"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\10\6\5LH.\27\377\305l\34\377\311k\30\377\244U\33\377%\26\16\343"
+ "\15\11\6""0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\14\11\7\252\212C\23\377\252O\23\377\250V\23\377\24\16\11\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10"
+ "\7\5\24\25\17\12\270\32\21\13\377\32\21\13\327\14\11\7J\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\24\25\17\12\270\32\21\13\377\37\25"
+ "\14\317\22\15\11\34\0\0\0\0\0\0\0\0\13\11\10\234\270]\33\377\320i\35\377"
+ "\315o\34\377\34\23\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\270\\\31\377\313h\30\377\310"
+ "b\27\377\32\22\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""93\35\14\377\230K\23"
+ "\377\242V\23\377\23\15\10\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23\15\6\371\\.\15\377{?\16\377N'\13\377\25"
+ "\17\6\343\11\10\4\34\0\0\0\0\0\0\0\0\11\10\4Un;\15\377\215E\20\377\215K\20"
+ "\377\25\16\6\252\0\0\0\0\0\0\0\0\0\0\0\0\20\13\5\2524\34\11\377s;\16\377"
+ "t<\17\377+\32\12\377\11\7\6}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\34\25"
+ "\21\12\343m;\22\377\240R\23\377y@\22\377>\"\15\377^5\21\377\225N\24\377f"
+ "6\23\377\40\26\13\377H'\17\377y>\22\377\30\21\11\273\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3\247\200"
+ "B\17\377\241U\21\377\237Q\22\377\30\17\7\262\0\0\0\0\6\5\3%0\34\13\377\255"
+ "\\\24\377\265`\24\377\25\17\10\335\0\0\0\0\6\5\3\34(\30\11\377\217J\22\377"
+ "\236P\21\377\25\17\6\265\0\0\0\0\0\0\0\0\12\10\5""6k3\16\377\235S\22\377"
+ "\244T\23\377\260Y\23\377\275\\\24\377\277b\26\377\276j\27\377\305n\32\377"
+ "\313l\30\377\313u\30\377\315w\32\377\317z\36\377\307v\40\377\40\27\15\252"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U\26\17\7\350q6\16\377\222K\21\377\236P\21"
+ "\377\232N\21\377\236P\21\377\224L\21\377\213G\20\377\207B\20\377\207B\20"
+ "\377\25\16\6\210\0\0\0\0\0\0\0\0\12\10\5U\200B\17\377\241U\21\377\236P\21"
+ "\377\31\20\6\314\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\34\31\20\10\343f2\17\377\224"
+ "L\21\377\216I\21\377T-\15\377\12\10\5q\0\0\0\0\0\0\0\0\11\7\4Rk5\16\377\222"
+ "K\21\377T)\15\377\10\7\5\306\3\2\2\27\5\4\4\210&\27\11\377\210F\21\377\214"
+ "H\21\377\25\17\6\262\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6"
+ "\4""9-\32\12\377\217J\22\377\236P\21\377\32\21\6\252\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\30\20\7\343s:\20\377\224L\21\377.\32\11\377\7\6\4\234\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\5\4\4G\23\15\6\377\213G\20\377\214H\21\377+\32\12\377"
+ "\11\10\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5Um4\16\377&\27\11\377\6"
+ "\5\3U\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\34\17\14\6\343s8\20\377\35\23\10\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\0\0\0\0\0\0\0\0\15\12\6"
+ "qz@\25\377\244U\25\377\212G\21\377\25\17\6\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15"
+ "\12\6\343\211C\20\377\232K\21\377T-\15\377\12\10\5t\0\0\0\0\0\0\0\0\11\7"
+ "\4Uo7\16\377\236W\21\377\236P\21\377\23\15\6\377\4\4\3\34\0\0\0\0\3\3\2q"
+ "\21\14\6\377\213G\20\377\241U\21\377\222K\21\377\24\16\7\322\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\20\15\11n\270i\33\377\321{\36\377\322|\37\377\320{\37"
+ "\377\317z\36\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\15\13\10\223\217K\24\377\241U\21\377\236P\21\377\33\22\10\343\5\4\2"
+ "\34\0\0\0\0\0\0\0\0\12\7\5\306\203A\20\377\241U\21\377\226L\21\377\25\16"
+ "\6\252\0\0\0\0\0\0\0\0\12\10\5U{=\20\377\243S\22\377\236P\21\377\33\22\10"
+ "\343\5\4\2\34\0\0\0\0\0\0\0\0\11\7\4\306\202B\17\377\243S\22\377\224L\21"
+ "\377\25\16\6\301\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\7\6\4U\26\17\7\377\203A\20\377\232N\21\377\232N\21\377\232N\21\377\232N"
+ "\21\377\25\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\243V\22\377\264"
+ "[\23\377\35\24\12\377\3\3\2]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5zy<\20\377\241U\21\377\237Q\22\377\30"
+ "\17\7\377\4\4\3\"\0\0\0\0\2\2\1\6\21\15\10\265\265]\26\377\313l\30\377\315"
+ "r\32\377\40\27\15\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\5\4\4\241\36\26\15\377\306t\35\377\316j\31\377\277`"
+ "\24\377\32\21\7\252\0\0\0\0\0\0\0\0\11\7\4Ut<\17\377\241U\21\377\236P\21"
+ "\377\25\16\6\377\5\4\2\34\0\0\0\0\2\2\1\3\14\11\7\327\276k\31\377\323|\36"
+ "\377\320\206%\377\40\26\15\262\0\0\0\0\0\0\0\0\15\13\10`\273p\40\377\321"
+ "{\36\377\277`\24\377\34\23\11\377\4\3\3J\0\0\0\0\3\2\2\34\15\12\10\343\304"
+ "x\37\377\323|\36\377\307j\30\377\33\23\12\252\0\0\0\0\0\0\0\0\15\12\6""9"
+ "r=\23\377\262[\25\377\266f\27\377\27\21\12\255\0\0\0\0\0\0\0\0\13\11\6[\222"
+ "U\31\377\306q\35\377\304x\37\377\33\24\14\317\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\5\5\4\34\25\21\14\343\276v!\377\321\203(\377\241d\"\377\21\16"
+ "\12\343\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\11\10\6\252[;\34\377\275^\30\377\242S\23\377'\31\14\377"
+ "\7\7\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\216\267g\30\377"
+ "\313p\30\377\313p\30\377*\32\15\371\5\4\4>\0\0\0\0\3\2\2\31\14\11\7\343\303"
+ "s\36\377\324\177#\377\323\204&\377\40\26\15\265\0\0\0\0\0\0\0\0\14\12\7U"
+ "|A\21\377\241U\21\377\237N\22\377\25\16\6\377\5\4\2\34\0\0\0\0\0\0\0\0\7"
+ "\6\4\340\205D\20\377\237Q\22\377\222H\21\377\26\16\7\252\0\0\0\0\0\0\0\0"
+ "\15\13\10[\271o\40\377\322}!\377\315r\32\377%\32\16\377\4\4\3U\0\0\0\0\4"
+ "\4\4\34\15\12\10\343\301i\32\377\316o\33\377\312v\33\377\40\26\15\252\0\0"
+ "\0\0\0\0\0\0\13\11\6\177\256[\27\377\312f\25\377\310i\25\377$\27\15\377\4"
+ "\4\3U\0\0\0\0\3\3\2\34\15\13\10\343\306v!\377\324\177#\377\320\200!\377\37"
+ "\26\14\265\0\0\0\0\0\0\0\0\15\13\10[\271r\36\377\323|\36\377\320z\35\377"
+ "\"\30\15\377\4\4\3U\0\0\0\0\7\6\6q\40\30\15\377\271_\26\377\312b\25\377\306"
+ "a\27\377!\26\14\252\0\0\0\0\0\0\0\0\12\10\7\234\276l\33\377\324~!\377\323"
+ "\177$\377(\32\17\377\4\4\3U\0\0\0\0\3\3\2\34\15\13\10\343\306v!\377\326\201"
+ "%\377\323\204&\377\40\27\15\255\0\0\0\0\0\0\0\0\12\10\7\220\247W\26\377\271"
+ "^\24\377\245W\22\377\31\21\10\377\3\3\2""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\303p\36\377\322}!\377\320u\35\377"
+ "'\32\16\377\4\4\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\14\12\7\226\270l\33\377\323|\36\377\323\177$\377(\33\17\377\4\4\3U\0\0"
+ "\0\0\3\3\2\34\21\15\10\262\212G\21\377\241U\21\377\233O\22\377\25\16\6\252"
+ "\0\0\0\0\0\0\0\0\12\10\5U|=\17\377\251Y\22\377\264[\23\377\31\22\12\377\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\304q\37\377\323|\36\377\315w\32\377\32"
+ "\22\13\314\0\0\0\0\0\0\0\0\13\11\6X\206F\23\377\255W\22\377\250V\23\377\24"
+ "\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\15\13\10\252\304q\37\377\322}!\377\317z\36\377\30\22\13"
+ "\324\0\0\0\0\0\0\0\0\13\11\6w\264]\27\377\313l\30\377\312g\27\377\24\17\11"
+ "\377\0\0\0\0\0\0\0\0\17\15\12\303e?\32\377\312u\31\377\316\200#\377\240j"
+ "#\377\17\15\12\216\0\0\0\0\0\0\0\0\12\10\5\223\213F\24\377\277`\24\377\310"
+ "i\25\377\31\22\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\15\12\10\252\275c\32\377\316s\33\377\315j\32\377\271j\34\377"
+ "O4\32\377\12\11\7z\0\0\0\0\7\6\6*$\33\21\364\254j#\377\317\200\"\377\323"
+ "~\"\377\323\177$\377\30\22\13\343\0\0\0\0\0\0\0\0\12\10\5U|@\17\377\237Q"
+ "\22\377\236P\21\377L(\15\377\13\10\6\322\0\0\0\0\0\0\0\0\14\11\5U\201@\20"
+ "\377\241U\21\377\236P\21\377\32\20\7\252\0\0\0\0\0\0\0\0\11\7\4Us8\20\377"
+ "\241U\21\377\237Q\22\3771\33\12\377\7\6\4\252\5\4\4U\6\5\3q\32\23\13\377"
+ "\271_\26\377\312f\25\377\305h\26\377\34\24\13\255\0\0\0\0\0\0\0\0\15\12\6"
+ "f\247W\26\377\310e\25\377\311f\26\377\40\25\13\377\4\3\3A\0\0\0\0\2\2\1\21"
+ "\14\12\7\335\276b\27\377\320t\33\377\314n\33\377\36\25\13\265\0\0\0\0\0\0"
+ "\0\0\15\13\10[\271r\36\377\323|\36\377\321{\36\377V7\31\377\11\10\6\273\6"
+ "\6\5U\7\6\6\202\40\30\17\377\310z\37\377\321{\36\377\316z\37\377\40\27\15"
+ "\255\0\0\0\0\0\0\0\0\12\10\7\220\277q\36\377\324\177#\377\322~#\377(\33\17"
+ "\377\4\4\3U\0\0\0\0\2\2\1\10\13\11\6\324\235Q\24\377\275\\\24\377\276a\25"
+ "\377\33\23\12\262\0\0\0\0\0\0\0\0\14\12\7`\267i\34\377\321{\36\377\315r\32"
+ "\377$\30\15\377\4\4\3U\0\0\0\0\4\4\4\34\22\16\11\273\303s\36\377\323|\36"
+ "\377\322\202#\377#\32\16\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\2"
+ "\2\34\14\12\7\343\303s\36\377\323|\36\377\321{\36\377&\31\17\377\4\4\3U\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\302s\37\377\321z\34\377"
+ "\304c\25\377\25\17\10\377\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\231O\24\377"
+ "\273[\24\377\265`\24\377\36\24\11\262\0\0\0\0\0\0\0\0\15\12\6`\227O\24\377"
+ "\273[\24\377\265`\24\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7\252"
+ "\222L\23\377\247X\22\377\236M\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5"
+ "U\205B\20\377\247X\22\377\250V\23\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\14\11\7\252\233P\24\377\271^\24\377\265`\24\377\26\20"
+ "\11\335\0\0\0\0\0\0\0\0\6\6\5*3\35\14\377\226Q\23\377\245W\22\377*\32\13"
+ "\377\5\5\4l\0\0\0\0\5\5\4\34\22\17\13\377\303r\34\377\317{\40\377\236^\37"
+ "\377\21\15\12\216\0\0\0\0\0\0\0\0\6\5\5""92\"\23\377\277o\40\377\320u\35"
+ "\377qI\36\377\12\12\11\343\6\6\5}\7\7\6\306*\35\21\377\273`\26\377\246W\27"
+ "\377*\33\17\377\10\6\5n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\5\5\4\270\25\20\10\377j6\17\377\232N\21\377\227M\22\377\\"
+ "0\17\377\13\11\6w\0\0\0\0\0\0\0\0\12\10\5]\203E\22\377\275\\\24\377\310i"
+ "\25\377!\26\14\377\5\4\4""6\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6UL5\31\377\310"
+ "v\37\377\314r\33\377A+\26\377\6\6\5q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\21\16\13\11\343\303o\34\377\316s\33\377"
+ "\314i\31\377\30\21\13\377\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\15\12\6\343}B"
+ "\22\377\245T\22\377\241U\21\377\241U\21\377\233O\22\377\34\23\11\377\6\5"
+ "\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10DV8\33"
+ "\377\314~!\377\322}!\377\36\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\303s\36\377\321{\36\377\317z\36"
+ "\377\33\23\14\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4"
+ "\270\203A\20\377\241U\21\377\232N\21\377\17\13\6\371\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\255"
+ "\246W\27\377\306h\25\377\304c\25\377#\27\14\377\3\3\2U\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\302s"
+ "\37\377\323|\36\377\317z\36\377\33\23\14\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\304q\37"
+ "\377\325\204$\377\323\177$\377\36\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\233P\24\377"
+ "\271^\24\377\264[\23\377\25\17\10\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\270"
+ "\267d\32\377\320t\33\377\314r\33\377\32\22\13\377\4\4\4\34\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177w<\17\377\240U\23\377"
+ "[0\20\377\12\10\5\343\4\4\3\34\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\241\203C\20"
+ "\377\237Q\22\377\237N\22\377\22\15\7\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\7\6\4\2529\"\16\377\260Z\25\377\303_\26\377\32\23\13\350\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\21\16\12c\263j\34\377\317z\36\377\264m!\377\31\24\14\377"
+ "\7\6\6\252\24\21\13\377\304r\33\377\320u\35\377\313|\36\377\254j#\3775$\24"
+ "\377\12\11\7l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\11\10\6\252\237R\24\377\312g\27\377\316o\33\377\26\21"
+ "\13\377\0\0\0\0\0\0\0\0\12\11\7\213sJ\36\377\325\2050\377'\34\20\377\0\0"
+ "\0\0\0\0\0\0\11\10\4qC'\16\377\265\\\24\377\30\22\11\377\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\34\23\11\343\213O\32\377\316u\37\377\324{%\377\326~)\377\254j#\377"
+ "5\"\22\377zN\37\377\323\177,\377\331\2102\377\330\2071\377\276z)\377A+\26"
+ "\377\16\13\7U\0\0\0\0\0\0\0\0\7\6\4\34\35\25\12\371\231O\24\377\256U\23\377"
+ "g5\20\377\21\14\6\364\23\15\6\252\25\16\6\252\33\21\6\252\25\16\6\324\25"
+ "\16\6\377\31\21\6\340\14\11\5-\0\0\0\0\0\0\0\0\0\0\0\0\30\20\7\231\26\17"
+ "\7\377\32\20\7\322\14\11\5(\0\0\0\0\0\0\0\0\10\7\5\34\21\15\10\343r=\23\377"
+ "\256U\23\377\232O\23\377<!\15\377\13\11\6\252\0\0\0\0\0\0\0\0\0\0\0\0\12"
+ "\10\5\252\222O\23\377\264W\23\377C'\16\377\10\6\5U\0\0\0\0\0\0\0\0\30\21"
+ "\11\377\217K\24\377\242P\23\377\26\17\7\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\0\0\0\0\10\7\5n<!\15\377\246N\23\377\26\17\7\343\0\0\0"
+ "\0\0\0\0\0\7\6\4U[3\20\377\256X\23\377\251N\22\377\31\21\10\377\3\3\2\10"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\262\217J\22\377\261Y\22"
+ "\377\212K\23\377\22\15\7\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\34\35"
+ "\23\10\350)\31\12\377\21\15\10\377\11\10\6t\0\0\0\0\7\6\4;\16\13\7\343\40"
+ "\25\11\377(\30\11\377\14\11\5i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\16\13\11\252\307|$\377\325w$\377\312f\25\377\24\16"
+ "\7\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\10\7\5\2165\37\14\377\242V\23\377y@\22\377\23\16\10"
+ "\374\6\5\3\34\0\0\0\0\0\0\0\0\12\10\5}\216J\23\377\264[\23\377\267Y\23\377"
+ "\23\16\10\377\0\0\0\0\5\5\4\6\17\15\12\301E*\22\377\253[\24\377\275X\24\377"
+ "\310e\25\377\37\25\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\36\25"
+ "\15\343\226\\#\377\320y%\377\323s\36\377\320u\35\377\34\25\15\377\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\26\17\7\306\32\21\7\377"
+ "\30\17\7\335\11\7\4""9\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\234\253Y\26\377\312"
+ "k\27\377\312g\27\377\27\22\12\371\0\0\0\0\0\0\0\0\0\0\0\0\32\22\11\306\35"
+ "\23\10\377\30\20\7\327\12\10\5""3\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5U\206F\23"
+ "\377\257X\22\377\255W\22\377\24\16\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\12\10\5U\32\23\11\377k:\22\377\232S\23\377\250O\23\377\251"
+ "N\22\377\255W\22\377\254P\23\377\32\21\7\252\0\0\0\0\0\0\0\0\13\12\10\210"
+ "\275c\32\377\322s\37\377\330\201-\377\217`(\377\17\15\12\343\14\14\13\252"
+ "\17\15\14\252\15\14\12\252\15\14\12\210\11\10\10U\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\13\11\6\252\251[\26\377\312g\27\377\313l\30\377\22\17\11\377\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\6\5\5\27\34\23\13\234\37\26\14\377\"\30\15\343\16\13"
+ "\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\11\10\10\216H6\37\377\327\223<\377\332\222=\377\256d#\377\16\13\7\216"
+ "\0\0\0\0\0\0\0\0\13\10\6f\216J\23\377\271V\24\377\303b\24\377\22\16\11\371"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\312\203/\377\334\230?\377\334\227=\377"
+ "\26\23\15\374\0\0\0\0\0\0\0\0\13\11\10\247\313\207.\377\331\2130\377\322"
+ "x!\377\22\16\11\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\306u%\377\323s\36"
+ "\377\312f\25\377\"\26\13\260\0\0\0\0\0\0\0\0\15\13\10\252\312z%\377\332\220"
+ "1\377\331\2202\377\34\25\15\377\0\0\0\0\0\0\0\0\14\13\11\252\314z)\377\331"
+ "\207.\377\327\210*\377.!\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34"
+ "\25\23\16\343\231h.\377\326\2257\377\236g'\377\20\16\13\335\7\6\6\34\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\22\15\216\37\32\22\252\31\25\20\252"
+ "\30\24\17\252\30\24\17\252\30\24\17\252\30\25\17\252\37\32\22\252\31\25\20"
+ "\252\16\14\11\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\247K3\32"
+ "\377\312u!\377\272x+\377)\40\24\377\14\13\11U\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\13\11\10\34\37\26\14\3271!\22\377)\33\20\343\14\12\7U\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\16\14\11\252\314\2113\377\334\230?\377\334\227=\377\27\23\14\374"
+ "\0\0\0\0\0\0\0\0\13\12\6U\210F\21\377\257X\22\377\251N\22\377\17\13\6\377"
+ "\0\0\0\0\0\0\0\0\11\10\6U\32\23\11\377\231R\22\377\261Y\22\377\264T\23\377"
+ "\30\21\11\332\0\0\0\0\0\0\0\0\13\11\10\223\304s#\377\327}&\377\326}'\377"
+ "\24\20\13\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\237\245V\26\377\305c\24\377"
+ "\303Z\24\377\40\25\13\252\0\0\0\0\0\0\0\0\14\12\7U\221L\24\377\275\\\24\377"
+ "\277`\24\377\22\16\11\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\307~'\377\331"
+ "\2052\377\331\2202\377\27\22\14\374\0\0\0\0\0\0\0\0\13\12\10\216\277i\34"
+ "\377\316o\33\377\313h\30\377\23\17\12\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6"
+ """9\25\17\10\306\34\23\11\377\40\25\13\343\13\11\6L\0\0\0\0\0\0\0\0\13\11"
+ "\10\252\313}*\377\334\222;\377\333\222<\377\30\23\15\377\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\13\12\10\252\314\210/\377\334\222;\377\332\2237\377\31\23\14\350"
+ "\0\0\0\0\0\0\0\0\13\12\10w\241W\26\377\303b\24\377\312g\27\377\22\17\11\377"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11"
+ "\252\310}%\377\326|%\377\315j\32\377\24\20\11\335\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\15\11\252\315\202*\377\333\220"
+ "8\377\333\222<\377\30\23\15\377\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\27\25\16\6"
+ "\252\32\20\7\377\32\21\7\340\16\12\5\37\0\0\0\0\0\0\0\0\13\11\6}\252Y\27"
+ "\377\323s\36\377\326~)\377\27\23\14\377\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10"
+ "\252\303p\36\377\316j\31\377\310i\25\377\35\24\12\252\0\0\0\0\0\0\0\0\13"
+ "\11\6U\206F\23\377\261U\22\377\254P\23\377\22\15\7\377\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252"
+ "\303p\36\377\316o\33\377\312g\27\377\37\26\12\252\0\0\0\0\0\0\0\0\15\12\6"
+ "U\227O\24\377\275\\\24\377\267Y\23\377\21\15\10\377\0\0\0\0\10\7\5;9\"\20"
+ "\377\270a\33\377\306s!\377rM!\377\20\16\13\322\6\5\5\10\0\0\0\0\0\0\0\0\14"
+ "\12\7\252\303q\40\377\327{*\377\331\2052\377\40\30\17\377\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\7\252\257Z\26\377"
+ "\306h\25\377\275\\\24\377\300a\25\377\275a\26\377-\35\16\377\12\11\7\322"
+ "\26\21\13\377\267f\36\377\324y)\377\330\2071\377\331\2114\377\326}'\377\35"
+ "\25\14\314\0\0\0\0\0\0\0\0\13\11\6U\217K\24\377\301a\24\377\303b\24\377\264"
+ "]\27\377X6\27\377\13\12\10q\0\0\0\0\16\14\7U\252Y\27\377\312g\27\377\312"
+ "f\25\377\40\26\13\262\0\0\0\0\0\0\0\0\14\12\7q\260[\27\377\315i\30\377\321"
+ "u\34\377'\34\20\377\5\5\5\34\0\0\0\0\0\0\0\0\17\16\12\306\316\204-\377\331"
+ "\2052\377\327\205,\377\31\23\14\350\0\0\0\0\0\0\0\0\13\12\10}\306v'\377\332"
+ "\2213\377\332\2225\377\24\21\13\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\306"
+ "|%\377\330\206-\377\326\213)\377\26\22\13\377\0\0\0\0\0\0\0\0\13\12\10\210"
+ "\277i\34\377\316o\33\377\316j\31\377$\32\17\377\5\5\4\34\0\0\0\0\0\0\0\0"
+ "\17\15\12\306\300i\33\377\316j\31\377\314i\31\377\27\21\12\350\0\0\0\0\0"
+ "\0\0\0\14\12\7}\304w%\377\332\2153\377\332\2137\377\24\20\13\377\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\11\10\6\252\304n!\377\327~(\377\326}'\377\27\22\14\374\0"
+ "\0\0\0\0\0\0\0\13\11\10\247\311{(\377\331\2052\377\326\210+\377\24\20\13"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\27\35\25\14\231\40\26\15\377#\31\16\343"
+ "\17\14\10U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252\306"
+ "|%\377\327}&\377\325|&\377\27\22\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\16\14\11\252\314\204/\377\333\2208\377\323\177$\377\34\25"
+ "\15\377\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\306u%\377\327{*\377\326}'\377"
+ "\31\24\14\327\0\0\0\0\0\0\0\0\13\12\10\202\306w#\377\327~(\377\324{%\377"
+ "\36\26\15\377\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\304r!\377\316j\31\377"
+ "\310i\25\377\36\25\13\270\0\0\0\0\0\0\0\0\15\13\10c\270d\31\377\321u\34\377"
+ "\322s\37\377\34\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11"
+ "\252\306u%\377\327~(\377\326~)\377\31\23\14\377\0\0\0\0\0\0\0\0\0\0\0\0\12"
+ "\11\7}=*\26\377\276k!\377\231b&\377\35\27\20\377\15\14\12\377\21\17\12\377"
+ "lJ%\377\322\220;\377\231b&\377\20\16\13\340\6\6\5\21\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\17\15\10\343sC\30\377\305d\26\377\226Q\31\377\40\30\15\377\17\15\10"
+ "\377\23\17\12\377U0\22\377\262_\25\377sA\24\377\17\14\10\377\5\5\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\12\11\7\306"
+ "E.\26\377\272g\35\377\303o\34\377\\:\31\377\17\14\10\306\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\12\11\7\252\302p\37\377\327}&\377\332\2225\377\30\23\15\377\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\343\237g*\377\324\177+\377"
+ "\261v0\377\23\21\14\343\6\6\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\266b\27\377\312j\25\377\303b\24\377"
+ "\30\21\11\324\0\0\0\0\0\0\0\0\0\0\0\0\22\16\11\343f6\23\377\235S\22\377U"
+ ".\16\377\23\15\6\377/\33\12\377\226Q\23\377\203C\24\377'\32\16\377\14\13"
+ "\11U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252"
+ "vK!\377\327\2156\377,!\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10l\23"
+ "\21\14\252\33\27\20\252\27\25\20\252\27\25\20\252\30\24\17\252\24\22\15\252"
+ "\17\16\12\252\12\11\7q\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\275"
+ "c\32\377\321n\36\377\323v$\377\215X$\377\23\21\14\343\24\22\15\252\30\24"
+ "\17\252\25\23\16\252\20\16\13\252\12\11\7q\6\6\5\34\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\10\7\5A\13\12\10\216\20\16\13\252\30\25\17\252\31\26\20"
+ "\252\27\25\20\252\25\23\16\252\20\16\13\252\13\12\10q\7\7\6\34\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5>\12\11\5\210\14\12\7\252\16\13\7\252"
+ "\15\12\6\252\13\11\6\306\37\25\12\377\231R\22\377\261U\22\377\251N\22\377"
+ "\26\17\7\314\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""9\13\12\6\216\23\21"
+ "\14\252\27\25\20\252\31\26\20\252\27\25\20\252\25\23\16\252\17\16\12\252"
+ "\12\12\11q\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\2317\40\16\377"
+ "\257]\24\377\271^\24\377\267Y\23\377P,\21\377\15\13\10\273\7\6\6\31\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5>\13\12\6\216\20\16\13\252\27\23\16\252"
+ "\31\26\20\252\27\25\20\252\23\21\14\252\17\16\12\252\21\17\12\252\23\21\14"
+ "\216\11\10\10\34\0\0\0\0\0\0\0\0\14\12\11\252\314\2111\377\334\222;\377\332"
+ "\2225\377\215[&\377\23\21\14\343\23\21\14\252\30\24\17\252\25\23\16\252\17"
+ "\16\12\252\12\12\11q\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7""9"
+ "\16\14\7f\16\13\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\14\12\7""9\15\13\10i\17\15\10U\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11"
+ "\252\314\210/\377\334\222;\377\332\231;\377\30\23\15\377\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\10\7\5R\13\12\6\234\13\11\6\252\12\11\7[\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\12\10\5\177\220N\23\377\264W\23\377\256Q\23\377\30\17\7\322\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\16\13\7D\14\12\7\252\14\12\7\252\21\17\12\252\30\24\17\252\23"
+ "\21\14\252\17\16\12\252\22\17\13\252\30\25\17\252\25\23\16\252\17\16\12\252"
+ "\13\12\10q\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12w\21\17\14\252"
+ "\17\15\12\252\20\16\13\252\23\21\14\252\25\22\14\252\22\17\13\252\17\15\10"
+ "\252\13\11\6\252\12\10\7X\6\5\5\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\12\11\7U\16\14\11\252\23\21\14\252\25\23\16\252\25\23\16\252\25\23\16"
+ "\252\23\21\14\252\17\16\12\252\13\12\10t\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\17\16\12w\22\17\13\252\17\16\12\252\22\17\13\252\25\23\16\252\31"
+ "\26\20\252\27\25\20\252\25\23\16\252\20\16\13\252\13\12\10q\7\7\6\34\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7U\16\14\11\252\23\21\14\252\24"
+ "\22\15\252\24\22\15\252\27\23\16\252\23\21\14\252\17\16\12\252\21\16\12\252"
+ "\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12q\22\17\13\252\17"
+ "\16\12\252\22\17\13\252\25\23\16\252\31\26\20\252\27\25\20\252\24\22\15\252"
+ "\20\16\13\252\13\12\10q\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\7\7\6R\13\12\6\216\20\15\11\252\23\21\14\252\25\23\16\252\30\25\17\252\31"
+ "\26\20\252\31\26\20\252\17\15\12\252\14\13\11""9\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\17\15\12\252aA\"\377\321\204*\377\326\210+\377\326\177+\377\237"
+ "g*\377\25\23\16\343\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\25\23\16"
+ "\252\22\17\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12}\25"
+ "\23\16\252\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12q\25\23"
+ "\16\252\22\20\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12"
+ "}\25\23\16\252\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12q"
+ "\25\23\16\252\22\20\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\17\16\12}\25\23\16\252\23\21\14\216\11\11\10\34\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\21\16\12\202\33\30\20\252\25\23\16\216\12\11\7\34\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\34\30\21\252\30\25\17\241\14\13\11\34"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\25\23\16\252\22\17\13\231\13\12\10\34"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12}\25\23\16\252\23\21\14\216\11\10"
+ "\6\34\0\0\0\0\0\0\0\0\0\0\0\0\22\17\13\210\23\20\12\252\20\15\11\252\20\16"
+ "\11\252\17\15\10\252\15\13\10\252\14\13\11\252\15\14\10\252\17\16\12\252"
+ "\16\15\13\252\13\13\12q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10"
+ "\252\276b\27\377\314t\37\377J4\33\377\11\10\10q\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\15\13\10\252\300j\35\377\320p\33\377\320u\35\377\33\25\14\377\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\33\27\20\377\307y,\377\326\213)\377"
+ "\37\27\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\34\40\30\15\343$\32"
+ "\17\377\23\20\14\306\10\10\7""3\0\0\0\0\10\10\7""9\35\25\14\3320\40\21\377"
+ "-\36\20\377\24\20\13\332\12\11\7i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\314\2023\377"
+ "\340\231M\377\341\251X\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\25\23\16\327"
+ "\331\243V\377=.\34\377\0\0\0\0\0\0\0\0\0\0\0\0\23\20\14\311\313y(\3773&\26"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\31\20\16\13\343\324\223G\377\340\240M"
+ "\377\337\241P\377\37\31\20\377\4\4\4f\12\12\11\327\316\2057\377\337\234F"
+ "\377\340\244U\3773'\30\377\5\5\4R\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10n\262b"
+ "\33\377\323s\36\377\323y\"\377$\32\17\377\3\3\2U\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5\34\33\24\12\350}I\26\377\276a\25\377\264"
+ "\\\25\377a8\24\377\16\13\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\216"
+ "\245Y\26\377\306h\25\377T2\23\377\7\6\4\237\0\0\0\0\5\5\4R\40\27\13\377y"
+ "E\26\377a8\24\377\17\15\10\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\16\14\7\306\254\\\25\377\34\23\11\317\0\0\0\0\0\0"
+ "\0\0\13\12\6U\224N\25\377\306h\25\377\300a\25\377\25\17\10\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\5\252\247Z\26\377\312]\25\377"
+ "\312g\27\377\25\20\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\205"
+ "\24\20\11\377\227P\26\377K*\20\377\12\10\7\377\40\26\13\377\244V\27\377<"
+ "'\21\377\5\5\4\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\14\13\11\306\325\233P\377\340\246S\377\323y\"\377\24\20"
+ "\11\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\6\6\5""3\33\24\12\377\240T\27\377\306h\25\377C(\20\377\10"
+ "\7\5}\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252\303p\36\377\327}&\377\331\205"
+ "2\3771#\26\377\5\5\4\205\15\14\12\322\275w2\377\323\177,\377\324y)\377\332"
+ "\2075\377\334\224?\377\"\33\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\4\4\4\21\15\14\12\343\304q\37\377\324v#\377\326{+\377!\32\20\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\273\320\2067\377\337\222F\377"
+ "\335\230F\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\244\245V\26\377\312b\25\377\306`"
+ "\25\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5U\40"
+ "\26\13\377\247W\26\377\240T\27\377]6\24\377xA\25\377\274`\25\377\304c\25"
+ "\377\310i\25\377\30\23\13\317\0\0\0\0\0\0\0\0\17\16\12n\320\230G\377\343"
+ "\256b\377\344\263g\377\341\260b\377\331\251^\377\325\246\\\377\327\247\\"
+ "\377\325\233P\377\314\2107\377\212Y%\377\31\26\20\343\11\11\10\34\0\0\0\0"
+ "\0\0\0\0\13\12\10\252\313\2012\377\337\225F\377\336\236K\377\37\31\20\377"
+ "\4\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\7""91(\32"
+ "\377\316\230S\377\340\251[\377\302\214G\377\37\33\24\377\11\10\10\34\0\0"
+ "\0\0\0\0\0\0\14\12\11\241\304n!\377\332\2023\377\336\236K\377\37\31\20\377"
+ "\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\325\240T\377\344\264i\377\343\257"
+ "d\377!\34\22\317\0\0\0\0\0\0\0\0\14\13\11\202\322\233M\377\344\251c\377\342"
+ "\254_\377\36\31\21\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\314\2011\377"
+ "\326\177+\377\325}(\377\27\23\14\350\0\0\0\0\0\0\0\0\16\15\11}\320\230G\377"
+ "\337\237L\377\332\231;\377!\32\20\322\0\0\0\0\0\0\0\0\15\14\12\177\306v'"
+ "\377\327\177*\377\325~*\377)\37\22\343\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\31"
+ "\25\20\343\314\226O\377\337\253b\377\257z<\377\22\17\13\332\5\4\4\21\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\22\15U\261e\"\377\314{%\377\307u"
+ "$\377\307u$\377\312z%\377\307u$\377\306r\37\377\306n\37\377\312v#\377.!\25"
+ "\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\12\11\7\231nN%\377\325"
+ "\242R\377\332\244W\377C3\36\377\11\10\10U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\34\25\23\16\377\331"
+ "\246\\\377\343\257d\377\340\251[\377\37\31\20\327\0\0\0\0\0\0\0\0\14\12\7"
+ "U\232P\25\377\305c\24\377\300a\25\377\34\24\11\377\4\3\3n\13\11\6\252u?\24"
+ "\377\270^\25\377\306h\25\377\313h\30\377\322z%\377\25\21\14\374\0\0\0\0\0"
+ "\0\0\0\12\11\7\241\313\2012\377\340\240M\377\341\251X\377\36\31\21\377\4"
+ "\4\4\34\0\0\0\0\0\0\0\0\10\7\5\276\245V\26\377\306h\25\377\304c\25\377\34"
+ "\23\11\252\0\0\0\0\0\0\0\0\15\13\10U\260[\27\377\320p\33\377\322y#\377\33"
+ "\26\16\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\323\225L\377\340\250W\377"
+ "\340\242Q\377\40\32\21\322\0\0\0\0\0\0\0\0\14\12\7q\260[\27\377\312k\27\377"
+ "\312_\27\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\240T\377\344\264i\377\343"
+ "\256b\377!\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\233P\377\342"
+ "\254_\377\340\247U\377\27\24\16\364\0\0\0\0\0\0\0\0\13\12\10\177\275h\34"
+ "\377\326\177+\377\335\224F\377\37\31\20\377\4\4\4\34\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\303q\40\377\321u\34\377"
+ "\312g\27\377\24\17\11\374\3\3\3\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\17\16\12\252\325\233P\377\342\254_\377\335\230F\377\34"
+ "\30\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\16\14\11\252\320\215=\377\341\242X\377\343\256b\377!\32"
+ "\22\377\4\4\4\34\0\0\0\0\0\0\0\0\12\10\7\306\266b\27\377\312g\27\377\306"
+ "h\25\377\34\23\11\252\0\0\0\0\0\0\0\0\13\12\6U\232P\25\377\312b\25\377\312"
+ "g\27\377\31\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252\272d\27\377\312c\27\377\310i\25"
+ "\377\36\25\11\252\0\0\0\0\0\0\0\0\14\11\7U\232P\25\377\306h\25\377\304c\25"
+ "\377\34\24\11\377\4\4\3q\13\12\6\343\267d\32\377\324\177+\377\247u4\377\21"
+ "\17\14\327\5\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\340"
+ "\246S\377\337\241P\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\247W\26\377\306\\\25\377\304c\25\377"
+ "\304_\25\377\306\\\25\377\303c\26\377\300j\35\377\316\177+\377\331\215<\377"
+ "\337\222F\377\340\245Q\377\334\224?\377\324|'\377\31\23\14\327\0\0\0\0\0"
+ "\0\0\0\14\13\11t\304t%\377\332\2153\377\332\2137\377\332\216=\377\327\217"
+ ":\377\30\23\15\324\0\0\0\0\12\11\7\234\313\2012\377\335\226B\377\334\224"
+ "?\377\31\25\16\343\0\0\0\0\0\0\0\0\12\12\7\237\314\206;\377\341\240T\377"
+ "\341\251X\377$\35\23\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\314\2023\377"
+ "\334\216;\377\332\2137\377\25\22\14\371\0\0\0\0\0\0\0\0\13\12\10\216\316"
+ "\221C\377\342\254_\377\343\256b\377\40\32\21\377\4\4\4\34\0\0\0\0\0\0\0\0"
+ "\13\12\10\306\306u%\377\327}&\377\323z$\377\34\25\15\327\0\0\0\0\0\0\0\0"
+ "\15\13\10`\256[\27\377\312k\27\377\312g\27\377\26\21\11\377\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\13\12\6\252\260[\27\377\312g\27\377\313l\30\377\25\17\12\356\0"
+ "\0\0\0\0\0\0\0\13\12\10\216\316\221C\377\342\252[\377\340\240U\377\36\30"
+ "\21\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\321\225F\377\340\240M\377\336"
+ "\236K\377\37\31\20\324\0\0\0\0\0\0\0\0\14\13\11\177\306t#\377\327}&\377\323"
+ "z$\377\34\25\15\377\4\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\10\252"
+ "\303p\36\377\321n\36\377\317i\36\377\31\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\325\236P\377\342\254_\377\340\244U"
+ "\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\322\217A\377\340\250"
+ "W\377\340\245Q\377\31\25\16\350\0\0\0\0\0\0\0\0\12\12\11\231\320\223C\377"
+ "\340\246S\377\336\236K\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252"
+ "\323\225L\377\337\225F\377\333\222<\377\31\24\16\353\0\0\0\0\0\0\0\0\12\12"
+ "\11\226\314\206;\377\340\234S\377\340\245Q\377!\33\22\377\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\323\226F\377\342\252[\377\342\254_"
+ "\377!\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\226eJ&\377\306\221"
+ "M\377\316\235W\377\312\227O\377\305\215J\377\310\222K\377\264~9\377\25\23"
+ "\16\343\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5q+\34\16\377\273`"
+ "\26\377\265]\26\377b7\25\377D*\21\377M.\22\377\201H\26\377\256Y\25\377S/"
+ "\22\377\13\11\6\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\6\6\5\34\20\16\13\303lL#\377\322\215;\377\332\242Q\377\247v6\377\20\16"
+ "\13\335\5\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\340\250"
+ "W\377\337\232P\377\37\31\20\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6"
+ "\6\5""9\"\33\21\377\313z$\377\320|)\377mL\"\377\15\14\12\216\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\260[\27"
+ "\377\312]\25\377\304c\25\377\34\23\11\252\0\0\0\0\0\0\0\0\13\11\6U\204G\25"
+ "\377\303c\26\377g;\24\377\13\12\6\252\3\3\2\31\6\6\5n7#\20\377\306q\35\377"
+ "\324\2063\377)\40\24\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\25\23\16\327\331\243V\3771&\30\377\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\13\12\10R6+\33\377\310\207;\377\322\211;\377\317\2032\377\315\177,\377"
+ "\307u$\377\303o\34\377\273e\30\377]6\26\377\23\17\12\343\7\6\6\34\0\0\0\0"
+ "\0\0\0\0\12\11\7\252\303m\40\377\332\2125\377\340\236Q\377\337\255_\377\333"
+ "\247^\377\331\251^\377\332\253a\377\331\246\\\377\320\210;\377nD\33\377\23"
+ "\17\12\343\6\6\5\34\0\0\0\0\0\0\0\0\0\0\0\0\14\13\7\252=*\24\377\274j!\377"
+ "\320\2067\377\327\243R\377\331\246\\\377\330\247X\377\330\247Y\377\323\226"
+ "F\377\222^'\377\32\25\17\345\11\10\6\34\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252"
+ "3\40\16\377\227P\26\377\251[\26\377\255V\26\377\251X\26\377\255V\26\377\264"
+ "\\\25\377\302b\25\377\304_\25\377\300a\25\377\37\25\12\252\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\14\12\7\2529%\22\377\275k\"\377\324\225C\377\331\246\\\377\331"
+ "\246\\\377\332\253a\377\327\243R\377\315~0\377tH\35\377\24\20\13\343\6\6"
+ "\5\34\0\0\0\0\0\0\0\0\13\11\6D~D\25\377\277b\26\377\302b\25\377\300a\25\377"
+ "\300a\25\377\277b\26\377\261[\26\377\32\23\11\216\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\14\12\7\252:%\21\377\271k\36\377\320\2067\377\330\247X\377\332\253a\377"
+ "\331\246\\\377\325\224H\377\314\2023\377\321\215<\377\323\237L\377\36\31"
+ "\21\252\0\0\0\0\0\0\0\0\12\12\7\247\322\233M\377\344\262c\377\340\245Q\377"
+ "\335\245V\377\331\246\\\377\332\251]\377\331\246\\\377\326\234Q\377\316\207"
+ "3\377tH\35\377\24\20\13\343\6\6\5\34\0\0\0\0\0\0\0\0\15\12\6""9s>\24\377"
+ "\251[\26\377\245V\26\377\30\22\11\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\14\12\7Xu?\24\377\272d\27\377\277k\40\377#\33\20\220\0\0\0\0"
+ "\0\0\0\0\12\12\7\252\322\233M\377\344\262c\377\335\230F\377\30\23\15\377"
+ "\0\0\0\0\0\0\0\0\14\12\7\252:$\17\377\235O\26\377\227P\26\377:#\17\377\13"
+ "\11\6""9\0\0\0\0\0\0\0\0\14\12\7U\235Q\24\377\305c\24\377\300a\25\377\34"
+ "\24\11\252\0\0\0\0\0\0\0\0\13\11\6""9s>\24\377\275^\30\377\306u%\377\325"
+ "\235L\377\332\253a\377\331\251^\377\326\241U\377\325\235L\377\324\225C\377"
+ "\320\2067\377\315~0\377\217`(\377\34\32\23\345\10\10\7\34\0\0\0\0\0\0\0\0"
+ "\15\14\10U\215J\30\377\276^\27\377\267_\30\377\267_\30\377\273]\30\377\275"
+ "a\26\377\265]\26\377\261[\26\377\251X\26\377Y4\24\377\25\22\14\343\11\11"
+ "\10\34\0\0\0\0\0\0\0\0\0\0\0\0\22\21\15\265gJ(\377\317\222J\377\326\234Q"
+ "\377\322\220C\377\320\2127\377\317\2014\377\315\2050\377\315~0\377\227e*"
+ "\377\34\32\23\350\11\10\10\34\0\0\0\0\0\0\0\0\15\14\12n\272\177?\377\326"
+ "\234Q\377\325\236P\377\325\233P\377\326\234Q\377\326\231K\377\325\224H\377"
+ "\325\224H\377\323\226F\377\237o6\377\34\31\23\361\11\10\10\37\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\22\21\15\265gJ(\377\320\234Q\377\326\234Q\377\320\2127\377\321"
+ "\211<\377\325\236P\377\325\233P\377\325\240T\377\327\240X\377\325\243T\377"
+ "\36\30\21\262\0\0\0\0\0\0\0\0\14\13\11]\262y5\377\325\236P\377\322\217A\377"
+ "\323\222>\377\325\224H\377\327\243R\377\325\236P\377\324\225C\377\321\215"
+ "<\377\231j1\377\34\31\23\353\11\11\10\37\0\0\0\0\0\0\0\0\0\0\0\0\22\17\13"
+ "\255B+\25\377\273e\40\377\317\2044\377\322\220C\377\325\224H\377\326\234"
+ "Q\377\330\247X\377\326\234Q\377\260\200A\377.'\33\377\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\17\16\12U\265o*\377\327\2104\377\325}(\377\323z$\377\324{%\377\322{"
+ "'\377\312z%\377\37\30\16\252\0\0\0\0\0\0\0\0\14\13\11X\244Y\35\377\313z$"
+ "\377\307u$\377\36\27\17\324\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\177\273\205"
+ ">\377\325\224H\377\320\2127\377\37\30\20\252\0\0\0\0\0\0\0\0\15\14\12U\254"
+ "h%\377\321\2066\377\316\2073\377\40\31\21\324\0\0\0\0\0\0\0\0\0\0\0\0\17"
+ "\15\12\177\265t.\377\323\217>\377\322\231G\377\35\30\20\262\0\0\0\0\0\0\0"
+ "\0\15\14\12[\262y5\377\325\232F\377\320\2067\377\37\31\20\322\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12}\263n*\377\322\2077\377\320\213A\377"
+ "\32\25\17\270\0\0\0\0\0\0\0\0\16\15\11U\263u,\377\331\245R\377\325\243T\377"
+ "\33\27\20\335\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\210\256g'\377\316\177+\377"
+ "\307u$\377\37\30\16\252\0\0\0\0\0\0\0\0\14\13\11X\244Y\35\377\312v#\377\304"
+ "r!\377\35\26\16\322\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11}\251_\36\377\312w%\377"
+ "\307w'\377\30\23\15\276\0\0\0\0\0\0\0\0\16\14\11U\252_\35\377\306q\35\377"
+ "\307t\"\377\314\200/\377\316\2073\377\314\2011\377\314\2011\377\320\2067"
+ "\377\323\225L\377\300\214I\377_J'\377\21\17\14U\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\16\14\11\306\323\226F\377\316\230Q\377\37\32\24\377\7\7\6""0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\342\252[\377\342\254"
+ "_\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\332\253"
+ "x<\377\333\232F\377)\37\24\377\4\4\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\14\252\333\263t\377\350\301\211\377"
+ "\350\307\207\377(!\27\377\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11L>2\37\377\24\22"
+ "\15\247\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10L:.\35\377\24\22\15\247\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\322\226G\377\337\223H\377\335\226B\377"
+ "\32\25\17\322\0\0\0\0\13\12\10w\323\237T\377\345\270r\377\346\272{\377\36"
+ "\32\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11]\211Z(\377\337\247^\377"
+ "\344\264o\377\247\205P\377\21\20\16\343\13\13\12\252\14\13\11\252\14\13\11"
+ "\252\14\13\11w\7\7\6""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\7\7\6>\25\22\14\343\235\\\34\377\313i\32\377\305j"
+ "\32\377R0\25\377\16\14\7\255\5\5\4\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10"
+ "\7\5\34\32\23\13\343gD\31\377\236`\35\3779)\26\377\15\14\12\361!\32\20\377"
+ "\222X\37\377B/\27\377\14\12\11\311\6\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""9\36\26\13\377\17\14\10`\0\0\0"
+ "\0\0\0\0\0\12\12\7\202\276h\33\377\321v\36\377\323u\"\377\33\25\16\377\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\307z'\377\332"
+ "\2023\377\337\222F\377\36\30\21\377\0\0\0\0\0\0\0\0\0\0\0\0\27\26\22\213"
+ "\36\33\25\252\20\17\13\377Y;\32\377\313n\34\377\304q\37\377zQ!\377\272u+"
+ "\377\330\2013\377\270~9\377&\"\31\377\30\26\23\335!\36\30\252\17\17\14\34"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\30\26\23\216\40\37\31\252\25\24\20\306ZG-\377\337"
+ "\263n\377\342\254_\377\335\226B\377\217d,\377\26\25\21\343\34\33\25\252\35"
+ "\34\26\252\15\15\14*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\10\10\10\13\31\30\24\216'#\34\252\36\34\27\252\35\33"
+ "\26\252\35\33\26\252\35\33\26\252\35\33\26\252\35\33\24\252\27\25\20\252"
+ "\16\15\13\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\237\216V\37\377\320t"
+ "#\377\311w&\377\40\32\21\377\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252"
+ "\330\247a\377\347\270|\377\347\301\200\377\265\222\\\3774,!\377ZG-\377\311"
+ "\233X\377\337\255f\377\344\263s\377\346\267{\377\346\270w\377'\40\26\377"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\252\316\213=\377"
+ "\342\244[\377\344\256g\377'\40\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\11"
+ "\11\10\2168.\37\377\336\264q\377\346\273w\377\336\264q\377\27\25\20\377\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17"
+ "\16\14\244O;\36\377\321\200*\377\323\177,\377\253u.\377\22\17\13\252\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10t!\34\20\377\241^\34\377\307k\32\377"
+ "A(\22\377\10\7\5\377\31\24\14\377\306q\35\377\322x!\377\331\2052\377\33\27"
+ "\20\377\0\0\0\0\0\0\0\0\7\7\6\27\"\34\23\306.$\31\377'\37\26\377)!\26\377"
+ ";.\34\3773(\32\377=/\34\377\264\205G\377\343\257d\377\342\257g\377\265\217"
+ "X\377\21\20\14\216\0\0\0\0\0\0\0\0\13\13\12\252\326\246a\377\345\263r\377"
+ "\344\271o\377\241yD\377\27\25\20\343\27\26\22\252\26\25\21\252\20\17\15\252"
+ "\13\13\10\223\10\10\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\265\217X\377\344\271{\377\332"
+ "\250a\377F6#\377\11\11\10q\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10UxW-\377\337\267"
+ "x\377\347\276\204\377\247\207P\377\30\26\23\343\23\22\20\252\23\22\20\306"
+ "_P.\377\342\301\201\377\344\273\201\377\272\224W\377\17\16\14\252\0\0\0\0"
+ "\0\0\0\0\12\12\11U\233q@\377\345\304\204\377\350\277\205\377\263\216Z\377"
+ "\33\31\24\343\22\22\17\252\23\22\20\306ZG-\377\336\257e\377\343\256b\377"
+ "\344\271o\377\34\31\23\377\0\0\0\0\0\0\0\0\7\7\6\27\"\34\23\3061#\26\377"
+ "'\35\22\343\14\13\11U\0\0\0\0\0\0\0\0\10\7\7\34!\32\20\3064'\27\377/#\26"
+ "\343\15\14\10U\0\0\0\0\0\0\0\0\10\10\7\34!\36\30\343\311\235d\377\346\272"
+ "{\377\265\211J\377\20\17\13\317\6\6\5\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\13\12\10\34\33\25\14\301\32\23\13\377\27\22\12\377\27\22"
+ "\12\377\30\22\13\377\30\22\13\377\32\24\13\377#\33\20\377*\37\23\361\21\16"
+ "\12U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\220"
+ "[C$\377\331\232H\377\323\226F\377E7\"\377\17\16\14U\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\13\13\13\12\216\30\26\23\377\247"
+ "\207P\377\341\254h\377\340\246S\377\301~6\377\20\16\13\252\0\0\0\0\0\0\0"
+ "\0\15\14\10U\271a\32\377\317p\34\377\314n\33\377G.\26\377\10\10\7\377\34"
+ "\26\15\377\306k\33\377\301o\36\377~N\37\377\307\213>\377\342\270o\377\33"
+ "\30\22\377\0\0\0\0\0\0\0\0\13\12\10\252\326\246a\377\346\273w\377\344\263"
+ "g\377\217f0\377\21\20\14\343\14\14\11\252\15\14\12\306.!\21\377\307p\34\377"
+ "\316o\33\377\314n\33\377\40\27\15\260\0\0\0\0\0\0\0\0\14\13\11\210\314\206"
+ ";\377\342\254_\377\344\265k\377\242}I\377\30\26\23\343\23\22\20\252\23\22"
+ "\20\306_P.\377\340\263m\377\337\255_\377\255u2\377\17\15\12\234\0\0\0\0\0"
+ "\0\0\0\14\13\7c\271a\32\377\320p\33\377\314n\33\377\26\22\13\377\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\20\17\15\252\333\263t\377\350\302\205\377\347\301\200\377(!\27\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\20\17\15\252\333\261p\377\346\273w\377\340\237S\377\30"
+ "\25\17\377\0\0\0\0\0\0\0\0\13\12\10\244\323\236R\377\345\270r\377\346\277"
+ "{\377\246\177M\377\26\25\21\343\26\25\21\252\24\23\15\252\16\15\13\34\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\303p\36\377\321j\36\377\316o\33"
+ "\377e?\32\377\20\16\13\343\27\25\20\252\35\33\26\252\15\15\14*\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252\330\247a\377\340\236W\377\330}-\377\30"
+ "\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\21\20\14\252\333\261p\377\350\303\211\377\347\275\200"
+ "\377\242}I\377\26\25\21\343\16\16\13\252\15\14\12\3062#\23\377\307p\34\377"
+ "\316o\33\377\314n\33\377\40\30\15\252\0\0\0\0\0\0\0\0\15\14\10]\302m!\377"
+ "\333\2136\377\340\236Q\377'\40\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\276h\33\377\320"
+ "p\33\377\314n\33\377\40\30\15\252\0\0\0\0\0\0\0\0\15\14\10U\270`\31\377\317"
+ "p\34\377\314f\33\377\201N\34\377\37\32\20\377\177T\"\377\333\223F\377\255"
+ "z>\377\17\16\14\324\6\6\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252"
+ "\325\233P\377\335\220D\377\331\2024\377\37\31\20\377\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\275c\32\377\320"
+ "p\33\377\314n\33\377\233W\32\377H.\25\377\263g$\377\337\234L\377\330\252"
+ "a\377\206`/\377\256\177G\377\335\247Z\377\337\223H\377\336\236K\377\27\23"
+ "\16\374\0\0\0\0\0\0\0\0\13\12\10\252\326\246a\377\347\273|\377\346\277{\377"
+ "\344\266u\377\336\257e\377@2!\377\7\7\6\345\32\27\23\377\334\257i\377\344"
+ "\267q\377\344\274u\377\31\25\20\377\0\0\0\0\0\0\0\0\13\12\10\252\331\260"
+ "p\377\350\305\211\377\350\307\207\377%\37\26\377\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\15\14\12\252\306u%\377\327\177*\377\331\2024\377\25\23\16\377\0\0\0\0\0"
+ "\0\0\0\13\12\10\247\327\254h\377\350\277\205\377\347\276\204\377\246\177"
+ "M\377\27\25\20\343\22\21\17\252\21\20\14\306J4\33\377\314u!\377\323o\36\377"
+ "\255]\34\377\17\14\10\244\0\0\0\0\0\0\0\0\15\14\10X\271a\32\377\320p\33\377"
+ "\314n\33\377\23\20\12\377\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\276h\33\377"
+ "\324v#\377\330\2103\377\25\23\16\374\0\0\0\0\0\0\0\0\13\12\10\247\327\254"
+ "h\377\350\302\177\377\347\301\200\377\246\201M\377\27\25\20\343\23\22\20"
+ "\252\23\22\16\306Q;\"\377\325\220>\377\327\214<\377\245l(\377\15\14\12\247"
+ "\0\0\0\0\0\0\0\0\10\10\7Ue?\32\377\316r!\377\324y!\377\233\\$\377\27\25\20"
+ "\343\26\25\21\252\34\32\25\252\25\24\22\252\15\15\14\244\12\12\11U\6\6\6"
+ "\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\302"
+ "p\37\377\324w%\377\330\206-\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\20\17\15\252\331\253j\377\347\273|\377\344\265k\377'\40"
+ "\26\377\0\0\0\0\0\0\0\0\0\0\0\0\20\17\13\252\320\2067\377\337\234F\377\335"
+ "\224F\377\27\24\16\356\0\0\0\0\0\0\0\0\13\12\10\252\314\2107\377\337\234"
+ "F\377\336\236K\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\331\253"
+ "j\377\350\275\177\377\346\272{\377\31\26\20\377\0\0\0\0\0\0\0\0\12\12\11"
+ "\247\322\233M\377\342\254_\377\340\245Q\377\37\32\22\377\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\17\15\14\252\331\255h\377\350\277\205\377\347\303"
+ "\204\377(!\27\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\11\205I:"
+ "$\377\341\270x\377\347\301\200\377\344\264o\377\223f0\377\17\15\12\343\10"
+ "\7\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\7\306d;\27"
+ "\377\251]\32\377\234[\33\377\256`\33\377\264c\33\377\250a\33\377i>\30\377"
+ "\22\17\11\377\7\6\6""0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7"
+ "\7\7\34\17\17\14\343\220rC\377\333\261p\377\337\260f\377\231q>\377\21\20"
+ "\14\343\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252\325\233P\377"
+ "\337\222F\377\331\2012\377\33\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\14\12\11\303\241^\34\377\317r\40\377\301r$\377\27\24\20\377"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11"
+ "\252\277i\34\377\317d\34\377\314n\33\377\32\24\13\314\0\0\0\0\0\0\0\0\6\5"
+ "\5\3\32\23\11\306\30\22\11\366\17\14\10\216\0\0\0\0\0\0\0\0\0\0\0\0\17\15"
+ "\12[\37\30\20\3643'\30\377\25\23\16[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11L=1\36\377\24\22\15\234\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\21\17\14\216\33\26\16\350\36\26\15\377\31\24\14\377"
+ "\26\22\13\356\25\20\12\377c:\26\377\313q\32\377\315o\34\377\203P\36\377\14"
+ "\13\11\216\0\0\0\0\0\0\0\0\13\12\10\252\324\240U\377\350\277\177\377\347"
+ "\303\204\377\304\233[\377Q;\"\377)\40\24\3776+\33\377\264\205G\377\330\220"
+ ";\377\320s!\377\201N\34\377\14\13\7\216\0\0\0\0\0\0\0\0\10\7\7""9H4\35\377"
+ "\327\233N\377\343\256b\377\317\236^\377U?\"\377$\35\23\3779+\32\377\275\202"
+ "B\377\333\225B\377\324y)\377\254i!\377\21\17\12\223\0\0\0\0\0\0\0\0\7\6\6"
+ """6:(\25\377\306q\35\377\316g\33\377\245W\30\377*\34\15\377\25\20\10\377"
+ "\33\24\12\377_<\26\377\312i\33\377\316d\35\377\314n\33\377#\30\14\252\0\0"
+ "\0\0\0\0\0\0\7\7\6""6F2\33\377\324\221A\377\343\256b\377\311\233X\377;,\34"
+ "\377\27\24\16\377\"\34\23\377\235h0\377\323~*\377\320s!\377\204R\35\377\15"
+ "\13\10\216\0\0\0\0\0\0\0\0\0\0\0\0\30\22\11\335l=\27\377\311p\32\377\317"
+ "p\34\377\314n\33\377\236[\31\377.\35\15\371\13\12\6""9\0\0\0\0\0\0\0\0\10"
+ "\10\7""9F2\33\377\324\216;\377\342\254_\377\317\236^\377U?\"\377)\40\24\377"
+ "9+\32\377\256|;\377\340\252]\377\345\270r\377\347\304\200\377\34\31\23\377"
+ "\0\0\0\0\0\0\0\0\12\12\11\247\327\251f\377\350\277\177\377\347\301\200\377"
+ "\304\232W\377M;\"\377)\37\24\3776+\33\377\250q1\377\324y)\377\316r!\377\204"
+ "R\35\377\14\13\11\202\0\0\0\0\0\0\0\0\14\13\7n\274b\31\377\316o\33\377\316"
+ "j\31\377\32\23\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16"
+ "\14\11\252\307u$\377\335\224>\377\343\256b\377\34\32\23\377\0\0\0\0\0\0\0"
+ "\0\12\12\11\247\324\241Y\377\340\246S\377\331\2012\377\40\30\17\377\5\5\4"
+ "\37\7\7\6\210A,\26\377\300j\35\377\313l\30\377rB\27\377\21\15\10\335\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\12\11\7\213\271a\32\377\320p\33\377\320u\35\377\40\30"
+ "\15\252\0\0\0\0\0\0\0\0\17\15\10[\275c\32\377\327{*\377\342\254_\377\306"
+ "\230W\377Q:\"\377\260\205G\377\340\250_\377\305\212>\377A/\32\377\205Q\36"
+ "\377\320y%\377\324s%\377\230b#\377\14\13\11\216\0\0\0\0\0\0\0\0\12\11\7\223"
+ "\276k\31\377\316o\33\377\316j\31\377\236[\31\377*\34\15\377\25\17\10\377"
+ "\32\23\11\377rB\27\377\314q\31\377\320s!\377\255z>\377\20\17\15\226\0\0\0"
+ "\0\0\0\0\0\10\10\7GnW3\377\336\264q\377\340\246S\377\321\211<\377\205T\40"
+ "\377M2\30\377Y;\32\377\265m\40\377\322y#\377\324y)\377\253t4\377\17\16\14"
+ "\216\0\0\0\0\0\0\0\0\16\15\13\252\333\261p\377\347\273|\377\344\264o\377"
+ "\315\236Z\377O:\40\377&\35\23\3771#\26\377\247r.\377\331\222>\377\333\232"
+ "F\377\251u8\377\17\15\14\234\0\0\0\0\0\0\0\0\10\10\7GhP-\377\340\267w\377"
+ "\350\277\177\377\322\246a\377Q<\40\377'\36\22\3774(\31\377\257\200B\377\341"
+ "\255b\377\344\264i\377\342\257_\377\35\31\22\377\0\0\0\0\0\0\0\0\14\14\13"
+ "\252\320\2127\377\336\221?\377\334\213;\377\301y2\377D2\35\377&\34\23\377"
+ "0#\27\377\257p,\377\331\2166\377\331\220B\377\277\211B\377\23\20\14\252\0"
+ "\0\0\0\0\0\0\0\11\10\10JoR(\377\330\233K\377\342\254_\377\310\227Q\3779)"
+ "\32\377\33\27\20\377#\34\22\377)\40\24\377'\36\24\377\31\26\20\343\17\16"
+ "\12\216\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34!\30\16\343\207Q\34\377\316u\37"
+ "\377\322l!\377\320n\37\377\253\\\34\3771!\20\374\15\13\10D\0\0\0\0\0\0\0"
+ "\0\13\12\10\252\303l\36\377\324v#\377\331\2114\377*!\27\377\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\24\22\17\252\326\234Q\377\335\224>\377\326\177+\377\27\23\14\356"
+ "\0\0\0\0\0\0\0\0\12\12\7\237\304m\37\377\325w$\377\324{%\377\37\30\16\377"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\321\211<\377\344\254c\377\346\275w"
+ "\377\34\32\23\377\0\0\0\0\0\0\0\0\14\14\13\252\320\2067\377\332\2113\377"
+ "\326\177+\377#\33\20\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13"
+ "\252\307t\"\377\331\2040\377\340\246S\377\40\32\23\377\0\0\0\0\0\0\0\0\12"
+ "\12\7\"Q:\"\377\340\262i\377\342\254_\377\201\\(\377\11\11\10\252\6\6\6U"
+ "\6\6\5q#\33\20\377\314u!\377\320u\35\377nE\31\377\16\14\7l\0\0\0\0\0\0\0"
+ "\0\12\12\7\252\303p\36\377\323s\36\377\323s\36\377\36\27\15\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\16\14\11\252\304q\37\377\323x\40\377\326~)\377!\32\22\377"
+ "\0\0\0\0\0\0\0\0\11\10\6\34,!\23\324<*\27\377.#\25\377J5\37\377\234m5\377"
+ "\330\247a\377\344\263m\377\345\261n\377\343\270l\377\250{E\377\27\25\20\343"
+ "\11\10\10\34\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\206b3\377\337\246\\\377"
+ "\204d5\377\11\11\10\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15"
+ "\252\333\261p\377\350\277\205\377\347\303\204\377(!\27\377\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5-'\40\26\377\322\2011\377\254j#\377\24\21"
+ "\15\343\13\13\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\21\21\16\252\335\275\204\377\353\315\232\377\352\315\233\377*'\35\377"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\11\10\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\16\13"
+ "\252\320\215=\377\340\250W\377\344\256g\377\37\32\24\335\0\0\0\0\15\14\14"
+ "\202\332\271\177\377\352\312\223\377\350\306\213\377(!\31\377\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\260\214sG\377\346\312\223\377\350\312"
+ "\225\377\332\252e\377\310|+\377\306u%\377\306u%\377\304t%\377H4\33\377\14"
+ "\13\11\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\0\0\0\0\10\10"
+ "\7U%\37\24\377\256n)\377\322{'\377\314x%\377\202W\37\377\17\15\12\276\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4q\34\32\23\377"
+ "\322\217A\377\334\243Q\377\331\246\\\377\336\255a\377\341\260b\377*%\31\377"
+ "\4\4\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\320\215=\377"
+ "\342\254_\377\344\267o\377(\"\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\21\20\16\252\333\261p\377\350\302\205\377\351\312\224\377\33"
+ "\30\24\377\0\0\0\0\0\0\0\0\20\17\15U\307\241f\377\334\246Y\377\323\217>\377"
+ "\331\232H\377\337\241P\377\340\251[\377\341\271r\377\345\274|\377\347\276"
+ "\204\377\347\310\217\377\343\303\214\377\343\304\212\377\341\303\210\377"
+ ",%\33\252\0\0\0\0\0\0\0\0\21\20\16U\310\245m\377\343\306\216\377\341\277"
+ "\204\377\343\303\206\377\347\307\210\377\347\305\204\377\347\302|\377\345"
+ "\277\202\377\341\303\210\377\341\303\210\377\341\277\204\3771*\36\306\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\21"
+ "\15i\301\207B\377\335\257f\377\336\272{\377\337\276\204\377\340\300\207\377"
+ "\337\276\204\377\336\272{\377\335\262n\377\332\254i\377.'\33\303\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\6\6\6\34\33\32\24\377\330\252a\377\341\262h\377\260\210"
+ "S\377\20\17\15\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\335\274\202"
+ "\377\353\315\232\377\352\315\233\377\350\314\225\377\344\307\217\377\253"
+ "\220`\377@9)\377\232~Q\377\343\275z\377\346\270w\377\343\253b\377\"\36\25"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\335\272"
+ "~\377\352\312\223\377\350\300\207\377,'\33\377\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\216"
+ "\31\30\24\377r_5\377\317\251f\377\343\273v\377\342\274{\377\262\224_\377"
+ "\23\22\20\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\0\0\0\0\0\0"
+ "\0\0\30\26\23U\305\221T\377\343\273v\377\347\302|\377\317\255r\377=7&\377"
+ "\10\10\10\210\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11l-$\25\377\303t&\377\317z&"
+ "\377\213Z\40\377\15\14\10\252\0\0\0\0\12\12\11\306\320\214;\377\342\252["
+ "\377\347\301\200\377(#\33\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\34\22\21\15\343\336\275\203\377\352\311"
+ "\217\377\345\277\202\377\"\36\27\314\0\0\0\0\0\0\0\0\13\13\12\252\323\236"
+ "R\377\342\252[\377\340\245Q\377\333\232F\377\320\2043\377\316\200-\377\314"
+ "z)\377\311x(\377\304t%\377oJ\36\377\24\22\15\343\10\10\7\34\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\6\34\34\32\25\377\336\272"
+ "{\377\345\304\204\377\265\220\\\377\20\17\15\324\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\6\6\6U\31\30\24\377\264\225e\377\347\315\232\377\350\314\225\377"
+ "\343\306\216\377\337\300\212\377\337\301\210\377\346\307\213\377\350\305"
+ "\215\377\323\260z\377@9)\377\10\10\7q\0\0\0\0\0\0\0\0\6\6\5\16!\37\30\343"
+ "\272\233k\377\350\314\225\377\351\315\230\377\343\305\214\377\335\275\204"
+ "\377\340\300\207\377\344\306\215\377\350\311\215\377\350\300\207\377\347"
+ "\305\204\377)#\32\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\21\20\16\213\323\262x\377\351\312\224\377\351\312\224\37780!\377\4\4"
+ "\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\13"
+ "\12\377\330\244Y\377\346\277{\377\343\303\206\377(#\33\343\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\343~iE\377\331\260p\377"
+ "\341\257h\377\337\237L\377\275|1\377+#\24\377\11\10\10""9\0\0\0\0\0\0\0\0"
+ "\12\12\11\205\302m!\377\327}&\377\324|'\377\220]!\377\35\30\20\377D5\35\377"
+ "\272{1\377\200_/\377\31\30\24\377\217wN\377\346\311\221\377!\36\30\377\0"
+ "\0\0\0\0\0\0\0\13\13\12\252\331\260p\377\344\266m\377\336\236K\377\324\206"
+ "3\377\314z)\377\306u%\377\310v%\377\320{'\377\324{%\377\326y'\377\331\205"
+ "2\377\30\25\17\364\0\0\0\0\0\0\0\0\13\13\12\252\332\271\177\377\353\313\224"
+ "\377\351\312\224\377\346\311\221\377\343\305\214\377\335\273\200\377\335"
+ "\270x\377\340\262i\377\340\244U\377\275\201:\377'\40\24\377\7\7\6U\0\0\0"
+ "\0\0\0\0\0\13\12\10}\302m!\377\327}&\377\325}(\377\35\30\20\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21"
+ "\21\16\252\335\274\202\377\353\311\230\377\350\311\215\377*$\33\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\21\21\16\252\333\263t\377\347\273|\377\344\267o\377\30"
+ "\26\21\377\0\0\0\0\0\0\0\0\13\13\12\252\332\271\177\377\350\305\211\377\343"
+ "\263h\377\333\233H\377\320\2043\377\314z)\377\312x'\377&\37\23\252\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327q&\377\325z*\377\327"
+ "\217:\377\331\246\\\377\336\272{\377\341\303\210\3774,!\306\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\21\20\16\252\323\226F\377\333\2148\377\325~*\377\31\25"
+ "\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\21\21\16\252\335\273\200\377\350\307\215\377\344\264o\377"
+ "\333\233H\377\317\200,\377\307w'\377\310v%\377\320{'\377\324{%\377\326}'"
+ "\377\324|'\377\"\32\17\265\0\0\0\0\0\0\0\0\13\12\12\241\327\254h\377\352"
+ "\311\217\377\352\316\227\377*'\35\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327}"
+ "&\377\324|'\377$\34\21\252\0\0\0\0\0\0\0\0\17\16\12U\302m!\377\327}&\377"
+ "\324|'\377\322\200)\377\323\2076\377\341\260b\377\347\305\204\37780!\377"
+ "\4\4\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\316\2073\377"
+ "\331\2052\377\325z*\377\31\25\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327}&\377\325z*\377C"
+ "3\34\377\6\6\5\377(\"\31\377\342\276\177\377\212nE\377\7\7\7\377\31\30\24"
+ "\377\335\263p\377\350\277\177\377\350\311\215\377\32\27\23\377\0\0\0\0\0"
+ "\0\0\0\13\13\12\252\326\250e\377\346\273w\377\344\274u\377\324\255i\377\226"
+ "vC\377fV/\377oZ2\377\271\221X\377\343\273v\377\347\303\204\377\350\311\215"
+ "\377\32\27\23\377\0\0\0\0\0\0\0\0\13\13\12\252\333\270\200\377\353\315\232"
+ "\377\352\316\227\377*$\33\377\0\0\0\0\0\0\0\0\0\0\0\0\17\17\14\252\325\236"
+ "P\377\344\266m\377\346\277{\377\33\27\22\377\0\0\0\0\0\0\0\0\13\13\12\252"
+ "\333\275\204\377\353\315\232\377\350\305\215\377\341\271r\377\327\233N\377"
+ "\316\2073\377\315~*\377\321\200*\377\324y)\377\265o$\377'\36\22\377\10\10"
+ "\7""9\0\0\0\0\0\0\0\0\12\12\11\210\302m!\377\327}&\377\324|'\377\30\24\15"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\252\322\222G\377\345\267n\377\347\305"
+ "\204\377\32\27\23\377\0\0\0\0\0\0\0\0\13\13\12\252\332\275\177\377\352\307"
+ "\217\377\347\305\204\377\341\260j\377\326\231K\377\320\2127\377\315\2050"
+ "\377\322\177-\377\326\2061\377\263w*\377%\36\22\377\7\7\6U\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\27\24\16\343\241s2\377\336\247Y\377\343\272r\377\341\276\202\377"
+ "\337\306\210\377\343\306\216\377\340\304\215\377\335\277\206\377\241\202"
+ "V\377!\36\30\345\12\12\11*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\17\17\14\252\323\225L\377\344\266m\377\347\275\200\377,'\33\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\330\252a\377\342"
+ "\254_\377\340\245Q\377\37\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252"
+ "\311x(\377\331\2052\377\330}-\377\31\25\16\324\0\0\0\0\0\0\0\0\13\12\10\220"
+ "\313\2024\377\340\246S\377\344\256g\377(\"\31\377\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\21\20\16\252\335\273\200\377\352\311\217\377\346\277{\377\34\31\23\364\0"
+ "\0\0\0\0\0\0\0\12\12\11\244\313z2\377\334\224?\377\331\2154\377\27\24\16"
+ "\377\0\0\0\0\0\0\0\0\16\15\13l\12\12\11\34\0\0\0\0\15\15\14\252\335\275\206"
+ "\377\353\315\232\377\352\316\227\377*%\33\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\13\13\12\377\336\275\203\377\350\303\203\377\340\242"
+ "Q\377$\35\23\377\4\4\4""6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\7\7\6\34\23\21\14\350]B\36\377\267p$\377\321z&\377\324x'\377\237"
+ "f\"\377\26\23\15\377\7\7\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\6\6\5\34\21\20\16\343\225zT\377\343\303\214\377\343\277\206\377\263\216"
+ "Z\377\21\20\16\343\5\5\4\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16"
+ "\14\252\314\2011\377\332\2153\377\325~*\377\31\25\16\377\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\7[D0\31\377\315\177,\377\334\231K\377"
+ "cN,\377\10\10\7q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\14\13\11\252\304n!\377\327}&\377\324|'\377\30\24\15\377\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\11\11\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\2\1\27\11\10\6\377\307t\"\377\327"
+ "}&\377\324\200-\377\33\30\20\317\0\0\0\0\0\0\0\0\13\13\12\252\333\270\200"
+ "\377\353\315\232\377\352\315\233\377:1#\377\5\5\4U\0\0\0\0\4\4\3\34\20\17"
+ "\13\343\314z)\377\327~(\377\322{'\377\40\31\17\252\0\0\0\0\0\0\0\0\15\15"
+ "\14z\320\250c\377\352\307\217\377\352\314\227\377?6&\377\5\5\4U\0\0\0\0\4"
+ "\4\3\34\22\21\15\327\314\177-\377\326}'\377\324y)\377\"\33\17\252\0\0\0\0"
+ "\0\0\0\0\15\14\12U\271p\"\377\327}&\377\324{%\377#\34\20\377\4\4\3U\0\0\0"
+ "\0\3\3\2\34\14\12\11\340\306u%\377\327}&\377\324|'\377\"\33\17\262\0\0\0"
+ "\0\0\0\0\0\16\15\13q\316\242^\377\350\307\215\377\352\317\233\377?5$\377"
+ "\4\4\3q\0\0\0\0\3\3\3\34\12\12\11\377\310v%\377\327}&\377\322{'\377\33\26"
+ "\16\343\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\6\15\13\10\335\307t\"\377\327}&\377"
+ "\324|'\377#\33\20\377\5\4\4""9\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\223\316\232"
+ "W\377\350\303\211\377\352\314\227\377?6&\377\5\5\4U\0\0\0\0\4\4\3\34\22\20"
+ "\15\343\336\275\203\377\353\315\230\377\352\315\233\377\33\30\24\377\0\0"
+ "\0\0\0\0\0\0\13\13\12\252\333\270\202\377\353\315\230\377\352\315\233\377"
+ ":1#\377\5\5\4U\0\0\0\0\4\4\3\34\16\14\11\343\307u$\377\327q&\377\322{'\377"
+ "\40\31\17\252\0\0\0\0\0\0\0\0\14\14\11f\302m!\377\327}&\377\324|'\377\33"
+ "\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\20\15\252\331"
+ "\260n\377\352\304\217\377\352\314\227\377\33\30\24\377\0\0\0\0\0\0\0\0\13"
+ "\12\12\252\314\206;\377\333\2106\377\325z*\377H2\33\377\10\10\7\377\31\26"
+ "\16\377\303t&\377\320{'\377\216[\37\377\20\16\11\301\4\4\3\21\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\13\13\10\252\306u%\377\333\2058\377\335\230F\377\33\27\20\335"
+ "\0\0\0\0\0\0\0\0\15\14\12c\301q\"\377\337\234F\377\347\301\200\377(\"\31"
+ "\377\4\3\3q\21\20\14\343\320\210;\377-$\25\377\4\3\3q\12\11\7\317\304n!\377"
+ "\327}&\377\322\200)\377\40\31\17\252\0\0\0\0\0\0\0\0\14\13\11l\302m!\377"
+ "\327}&\377\324|'\377#\33\20\377\4\4\3U\0\0\0\0\3\3\2\34\14\13\11\343\307"
+ "u$\377\335\226B\377\345\277~\377\40\35\27\322\0\0\0\0\0\0\0\0\15\15\14z\314"
+ "\226O\377\337\237L\377\331\2154\377T9\35\377\11\10\6\252\5\5\4U\6\6\5q\33"
+ "\26\16\377\317\200,\377\337\223H\377\343\273v\377\"\36\27\317\0\0\0\0\0\0"
+ "\0\0\14\13\13\252\332\264w\377\345\270r\377\340\247U\3772(\31\377\5\5\4U"
+ "\0\0\0\0\4\4\3\34\16\14\11\343\313}*\377\331\2000\377\325\200-\377#\33\20"
+ "\255\0\0\0\0\0\0\0\0\14\14\13\202\321\243b\377\353\313\224\377\351\312\224"
+ "\377?6$\377\5\5\4U\0\0\0\0\4\4\3\34\17\17\14\343\321\211<\377\335\227D\377"
+ "\333\223>\377\27\24\16\356\0\0\0\0\0\0\0\0\12\12\11\226\304y)\377\331\200"
+ "0\377\327\205,\377(\37\23\377\5\5\5U\0\0\0\0\4\4\3\34\20\16\13\317\311x("
+ "\377\331\2052\377\335\241L\3779,\34\252\0\0\0\0\0\0\0\0\17\16\14i\323\245"
+ "b\377\350\305\211\377\350\307\215\377:1#\377\4\4\3q\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\21\14\13"
+ "\11\343\307t\"\377\327}&\377\324|'\377#\33\20\377\4\4\3>\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\14\13\11\252\310x)\377\337\237L\377\346\277{\377,%\33\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\22\21\17\252\320\214;\377\331\2052\377\325}(\377\33\27"
+ "\16\303\0\0\0\0\0\0\0\0\14\13\11l\302m!\377\327}&\377\324|'\377\31\25\16"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\333\263t\377\353\311\230\377\352"
+ "\314\227\377\33\30\24\377\0\0\0\0\0\0\0\0\12\12\11\252\306z)\377\327\177"
+ "*\377\325}(\377\33\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13"
+ "\11\252\311x(\377\340\234S\377\347\276\204\377(!\31\377\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\12\12\11U4*\35\377\310\216;\377\267w,\377H4\33\377'\36\22\3771%\26"
+ "\377\226c!\377\304t%\377M2\30\377\12\11\7\220\0\0\0\0\0\0\0\0\0\0\0\0\12"
+ "\12\11\252\304s#\377\327}&\377\324|'\377\31\25\16\377\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\14\13\11\252\304n!\377\326\177+\377\336\236K\377)\"\30\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4U\13\13\12\377\202e;\377\337"
+ "\260f\377\340\260e\377\261\211J\377\22\21\15\343\6\5\5\34\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\24\23\17U\272x1\377\331\216>\377\331\2138\377\"\35\23\377\4\4\3"
+ "\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\335\274\202\377"
+ "\353\315\230\377\352\315\233\377*'\35\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\15\15\12\265\307w'\377\324y)\377\313y(\377#\35\21\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\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\22\17\252\336\272"
+ "{\377\352\311\217\377\350\305\207\377/(\34\377\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\325\240T\377\346\273w\377\347"
+ "\305\204\377#\36\26\306\0\0\0\0\16\15\13l\331\260p\377\350\301\211\377\347"
+ "\305\204\377!\34\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14"
+ "\14\13q\37\35\26\322(#\33\377)\"\30\377\35\30\20\377\40\32\21\377\222\\#"
+ "\377\326\2061\377\324\200-\377{Q$\377\17\15\12\216\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\7\7\6U\34\32\23\374\302\214G\377\324\177+\377\312v#\377"
+ "aB\36\377\17\16\12\317\6\6\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\6\6\5\10\17\15\14\343oV2\377\321\250f\377\260\210S\377UC,\377\243"
+ "\201P\377\335\272~\377SE,\377\7\7\6\252\5\5\5\10\0\0\0\0\11\11\10l\24\22"
+ "\15\252\15\14\12""3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\20\17\15\252\331\260n\377\350\302\205\377\350\306\213"
+ "\377$!\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\17\14\252"
+ "\333\263t\377\350\301\211\377\350\307\207\377\37\32\24\377\0\0\0\0\0\0\0"
+ "\0\13\13\12\34""80!\343bL-\377hP-\377\303\232`\377\343\272r\377\342\275}"
+ "\377\317\255r\377\336\274{\377\347\276\204\377\331\274|\377\211mF\377cV6"
+ "\377N@+\377\25\24\20U\0\0\0\0\0\0\0\0\14\14\13\34""60#\343VH/\377J?+\377"
+ "\253\211T\377\345\277\202\377\346\277{\377\346\272{\377\312\244i\377aP2\377"
+ "K@,\377H='\377\26\25\21f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\14\13\13-7-\36\343ZG-\377N?)\377H='\377J?+\377H"
+ "='\377H='\377[J.\377N?)\377\26\24\21f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\260"
+ "\204j=\377\344\274}\377\322\254q\377*%\35\377\11\11\10>\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\21\20\16\252\335\272|\377\352\307\217\377\350\311\215\377"
+ "\350\311\215\377\335\275\206\3774.!\377\6\7\6\343\30\27\21\377\320\2043\377"
+ "\327\205,\377\324|'\377\30\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\21\20\14\252\333\261p\377\347\273|\377\344\266m\377(!\27\377"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\11\11\10J\21\17\14\343C3\34\377\242k+\377\310\216C\377\314\235[\377\261"
+ "\214V\377J?+\377\23\21\20\306\11\11\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\16\13\37""8.\37\343\300\235g\377\345"
+ "\302\200\377\341\274|\377\222pC\377\13\12\10\244\0\0\0\0\0\0\0\0\7\7\6\34"
+ "\"\33\21\377\276k!\377\322y#\377\222_#\377\20\16\13\273\0\0\0\0\0\0\0\0\11"
+ "\11\10\252\326\244]\377\350\302\177\377\347\303\204\377(\"\31\377\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\15\15\12\252\325\235T\377\340\246S\377\335\226B\377\27\24\16\366\0\0\0\0"
+ "\0\0\0\0\14\13\11q\302m!\377\324w%\377\322q#\377\250g!\3778*\27\377\33\27"
+ "\16\377&\37\23\377\225\\\36\377\317v\40\377\317q\36\377|K\33\377\15\13\10"
+ "\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\0\0\0\0\14\14\13\260"
+ "\202c;\377\345\277~\377\323\256t\377+%\34\377\11\11\10;\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\10\10\7UD:%\377\326\261w\377\347\304\210\377\317\253r\377"
+ "aP2\3776/#\377B;)\377\262\224_\377\344\275y\377\340\273{\377\222pC\377\14"
+ "\14\13\252\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11\34\20\17\15\223\35\34\26\335"
+ "0*\37\377F=)\377B9'\377F=)\377\253\214\\\377\340\252e\377\340\250W\377\340"
+ "\245Q\377'\40\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\16\15\13""9dR3\377\336\272{\377\342\254_\377qR&\377\11\10\10\177\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6f\13"
+ "\12\6\252\13\12\10\252\14\13\11\252\17\15\12\252\17\15\12\252\17\16\12\252"
+ "\22\17\13\252\22\17\13\234\14\13\11\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\6\6\5A(\"\31\377\340\267w\377\345\303\210\377\253"
+ "\214\\\377\25\24\22\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13"
+ "\12\10f\203\\.\377\325\2218\377\326w+\377\322\200)\377\227^\40\377\27\25"
+ "\16\377\12\12\11U\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\277j\36\377\323s\36"
+ "\377\320r\37\377\215W\36\377$\37\23\377yZ*\377\331\250\\\377\315\243f\377"
+ "\204f;\377\325\254l\377\347\301\200\377#\36\26\377\0\0\0\0\0\0\0\0\13\13"
+ "\12\244\313\2012\377\327\177*\377\323u\"\377\246a\35\3776(\25\377\35\27\16"
+ "\377&\37\23\377xN\35\377\316v!\377\326\177+\377\340\233Q\377\27\25\20\377"
+ "\0\0\0\0\0\0\0\0\13\12\12\252\331\267t\377\352\311\217\377\350\306\213\377"
+ "\312\246m\377aN2\3774.!\377:2!\377\226`'\377\320y%\377\303p\36\377S5\30\377"
+ "\11\10\6q\0\0\0\0\0\0\0\0\15\14\10`\275h\34\377\322x!\377\326\204-\377\""
+ "\35\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\21\20\14\252\331\254f\377\344\264i\377\344\265k\377(!"
+ "\27\377\0\0\0\0\0\0\0\0\0\0\0\0\21\17\14\252\330\253e\377\350\277\177\377"
+ "\347\305\204\377\30\26\21\377\0\0\0\0\0\0\0\0\13\13\12\247\321\222H\377\335"
+ "\227D\377\325~*\377\254j#\3779)\26\377*\40\23\377+!\24\374\22\17\13U\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\327q&\377\334\220?"
+ "\377\305\221T\377[G,\377K>*\377K@,\377\26\25\21c\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\16\15\13\252\304n!\377\322s\37\377\322s\37\377\26\23\13\343\0\0"
+ "\0\0\0\0\0\0\20\15\11q\30\25\17\252\21\17\14\252\22\17\15\252\23\21\14\216"
+ "\11\10\10\34\0\0\0\0\0\0\0\0\16\15\13\252\322\222G\377\334\216;\377\325}"
+ "(\377\250g!\3776(\25\377\35\27\16\377&\37\23\377wN\36\377\314t\37\377\322"
+ "w\37\377\322s\37\377\32\24\15\322\0\0\0\0\0\0\0\0\13\13\12\252\331\263x\377"
+ "\352\312\223\377\350\311\215\377(#\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377"
+ "\323s\36\377\322s\37\377$\31\15\252\0\0\0\0\0\0\0\0\16\14\11U\276i\35\377"
+ "\322k\37\377\320r\37\377\273|*\377\217o8\377\322\253m\377\345\273\200\377"
+ "\203c6\377\10\10\7\234\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252"
+ "\302p\37\377\322k\37\377\322s\37\377\26\23\13\377\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\327}&\377"
+ "\332\215;\377'!\26\377\5\5\5\34\14\14\13\252\234~S\377\33\30\24\343\5\5\5"
+ "\27\16\15\13\306\333\261p\377\350\277\177\377\346\277{\377\31\26\20\371\0"
+ "\0\0\0\0\0\0\0\13\12\10\231\310x)\377\326\177+\377\325~*\377]B\40\377\13"
+ "\13\12\377\"\37\27\377\316\230Q\377\342\263o\377\347\275\200\377\350\300"
+ "\207\377\350\311\215\377\31\26\22\377\0\0\0\0\0\0\0\0\13\12\12\252\327\253"
+ "f\377\344\256i\377\336\236K\377\33\30\20\377\0\0\0\0\0\0\0\0\0\0\0\0\17\17"
+ "\14\252\333\261p\377\350\301\211\377\350\311\215\377\31\26\22\377\0\0\0\0"
+ "\0\0\0\0\13\12\12\252\327\254h\377\344\266m\377\335\233F\377\261r.\3777*"
+ "\30\377#\34\22\377)\37\22\377#\34\21\377\33\26\16\377\21\20\14\273\11\11"
+ "\10O\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\277j\36\377\323s\36\377\322s\37"
+ "\377!\31\16\377\0\0\0\0\0\0\0\0\0\0\0\0\25\24\20\252\335\264t\377\350\301"
+ "\211\377\350\311\215\377\31\26\22\377\0\0\0\0\0\0\0\0\13\13\12\252\324\240"
+ "U\377\340\234S\377\332\215;\377\257s,\3777*\30\377\37\31\20\377&\36\23\377"
+ "\177R\36\377\314t\37\377\303p\36\377R7\31\377\13\12\10\226\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\11\11\10\34\17\16\14\216\34\31\23\335.(\35\377G<&\377B9'\377F"
+ "=)\377\301\237j\377\343\270l\377\335\231H\377\233b$\377\15\14\12\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\21\17\14\252\333\264p\377\350"
+ "\305\211\377\350\311\215\377(#\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\16\15\13\252\306u%\377\325|&\377\322y#\377\27\23\14\377\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\323s\36\377\320r\37\377\27"
+ "\23\14\317\0\0\0\0\0\0\0\0\16\15\13U\265\204D\377\344\271u\377\347\301\200"
+ "\3776.\37\377\5\5\4\10\0\0\0\0\0\0\0\0\25\24\20\262\327\240X\377\337\223"
+ "H\377\316\2073\377\27\24\16\252\0\0\0\0\0\0\0\0\14\13\11f\300o\37\377\322"
+ "l!\377\320r\37\377\26\22\13\377\0\0\0\0\12\12\11qO=&\377\21\20\14\306\0\0"
+ "\0\0\20\17\15\252\333\263t\377\347\273|\377\340\251[\377!\34\24\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\10U'!\30\377\331\246\\\377\333\214"
+ "8\377\322y#\377B,\25\377\7\7\6\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\0\0\0\0\0\0\0\0\6\6\5J\23\22\14\377\267f\36\377\317i\36\377\322"
+ "o\37\377I3\30\377\10\10\7t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\6\6\6\34\17\15\14\343\220p=\377\335\264t\377\340\262q\377\230tA\377\22"
+ "\21\15\335\10\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14"
+ "\12\11\252\301o\36\377\322k\37\377\322s\37\377\26\23\13\377\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\343\244z?\377\341\271"
+ "r\377\300\231a\377\25\23\20\350\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\323s\36\377\322s\37\377\27\23\14"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\6\6\5""3\13\11\6U\14\12\7f\12\10\5\234\12\10\5\177\10\7\5\270"
+ "\33\26\14\377\306i\35\377\323z$\377\334\210=\377\31\26\20\377\0\0\0\0\0\0"
+ "\0\0\12\12\11\252\332\265{\377\352\312\223\377\350\305\215\377\36\33\25\377"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\277j\36\377\323s\36\377\322o\37\377"
+ "'\33\16\252\0\0\0\0\0\0\0\0\14\13\13\252\332\264w\377\352\304\217\377\350"
+ "\311\215\377\35\32\24\377\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6\34\33\26\16\234\31"
+ "\26\16\377\40\31\17\322\26\22\13\34\0\0\0\0\0\0\0\0\12\11\7\226\303p\36\377"
+ "\323s\36\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\252"
+ "\277j\36\377\323o\36\377\320r\37\377\31\24\14\314\0\0\0\0\0\0\0\0\14\13\13"
+ "\252\332\264w\377\352\312\223\377\350\311\215\377\216o?\377\16\14\11\343"
+ "\12\11\7\177\10\7\5\265#\31\16\377\307p\34\377\321v\36\377\321u\34\377\36"
+ "\26\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323s\36"
+ "\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\23\20\252"
+ "\334\262q\377\350\305\211\377\350\311\215\377\32\27\23\377\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\13\13\12\252\332\265{\377\352\311\217\377\347\305\204\377\30\26"
+ "\21\377\0\0\0\0\0\0\0\0\13\12\12\252\332\265{\377\352\311\217\377\347\305"
+ "\204\377\36\32\25\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323"
+ "s\36\377\322o\37\377'\33\16\252\0\0\0\0\0\0\0\0\15\14\10U\276i\35\377\325"
+ "w$\377\326\204-\377\40\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\21\20\16\252\335\272|\377\352\312\223\377\350\307\207\377\31\26"
+ "\22\374\0\0\0\0\0\0\0\0\13\12\10\177\300o\37\377\322k\37\377\320r\37\377"
+ "\241^\34\377A+\24\377\221U\32\377\317u\36\377zK\35\377\17\16\12\252\5\5\4"
+ "\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\304s#\377\337\222F\377\344"
+ "\267o\377\31\26\20\374\0\0\0\0\0\0\0\0\16\14\11U\276i\35\377\327}&\377\332"
+ "\215;\377\36\30\21\303\0\0\0\0\12\12\7\252\301o\36\377\24\21\13\374\0\0\0"
+ "\0\13\12\10U\274g\33\377\323s\36\377\321j\36\377'\33\16\252\0\0\0\0\0\0\0"
+ "\0\15\14\10U\276i\35\377\323s\36\377\322s\37\377\23\17\12\377\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\11\10\6\247\300o\37\377\332\2113\377\343\257d\377\33\30\22\377"
+ "\0\0\0\0\0\0\0\0\13\12\10\223\304j!\377\322l!\377\322s\37\377\36\27\15\377"
+ "\4\4\3\16\0\0\0\0\0\0\0\0\17\16\14\303\323\225L\377\345\270r\377\350\307"
+ "\207\377\34\31\23\377\0\0\0\0\0\0\0\0\13\12\10\247\313\2012\377\327\177*"
+ "\377\322y#\377\24\21\13\350\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\213\276i\35\377"
+ "\323o\36\377\321r\36\377\36\26\15\306\0\0\0\0\0\0\0\0\15\14\12\252\331\255"
+ "h\377\350\301\211\377\350\302\213\377\31\26\22\377\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\11\10\10\234\300o\37\377\322l!\377\322s\37\377\40\30\15\255\0\0\0\0\0"
+ "\0\0\0\15\14\10X\276i\35\377\323s\36\377\320r\37\377\23\17\12\377\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\7\7\6\34\33\26\16\306-$\25\3774+\35\364\16\15\13U\0\0\0"
+ "\0\0\0\0\0\15\15\14X\261\217Z\377\346\302\203\377\342\254_\377\211[$\377"
+ "\12\11\7\343\10\10\5\241\12\11\7\247\12\11\7\210\15\12\6U\7\6\6J\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323s\36"
+ "\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252"
+ "\320\215=\377\346\273w\377\350\311\215\377(\"\31\377\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\16\14\11\252\304m\37\377\322k\37\377\322s\37\377$\31\15\252\0\0\0\0"
+ "\0\0\0\0\12\11\7U\233[\34\377\320r\37\377\321j\36\377\36\26\15\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\26\25\21\260\336\272{\377\352\307\217\377\342\303\207"
+ "\377#\35\26\262\0\0\0\0\0\0\0\0\14\13\11i\276i\35\377\323s\36\377\320r\37"
+ "\377\27\23\14\322\0\0\0\0\0\0\0\0\17\14\10;\7\6\4\3\0\0\0\0\11\11\10\237"
+ "\314\206;\377\346\266w\377\350\306\213\377'!\30\377\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\12\12\11\"\17\16\12\3064(\25\377\245`\34\377\306q\35\377\271f"
+ "\34\377P5\31\377\23\21\14\343\12\11\7L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13"
+ "\12\10\252\303p\36\377\323s\36\377\322s\37\377\24\20\13\377\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\12\11\7\252\300o\37\377\327}&\377\340\237S\377)!\30\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6l\30\24\15\377\222X\37\377"
+ "\303\177&\377qM\"\377\17\16\14\322\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\14\14\13\34%\36\22\343\250c\37\377\316r!\3773\"\22\377\6\5\5G\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\335\272|\377\352\312\223\377"
+ "\350\311\215\377(#\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\21\17\12\343\306i\35\377\302m!\377>,\27\377\20\16\13U\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23\21\14\216\326\253a\377\344\267"
+ "q\377\343\272l\3772(\31\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\14\13\11\306\326\236U\377\345\267n\377\344\265k\377\25\23\16\371"
+ "\2\2\1\24\10\10\7\265\322\234O\377\342\251_\377\340\233Q\377!\32\22\377\4"
+ "\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\3\3\2\34\13\12\10\377\321\212>\377\337\232H\377\335\244R\377"
+ "\33\27\20\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6O.&\31\377\305\227T\377"
+ "\336\241Y\377\321\200*\377\215[\40\377\17\15\12\332\5\5\5\13\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\213\277\203<\377\334"
+ "\250]\377\250{E\377\16\15\13\343\5\5\5U\11\11\10\252iN(\377\242t=\377XB%"
+ "\377\27\25\20\377\13\13\12\377N:#\377\320\226K\377=.\34\265\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330"
+ "\252a\377\346\273w\377\344\262q\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\327\247\\\377\345\263r\377\344\265k\377"
+ "\40\33\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\6\31\5\5\4\3064*\33\377"
+ "\334\251a\377\275\216L\377#\37\26\377\206`3\377\341\260j\377\214j5\377\6"
+ "\6\5\377\6\6\6""3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\5\5\5\34\17\15\12\343\320\210;\377\332\2125\377\325z*\377+\37\22\377\5\5"
+ "\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\10""99/"
+ "\36\377\324\243]\377\340\235U\377|Z-\377\12\12\11\223\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\344\265k\377\340\245Q\377"
+ "\302\210=\377:.\35\377\14\14\13U\0\0\0\0\12\11\7\234\256[\27\377\312g\27"
+ "\377\312f\25\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\17\15\12\252\325\233P\377\343\257d\377\343\253b\377#\35\24\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6U1!\22\377"
+ "\267l\"\377\321\200*\377\321\211<\377\272\206C\377_J'\377\26\24\17\345\10"
+ "\10\7i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\5\4\4\34\21\17\14\343\330\247Y\377\344\265k\377\337"
+ "\260f\377\"\34\23\270\0\0\0\0\0\0\0\0\14\13\11l\264j!\377\326}'\377\331\215"
+ "4\377*!\25\377\4\4\4U\0\0\0\0\0\0\0\0\13\12\10\306\323\225L\377\340\240M"
+ "\377\334\220?\377\"\33\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252\275c\32\377\316f\31\377"
+ "\313d\30\377\36\25\13\260\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312g\27\377"
+ "\312f\25\377\33\24\12\377\4\4\3D\0\0\0\0\4\4\4\34\14\12\7\327\260[\27\377"
+ "\313h\30\377\312i\33\377\34\25\15\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\11\10\10""99/\36\377\325\247^\377\344\270s\377~\\/\377\11\11"
+ "\10\223\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\247\307\203:\377"
+ "\334\224?\377\333\223>\3771&\30\377\6\6\6U\0\0\0\0\5\5\5\34\17\16\14\343"
+ "\331\251^\377\344\267o\377\341\256f\377\37\31\22\361\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\5\34\17\15\12\343"
+ "\314\177-\377\333\2058\377\335\226B\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\11U-\"\25\377\311n\36\377"
+ "\300d\31\3779#\20\377\14\12\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\15\13\6O~D\25\377\277d\32\377\306u%\377\320\213A\377\325\233P\377"
+ "\326\241U\377\327\247\\\377\330\247Y\377\327\240X\3771&\30\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\7\7\6L-$\30\371\317\244Z\377\344\267"
+ "o\377\217o8\377\15\14\12\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\0\0\0\0\15\14\10\216\266c\31\377\313l\30\377\312f\25\377pA\27\377\17"
+ "\15\10\343\6\6\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377"
+ "\312_\27\377\312g\27\377g@\32\377\24\22\15\377O=$\377\336\255a\377\343\263"
+ "h\377\340\254a\377\342\253c\377\340\260]\377$\35\23\317\0\0\0\0\0\0\0\0\14"
+ "\12\7q\260[\27\377\312_\27\377\312f\25\377\33\24\12\377\4\4\3J\0\0\0\0\4"
+ "\4\4\34\13\11\6\327\273e\30\377\330\206-\377\342\254_\377\27\25\20\361\0"
+ "\0\0\0\0\0\0\0\12\12\11\241\324\240U\377\342\254_\377\336\236K\3773'\30\377"
+ "\6\6\6U\0\0\0\0\4\4\3\34\13\12\6\327\260[\27\377\312f\25\377\277f\26\377"
+ "\26\21\11\252\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\314i\31\377\331\2052\377"
+ "#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\17\15\12\252\307t\"\377\324r#\377\332\2137\377!\33\22"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\240T\377\343\257d\377\340\245"
+ "Q\377\31\25\16\353\0\0\0\0\0\0\0\0\15\13\10l\270`\31\377\313`\30\377\312"
+ "_\27\377\33\24\12\377\4\4\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\12\11\7\252\273e\30\377\330\206-\377\340\247U\3776*\33\377\6"
+ "\6\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252"
+ "\253Y\26\377\312g\27\377\312f\25\377\35\25\12\252\0\0\0\0\13\11\6*\211M\30"
+ "\377\323\2108\377\327\247\\\377\330\246_\377\325\243T\377!\34\22\241\0\0"
+ "\0\0\0\0\0\0\13\12\10\202\270d\31\377\313d\30\377\312f\25\377\33\24\12\377"
+ "\4\4\3J\0\0\0\0\4\4\4\34\13\11\6\327\260[\27\377\312g\27\377\312_\27\377"
+ "\34\25\13\276\0\0\0\0\0\0\0\0\12\12\11\241\324\241Y\377\344\256i\377\337"
+ "\241P\377!\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\247\253Y\26\377\312g\27\377\312f\25"
+ "\377\35\25\12\252\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312g\27\377\313l\30"
+ "\377D/\31\377\6\6\5\377\37\32\24\377\334\250]\377\334\261e\377nP)\377\14"
+ "\13\11\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253Y\26\377\312g\27"
+ "\377\312f\25\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\12\11\7\252\301o\36\377\333\2106\377\340\245Q\377\33"
+ "\30\20\377\0\0\0\0\7\7\7\34\25\24\20\265\12\12\11U\0\0\0\0\14\13\11\252\314"
+ "\2023\377\332\2153\377\323z$\377\40\27\15\273\0\0\0\0\0\0\0\0\15\13\10U\247"
+ "W\26\377\313d\30\377\320i\35\377\27\23\14\377\4\4\3\34\13\12\10\265\323\236"
+ "R\377\345\267n\377\344\267o\377\344\267q\377\344\265k\377\33\27\20\345\0"
+ "\0\0\0\0\0\0\0\12\12\11\226\300o\37\377\320p\33\377\313l\30\377\25\21\12"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\345\267n\377\344\265"
+ "k\377\31\25\20\353\0\0\0\0\0\0\0\0\13\12\10\216\302t!\377\321j\36\377\313"
+ "l\30\377\33\24\12\377\4\4\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377\312g\27\377\312f\25"
+ "\377*\34\15\377\6\5\5""0\0\0\0\0\6\6\6\34\25\23\16\377\335\257f\377\345\263"
+ "r\377\344\265k\377\30\24\17\366\0\0\0\0\0\0\0\0\14\13\11\177\276h\33\377"
+ "\316j\31\377\312g\27\377\33\24\12\377\4\4\3J\0\0\0\0\4\4\4\34\13\12\6\327"
+ "\260[\27\377\314i\31\377\317z&\377\34\26\17\356\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\5\34\17\15\12\343\303"
+ "o\34\377\314i\31\377\305d\26\377\26\21\11\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\345\270r\377\344\265k\377"
+ "\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252"
+ "\256[\27\377\312g\27\377\312f\25\377\24\20\11\374\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\12\11\7\252\253Y\26\377\312k\27\377\316o\33\377\26\21\13\374\0\0\0\0\0\0"
+ "\0\0\10\7\7-I;$\377\332\256i\377\344\262k\377YC$\377\7\7\6q\0\0\0\0\5\5\4"
+ "\34\24\22\15\377\307n\36\377\312i\33\377X6\27\377\12\11\7q\0\0\0\0\0\0\0"
+ "\0\15\13\6U\247W\26\377\312_\27\377\312Z\27\377\40\30\15\377\4\4\3\262\23"
+ "\20\14\356\324\243]\377B4\37\377\5\5\5\270\16\15\13\377\315\2050\377\324"
+ "r#\377\320u\35\377\35\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11"
+ "UeJ&\377\275y1\377\271h\40\377\264b\31\377\264]\27\377\232R\27\377K,\22\377"
+ "\13\11\6\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\12\11\7\252\235O\26\377\312f\25\377\312f\25\377\26\21\11\377\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\340\210b5\377\331"
+ "\245R\377\325\2218\377\226\\#\377\23\20\14\255\5\5\5\10\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377\312g\27\377"
+ "\312f\25\377\24\20\11\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\7\7\6;+#\30\377\335\257f\377\337\262j\377\206b3\377\16\15\13\216"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\247\253Y\26\377"
+ "\312g\27\377\312f\25\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252.\35\15\377\214J\25\377\245"
+ "V\26\377\247W\26\377\245V\26\377\247W\26\377\271_\26\377\306a\27\377\316"
+ "o\33\377\335\222B\377\27\23\16\371\0\0\0\0\0\0\0\0\12\12\11\231\324\241Y"
+ "\377\345\267n\377\340\245Q\377\34\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10"
+ "\7\234\253Y\26\377\312g\27\377\312f\25\377\37\25\12\252\0\0\0\0\0\0\0\0\12"
+ "\12\11\247\324\240U\377\344\261i\377\336\236K\377\33\27\20\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12"
+ "\10\7\252\247W\26\377\312g\27\377\312f\25\377\24\20\11\356\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\12\10\7\244\253Y\26\377\312g\27\377\313d\30\377\26\22\13\353\0"
+ "\0\0\0\0\0\0\0\12\12\11\247\326\244]\377\344\266m\377\337\232P\377\317x$"
+ "\377\275^\30\377\247W\26\377\247W\26\377\273`\26\377\306]\27\377\312]\25"
+ "\377\306`\25\377\32\23\11\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\247"
+ "\253Y\26\377\312g\27\377\312f\25\377\24\17\11\374\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\21\17\14\252\330\252a\377\345\267n\377\340\244U\377\35\30\20\377"
+ "\3\3\2\34\0\0\0\0\0\0\0\0\14\13\11\306\323\225L\377\335\227D\377\333\222"
+ "<\377\26\23\15\366\0\0\0\0\0\0\0\0\12\12\11\241\322\233M\377\337\223H\377"
+ "\325z*\377\27\22\14\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\247\253Y\26\377\312"
+ "g\27\377\312f\25\377\35\25\12\252\0\0\0\0\0\0\0\0\14\12\7U\246W\27\377\321"
+ "v\36\377\332\2137\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\17\15\12\252\327\237\\\377\342\251_\377\332\215;\377\"\32\17\276"
+ "\0\0\0\0\0\0\0\0\15\12\6U\247W\26\377\312g\27\377\306`\25\377\305`\26\377"
+ "\275a\26\377\306`\25\377\306`\25\377\31\23\12\377\4\4\3\34\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\262\\\27\377\322k\37\377\327\200,"
+ "\377!\30\16\301\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312_\27\377\312g\27"
+ "\377\40\26\13\252\0\0\0\0\12\10\7\252\253Y\26\377\30\21\11\371\0\0\0\0\14"
+ "\12\7U\243R\26\377\312g\27\377\312f\25\377\35\25\12\252\0\0\0\0\0\0\0\0\14"
+ "\12\7U\246W\27\377\312g\27\377\312f\25\377\24\17\11\377\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\12\10\7\247\252Y\27\377\316j\31\377\320s!\377\34\25\15\317\0\0\0\0"
+ "\0\0\0\0\15\12\6U\247W\26\377\312_\27\377\312f\25\377\24\20\11\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\17\15\12\252\326\236U\377\345\267n\377\344\271o\377\30"
+ "\24\17\371\0\0\0\0\0\0\0\0\14\13\11l\260[\27\377\312_\27\377\312f\25\377"
+ "\22\17\11\377\2\2\1\10\0\0\0\0\0\0\0\0\10\7\5\270\253Y\26\377\312_\27\377"
+ "\312f\25\377\"\27\13\255\0\0\0\0\0\0\0\0\14\13\11\210\324\240U\377\344\264"
+ "i\377\341\245X\377\37\31\22\377\3\3\2\34\0\0\0\0\0\0\0\0\10\7\5\262\253Y"
+ "\26\377\312g\27\377\312f\25\377\36\25\13\252\0\0\0\0\0\0\0\0\14\12\7U\247"
+ "W\26\377\312g\27\377\312f\25\377\24\17\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6\34\36\33\25\356"
+ "\247o2\377\316n!\377\307f\30\377\257Z\26\377\245V\26\377\247W\26\377\247"
+ "W\26\377\241W\26\377T0\23\377\22\17\11\343\10\7\5\34\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\12\10\7\247\253Y\26\377\312g\27\377\312f\25\377\24\17\11\374"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\237L\377\345\264n\377\344"
+ "\266m\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253Y\26\377\312"
+ "g\27\377\312f\25\377\37\26\12\252\0\0\0\0\0\0\0\0\7\6\6\34""0\37\17\377\275"
+ "]\26\377\312f\25\377-\35\16\377\5\5\4q\0\0\0\0\5\5\4\34\26\24\17\377\334"
+ "\251a\377\342\262g\377\247v6\377\17\15\12\205\0\0\0\0\0\0\0\0\15\13\6U\247"
+ "W\26\377\312g\27\377\312f\25\377\23\17\10\327\0\0\0\0\13\11\6iyA\24\377\32"
+ "\22\11\276\0\0\0\0\11\11\10\247\320\226K\377\345\267n\377\344\265q\377%\35"
+ "\24\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5\332\247W"
+ "\26\377\312]\25\377\306h\25\377\27\22\12\377\3\3\2""3\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\12\11\7\231\253Y\26\377\312_\27\377\312f\25\377\24\17"
+ "\11\377\2\2\1\21\0\0\0\0\0\0\0\0\10\7\5\265\270d\31\377\327w*\377\340\240"
+ "U\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6U\37\26"
+ "\14\377\246W\27\377\275a\26\377c<\26\377\17\15\10\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\0\0\0\0\4\3\3\27\15\13\10\343\266^\27\377\225"
+ "W\32\377\23\21\14\343\7\7\7\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252"
+ "\330\252a\377\345\263r\377\344\266m\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\11\10\6\202E*\22\377\303_\26\377#\30\14\377\5\5\4L\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34\33"
+ "\30\20\270\40\33\23\377'\35\24\324\15\14\12U\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\15\13\10\252Q6\34\377\330\224C\377\337\241H\377\334"
+ "\223=\377uL\40\377\15\13\10\377,!\23\377\317{(\377\331\2102\377\332\2165"
+ "\377\234d'\377\22\17\13\343\12\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\15\10}"
+ "\23\16\12\252\16\13\7\252\12\10\7\252\13\11\6z\15\12\10U\10\7\5\231.!\25"
+ "\377\324\2123\377\335\227D\377\277\204>\377\23\21\14\260\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\7\7\6L\32\26\17\361\275\201:\377\333\230H\377\331\232H\377\205W"
+ "&\377\17\15\12\335\6\6\5\34\0\0\0\0\0\0\0\0\17\14\10q\24\20\13\252\21\16"
+ "\12\216\7\6\6\34\0\0\0\0\0\0\0\0\23\20\14\252\310u#\377\324{%\377sJ\36\377"
+ "\11\10\6q\0\0\0\0\0\0\0\0\14\13\11\262hI%\377\316\223?\377\262y5\377:.\35"
+ "\377.$\31\377(\40\25\374\23\21\14U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\244\277\203<\377\337\241P\377"
+ "\335\227D\377.\"\25\377\4\4\3\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23"
+ "\20\14\255\320\2067\377\337\234F\377\330\240Q\377\25\23\16\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\6\5\5\31\21\16\12\343C0\34\377^C#\377\24\21\15\343"
+ "\6\6\5q\14\13\11\306C3\36\377U>\40\377\31\24\16\377\11\10\6R\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252\241W\26"
+ "\377\303Z\24\377\273[\24\377\23\16\10\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10w\24\20\13\252\21\16\12\234\12\10\7\34\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10z\22\17\13"
+ "\252\21\16\12\220\12\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252"
+ "\235`$\377\323{&\377\307t\"\377\37\30\20\377\6\6\6\34\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\20\15\13\252\305n\40\377\321n\36\377\312g\27\377:$\17"
+ "\377\10\7\5q\0\0\0\0\0\0\0\0\12\10\5U\211D\22\377\271V\24\377\256X\23\377"
+ "\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252"
+ "\314\2011\377\334\220?\377\331\2052\377\32\24\15\377\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6L\27\23\14\364\271q$\377\317\201"
+ "4\377\255u2\377;.\34\377\22\17\15\306\11\11\10q\6\6\6\13\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\205\26\21\13\252\21\16\12\216\10"
+ "\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\312\2001\377\334\224?\377\333"
+ "\2148\377\26\23\15\377\0\0\0\0\0\0\0\0\14\12\11\252\310}%\377\332\2153\377"
+ "\334\223=\377\212V#\377\15\12\10\343\13\11\6\252\15\13\10\306=)\26\377\312"
+ "o\37\377\314i\31\377\310i\25\377\26\21\11\335\0\0\0\0\0\0\0\0\0\0\0\0\13"
+ "\11\6l\16\13\7\252\13\11\6\213\6\5\3\21\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6\205"
+ "\220K\23\377\271V\24\377\262V\23\377\33\22\10\252\0\0\0\0\0\0\0\0\13\11\6"
+ "U\206F\23\377\265X\24\377\264W\23\377\30\17\7\262\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\12\10\5c\245V\26\377\316o\33\377\325|&\377$\33\21\377\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11\205\247p0\377\336\246M\377\337\235"
+ "H\3776'\27\377\5\5\4%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252"
+ "\265]\26\377\316o\33\377\326\177+\377\24\20\13\377\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\11\10\10\252\313\2012\377\336\221?\377\334\223=\377!\32\20\377\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\14\12\7q\17\14\10\252\15\12\10z\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\12\10\7\252\310x)\377\334\216;\377\333\222<\377\33\25\16\377\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\15\13\10q\22\17\13\252\21\16\12\216\10\7\5\34\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\16\14\11q\24\17\13\252\21\16\12\231\12\10\7\34\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6U\35\25\12\377w>\24\377\231O\24\377(\31\13"
+ "\377\11\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\40\30\15"
+ "\332D/\31\377=+\30\377=.\34\377=/\34\377=/\34\377B2\35\377I7\40\377B0\35"
+ "\377\30\24\17U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6O\40\32\21\364"
+ "\307\2046\377\320\226K\377zW)\377\21\17\12\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\0\0\0\0\0\0\0\0\12\11\7\34\40\27\13\3435!\16\377\""
+ "\27\13\377\14\12\7\276\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11"
+ "\7\4\252\222L\23\377\305c\24\377\314n\33\377;)\26\377\6\6\6\252\12\11\11"
+ "q\37\32\22\270\36\31\21\377\35\31\22\377\"\33\23\377%\34\22\335\15\13\10"
+ """9\0\0\0\0\0\0\0\0\15\12\6X\220K\23\377\271V\24\377\262Z\23\377\24\16\7"
+ "\324\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4}\235Q\24\377\324u!\377\334\224?\377\33"
+ "\25\16\332\0\0\0\0\0\0\0\0\14\12\11\177\300o\37\377\320p\33\377\312g\27\377"
+ "\26\20\11\314\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]\211D\22\377\271^\24\377\264"
+ "[\23\377\36\24\11\252\0\0\0\0\0\0\0\0\13\11\6U\214C\23\377\312j\25\377\326"
+ "}'\377\31\24\16\377\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\15\13\10\213\24\20\13"
+ "\252\23\17\12\216\10\7\5\34\0\0\0\0\0\0\0\0\12\11\5\216\231O\24\377\303Z"
+ "\24\377\316o\33\377\30\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252\303"
+ "q\40\377\323s\36\377\313l\30\377\37\25\12\255\0\0\0\0\0\0\0\0\13\11\6U\214"
+ "F\23\377\271V\24\377\264W\23\377\30\17\7\265\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\256[\27\377\327{*\377\335"
+ "\226B\377\31\24\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\11\7\4\252\224M\23\377\265\\\24\377\264W\23\377\31\21\10\252"
+ "\0\0\0\0\0\0\0\0\"\30\15\252\241f&\377\333\232F\377\334\216;\377\325|&\377"
+ "\40\30\15\306\0\0\0\0\0\0\0\0\13\11\6U\214F\23\377\271V\24\377\262Z\23\377"
+ "\24\16\7\324\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\177\220N\23\377\271V\24\377\264"
+ "W\23\377\35\23\12\252\0\0\0\0\0\0\0\0\15\13\10t\302t!\377\321n\36\377\312"
+ "_\27\377\26\21\11\335\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5U\14\11\5\252\12\10"
+ "\5\202\6\5\3\10\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5n\220N\23\377\271V\24\377"
+ "\262V\23\377\33\22\10\252\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\271V\24\377"
+ "\310i\25\377\35\25\14\377\4\4\4\31\12\11\7\213\232d/\377\327\224F\377\306"
+ "\203-\377.\"\23\377\13\11\6X\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5w\220N\23\377"
+ "\271V\24\377\264W\23\377\25\17\10\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307w'\377\334\220?\377\335\233"
+ "F\377\33\25\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253"
+ "Y\26\377\303b\24\377\267Y\23\377\35\24\10\252\0\0\0\0\0\0\0\0\13\11\6U\213"
+ "F\24\377\312g\27\377\323v$\377\34\25\15\311\0\0\0\0\10\10\7""9vT'\377\327"
+ "\237V\377\333\225B\377\330\201-\377\323y\"\377\"\31\15\262\0\0\0\0\0\0\0"
+ "\0\13\12\6X\222L\23\377\271^\24\377\262Z\23\377\30\22\11\377\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\22\17\13\252\313z*\377\327~(\377\321j\36\377\40\26\15\270\0"
+ "\0\0\0\0\0\0\0\14\12\7U\217H\24\377\271^\24\377\262Z\23\377\24\16\7\322\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\11\7\4\252\224M\23\377\264W\23\377\262V\23\377\36\25\11\377\5\5\4"
+ "%\10\7\5\34\24\21\15\343\205Y&\377\327\2168\377\330\201-\377\321s\40\377"
+ "\32\23\13\322\0\0\0\0\0\0\0\0\13\11\6U\216J\23\377\271V\24\377\262Z\23\377"
+ "\24\16\7\322\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4z\217K\24\377\313l\30\377\330"
+ "\201-\377\36\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7n\20\15\11\252\15\12"
+ "\10z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6i\216J\23\377\271V\24\377\264"
+ "W\23\377\27\20\10\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17"
+ "\15\12\252\313z*\377\327~(\377\321v\36\377\30\21\13\377\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\252\224M\23\377\265\\\24\377\264W"
+ "\23\377\27\20\10\306\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6\213\237R\24\377\313d"
+ "\30\377\324y!\377\34\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11wQ;\"\377"
+ "\330\231G\377\255u2\377\25\22\16\377\12\12\11\364\13\12\10\377<#\17\377\255"
+ "U\24\377T1\21\377\15\12\6\252\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\202\222O\23"
+ "\377\301Y\24\377\313h\30\377xM\37\377\23\21\14\377uP$\377\333\232F\377\262"
+ "y5\377\24\21\15\377-!\22\377\270^\25\377\303Z\24\377\315j\32\377\36\26\15"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6R#\34\22\377\304r!\377\224P\31\377\40\26"
+ "\13\377\24\17\11\377\32\22\11\377X1\21\377\225N\24\377(\32\13\377\11\7\4"
+ "U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\177\214"
+ "F\23\377\265X\24\377\264W\23\377\22\15\7\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\12\11\7]hE#\377\311\2030\377\302m!\377A*\24\377\14\12"
+ "\7\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\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\27\20\10\306\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\306\274"
+ "\205=\377\333\225B\377\302s%\377\21\17\12\364\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\12\10\5q\220N\23\377\271V\24\377\264W\23\377\22\15\7"
+ "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6"
+ "\4A5\37\14\377\242S\23\377\271^\24\377\202F\25\377\37\26\12\377\31\23\12"
+ "\306\26\21\11\366F(\17\377\251W\24\377\310i\25\377\324{%\377\34\25\15\335"
+ "\0\0\0\0\0\0\0\0\14\12\11\205\310\177)\377\322x!\377\312_\27\377\23\16\10"
+ "\356\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5n\220N\23\377\271V\24\377\262V\23\377"
+ "\34\23\11\252\0\0\0\0\0\0\0\0\14\12\11\205\302p\37\377\321n\36\377\312f\25"
+ "\377\25\17\10\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4""9\14\12\5X\12\10"
+ "\5U\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5}\222O\23\377\265X\24\377\264W\23\377"
+ "\31\21\10\303\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5w\220N\23\377\271^\24\377\310"
+ "i\25\377\27\22\12\335\0\0\0\0\0\0\0\0\13\11\10\231\310{)\377\324u!\377\312"
+ "g\27\377o?\24\377\33\24\12\377\24\20\11\366\26\21\11\371\34\24\11\306\36"
+ "\25\11\252\30\21\11\327\34\24\11\311\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\22\15\7\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\13\12\10q\230h/\377\326\2061\377\314i\31\377b6\23"
+ "\377\22\15\11\343\15\12\10\252\16\14\11\306<)\25\377\307p\34\377\312f\25"
+ "\377\312g\27\377\32\23\13\314\0\0\0\0\0\0\0\0\14\13\11t\273e\30\377\312]"
+ "\25\377\273[\24\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\222O\23"
+ "\377\265X\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\11\6U\213F\24"
+ "\377\312g\27\377\324{%\377\40\30\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\15\14\12\252\304r!\377\316j\31\377\304c\25\377\34\23\11\252"
+ "\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\265X\24\377\262V\23\377\244U\25\377"
+ "\212I\25\377\257]\24\377\262V\23\377.\34\13\377\6\5\3l\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\222L\23\377\275X\24\377\275X\24\377\34"
+ "\23\11\252\0\0\0\0\0\0\0\0\13\11\6U\211D\22\377\271V\24\377\262Z\23\377\33"
+ "\21\10\252\0\0\0\0\11\7\4\247\222O\23\377\24\16\7\374\0\0\0\0\13\11\6U\211"
+ "D\22\377\271^\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\11\6U\211"
+ "D\22\377\271V\24\377\264W\23\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\11\7"
+ "\4\252\222O\23\377\271^\24\377\267U\23\377\33\23\10\252\0\0\0\0\0\0\0\0\13"
+ "\11\6U\214I\23\377\265X\24\377\262Z\23\377\24\17\7\377\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\20\16\13\252\320\217;\377\337\234F\377\330\2071\377\34\26\15\322\0"
+ "\0\0\0\0\0\0\0\13\11\6U\214F\23\377\271^\24\377\262Z\23\377H'\15\377\12\10"
+ "\5\332\10\6\3\252\11\7\4\301'\30\12\377\240R\23\377\271^\24\377\220J\27\377"
+ "\20\15\11\252\0\0\0\0\0\0\0\0\12\11\7U\221e0\377\332\225C\377\322s\37\377"
+ "c9\23\377\12\10\5\343\10\6\3\252\11\7\4\276\36\24\11\377\236Q\23\377\271"
+ "^\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\271"
+ "V\24\377\264W\23\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\34\15\14\10\216"
+ "\33\24\12\252\35\25\12\301\30\21\11\374\26\21\11\350\26\21\11\377W1\22\377"
+ "\265X\24\377\262Z\23\377d6\21\377\13\12\6\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\22\15\7\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\320\2157\377\337\234F\377\331\2052\377"
+ "\27\23\14\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5z\220N\23\377\271V\24\377\264"
+ "W\23\377\36\24\11\260\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7U'\32\14\377\233P\24"
+ "\377c7\23\377\23\20\14\377\14\13\11\377\22\17\13\377wT&\377\321\211<\377"
+ "\212V#\377\22\17\13\262\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\202\220N\23\377\265"
+ "\\\24\377\262Z\23\377'\30\12\377\6\5\3\322\35\24\10\377\251W\24\377a5\22"
+ "\377\10\7\5\377\32\25\17\377\324\216;\377\335\227D\377\332\2165\377\"\31"
+ "\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4R\20\14\7\377\240R\23"
+ "\377\271V\24\377\271V\24\3774\35\13\377\7\6\4\252\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\10\7\5US.\20\377\265\\\24\377\262V\23\377W/\16\377\12\10"
+ "\5\340\10\6\3\252\11\7\4\276\35\24\10\377\303h\30\377\331\2102\377\335\233"
+ "F\377\36\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5U\32\22\11\377k"
+ ";\24\377\227P\26\377<\"\17\377\13\11\6\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\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\252\237R\24\377\312v#\377"
+ "B3\35\377\11\11\10`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\320\214"
+ ";\377\337\234F\377\327\205,\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\16\14\7\364\203C\24\377\260Y\23\377\21\14\6\377\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\16"
+ "\12U\253_\34\377\316{!\377\320{\37\377\317p\34\377\312k\27\377\277b\26\377"
+ "\252[\25\377\303k\26\377\321{\36\377\324\204%\377\326\206'\377\323\205(\377"
+ "\312y#\377\35\25\14\244\0\0\0\0\0\0\0\0\14\12\7R\250b\35\377\312y#\377\304"
+ "x\37\377\302s\37\377\276s\33\377\271e\32\377\270d\31\377\307k\32\377\320"
+ "{\37\377\250i%\377\31\25\16\343\11\10\10\34\0\0\0\0\0\0\0\0\10\10\7\34'\36"
+ "\22\371\267z*\377\323\205(\377\322\205+\377\241j)\377\17\15\12\335\5\4\4"
+ "\21\0\0\0\0\0\0\0\0\16\13\7q\224S\31\377\301l\30\377\264]\27\377\33\22\12"
+ "\231\0\0\0\0\0\0\0\0\14\11\7z\220N\23\377\264[\23\377S.\20\377\7\6\4\270"
+ "\0\0\0\0\0\0\0\0\4\4\3U\34\25\15\377\312y#\377\321\204*\377\203W$\377\12"
+ "\11\7\377\5\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7DV>\37\377\316\203+\377\326\202'\377L2"
+ "\31\377\7\6\6q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\25\21\14\377\312"
+ "y#\377\322\207%\377\235d&\377\22\17\13\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\22\17\11[\241X\30\377i@\34\377\13\12\10\252\0\0\0\0\0\0\0\0\0\0\0\0\10"
+ "\7\7U(\34\21\377\256[\27\377*\33\15\255\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5t\205B\20\377\241U\21\377\241N\21\377"
+ "\31\20\10\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10w\252"
+ "c\35\377\313~$\377\307\177\"\377\33\24\14\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\15\13\10z\252c\35\377\314\177%\377\307w\"\377\33\24"
+ "\14\306\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\13\22\15\11\377\232O\23\377\256X\23"
+ "\377\\3\21\377\14\12\7\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\13\11\6\223\216J\23\377\253Z\22\377\237Q\22\377\21\14\6\377\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\10\7\5\216\205B\20\377\241U\21\377\241U\21\377\25\16\6\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\12\11\7\306\276k\31\377"
+ "\313h\30\377\304c\25\377\25\17\10\377\2\2\1\16\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\11\10\6%#\34\22\377\267p$\377\324\204%\377\262v)\377\33\27"
+ "\20\377\5\5\4\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\17\14\10i\216O\27\377\275a\26\377\240S\25\377\22\15\7\332\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\12\10\7\306\304r!\377\326\201%\377\324\204%\377\33\25"
+ "\14\322\0\0\0\0\0\0\0\0\15\13\10t\300r\37\377\322}!\377\321{\36\377\313q"
+ "\32\377\261[\26\377\237R\24\377\240S\25\377\245U\24\377\250Y\23\377\243V"
+ "\22\377\241N\21\377\27\17\6\252\0\0\0\0\0\0\0\0\11\7\4""9c0\16\377\216I\21"
+ "\377\205B\20\377\23\15\6\276\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\207B\20\377"
+ "\241U\21\377\241U\21\377\31\20\6\252\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377"
+ "\241U\21\377\241U\21\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\260"
+ "\276k\31\377\324\177#\377\326\206'\377\36\25\15\377\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252\302m!\377\325\204$\377\320z\35\377"
+ "\34\24\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\223"
+ "\210F\21\377\312b\25\377\323~\"\377\33\24\14\377\3\3\2\34\0\0\0\0\0\0\0\0"
+ "\12\10\7\303\264]\27\377\312f\25\377\312f\25\377\31\21\12\335\0\0\0\0\0\0"
+ "\0\0\15\13\10A\201F\26\377\254X\25\377\220N\23\377\26\17\7\260\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\12\10\7\306\306|%\377\327\210*\377\326\206'\377\33\25\14\324"
+ "\0\0\0\0\0\0\0\0\14\12\7O\227X\32\377\306t\35\377\300m\33\377\31\22\12\247"
+ "\0\0\0\0\0\0\0\0\14\11\7Rw>\24\377\256Y\25\377\232O\23\377\26\17\7\265\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4D\24\16\7\371\216I\21\377\217"
+ "J\22\377-\32\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6U'\36\22\377\304y)\377\325\207"
+ "*\377sH\36\377\12\11\7\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\21\6\5\5U\5\5\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\11\7\4\216\222O\23\377\314l\27\377"
+ "\324~!\377\36\26\15\377\3\3\3(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5}\205B\20\377\241U\21\377\241U\21\377"
+ "\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\210F\21\377\301a\24\377"
+ "\313l\30\377\36\25\13\301\0\0\0\0\0\0\0\0\15\12\6U\206F\23\377\253Z\22\377"
+ "\237Q\22\377\21\14\6\356\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\220\207B\20\377\241"
+ "U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\7\5U\205B\20\377\271"
+ "^\24\377\321{\36\377\27\22\14\377\3\3\2\34\0\0\0\0\5\5\4\34\22\17\13\343"
+ "\206H\25\377\236Q\23\377\217J\22\377\26\17\7\216\0\0\0\0\0\0\0\0\12\10\5"
+ "U\203A\20\377\243O\22\377\262Z\23\377\26\20\11\377\3\2\2\24\0\0\0\0\0\0\0"
+ "\0\11\7\6\260\220N\23\377\257X\22\377\243O\22\377\32\20\7\252\0\0\0\0\0\0"
+ "\0\0\12\10\5U\201@\20\377\241U\21\377\241N\21\377\23\15\6\345\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\234\220N\23\377"
+ "\312f\25\377\316o\33\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\205\207B\20\377\241U\21\377\241U\21"
+ "\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\377\254U\25\377\275\\\24"
+ "\377\254W\23\377\30\20\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21"
+ "\377\241U\21\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\207B\20"
+ "\377\241U\21\377\241U\21\377\32\20\7\252\0\0\0\0\0\0\0\0\13\11\6U\206F\23"
+ "\377\253Z\22\377\237N\22\377\27\17\6\252\0\0\0\0\0\0\0\0\11\7\4""9b1\15\377"
+ "\213G\20\377\205B\20\377\23\15\6\301\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\260\205"
+ "B\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201"
+ "@\20\377\245W\22\377\264[\23\377\24\17\11\377\0\0\0\0\5\5\4\21\32\25\17\343"
+ "~K\31\377\262_\25\377\216J\23\377.\34\13\377\12\10\5""9\0\0\0\0\0\0\0\0\12"
+ "\10\5U\203A\20\377\241U\21\377\241U\21\377\21\14\6\374\2\1\1\10\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307w\"\377\327"
+ "\210*\377\326\213)\377\34\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\10\7\5\252\207B\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0"
+ "\0\0\12\10\5U\203C\20\377\312f\25\377\323\177$\377\26\21\13\371\0\0\0\0\0"
+ "\0\0\0\20\16\13\311eC\34\377\277b\26\377\271^\24\377\254W\23\377\32\21\7"
+ "\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241U\21\377\37\24\10"
+ "\377\5\5\4f\0\0\0\0\5\4\4\34\20\15\11\377\244U\25\377\264[\23\377\245W\22"
+ "\377\32\21\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241U\21"
+ "\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\205\207B\20\377\241U\21\377\241U\21\377"
+ "\32\21\7\377\3\3\2\210\11\7\4\343\203C\24\377\305h\26\377\306h\25\377\267"
+ "]\23\377\254W\23\377\32\21\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241"
+ "U\21\377\241U\21\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\207"
+ "B\20\377\301a\24\377\321{\36\377\23\17\12\374\0\0\0\0\0\0\0\0\15\13\10A}"
+ "D\26\377\256V\25\377\222L\23\377\26\16\7\262\0\0\0\0\0\0\0\0\0\0\0\0\10\6"
+ "\5\220\207B\20\377\241U\21\377\241U\21\377\23\16\6\356\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\243W\24\377\264[\23\377\245W"
+ "\22\377\21\14\6\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7"
+ "\4\213\207B\20\377\241U\21\377\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\11\7\6\270\264]\27\377\323s\36\377\325\205&\377\34\24\15\377\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\230[\37\377\274i\37\377sB\26\377"
+ "[2\20\377T.\17\377t;\21\377v>\21\377\17\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\12\10\5t\222O\23\377\312g\27\377\321\200\40\377\310\177)\377\247"
+ "j(\377\305z*\377\322\202#\377\272j\33\377X3\23\377f7\21\377\235S\22\377\275"
+ "\\\24\377\321{\36\377\35\25\14\340\0\0\0\0\0\0\0\0\7\6\6\34)\37\22\353\240"
+ "T\27\377\252W\23\377-\32\12\377\5\5\4\252\4\4\4\10\4\4\3c\17\14\6\377\214"
+ "H\21\377\212G\21\377-\32\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\10\7\5\216\205B\20\377\241U\21\377\241U\21\377\23\15\6\345"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\240V\25\377"
+ "\271Z\24\377[2\20\377\7\6\4\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\226\205B\20\377\241U\21\377"
+ "\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\10\10\7nJ4\33\377\277g\30\377\260Y\23\377\"\26\11\377\6"
+ "\5\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\241\205B\20\377\241"
+ "U\21\377\241N\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5U{=\20\377\241U\21\377\241U\21\377\26\17"
+ "\7\377\2\2\1U\0\0\0\0\0\0\0\0\7\6\4\364\205B\20\377\247X\22\377\275\\\24"
+ "\377\33\23\12\303\0\0\0\0\0\0\0\0\14\12\7n\240S\25\377\261U\22\377\241N\21"
+ "\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\241\205B\20\377\241U\21\377"
+ "\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\13\11\6U\206F\23\377\253Z\22\377"
+ "\237N\22\377\17\13\6\371\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5Ub1\15\377\207H\20"
+ "\377\205B\20\377\23\15\6\213\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377\241U\21"
+ "\377\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\205B\20\377"
+ "\245W\22\377\262Z\23\377\30\21\11\324\0\0\0\0\0\0\0\0\15\13\10i\245V\26\377"
+ "\264[\23\377\237Q\22\377\23\16\6\377\2\2\1O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205"
+ "B\20\377\241U\21\377\241U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\7\6\6\34\30\23\15\343g;\24\377\235S\22\377\232N\21\377\226Q\23\377\232"
+ "O\23\377\236Q\23\377\242S\23\377\241U\21\377\237Q\22\377\243V\22\377\33\22"
+ "\10\252\0\0\0\0\0\0\0\0\13\11\6U\203C\20\377\245W\22\377\241U\21\377\17\13"
+ "\6\374\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U\21\377\241U\21"
+ "\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377\257X\22\377\277`\24"
+ "\377\31\22\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6"
+ "\252\224M\23\377\251R\22\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10"
+ "\5U\201@\20\377\241U\21\377\241U\21\377W/\16\377\27\21\10\377A\"\14\377\226"
+ "L\21\377\204D\21\377)\31\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\10\7\5\226\205B\20\377\241U\21\377\241N\21\377\27\17\6\252\0\0\0\0\0\0\0"
+ "\0\12\10\5U\201@\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\10\7"
+ "\5\231\205B\20\377\23\15\6\356\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241"
+ "U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241"
+ "U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U"
+ "\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241"
+ "U\21\377\241U\21\377\37\24\10\377\5\4\4U\0\0\0\0\5\4\4(\21\16\12\377\310"
+ "x#\377\317p\34\377\303b\24\377\35\24\10\252\0\0\0\0\0\0\0\0\12\10\5U\203"
+ "A\20\377\243V\22\377\237Q\22\377\226L\21\377\211F\20\377\207H\20\377\207"
+ "B\20\377\222K\21\377\237Q\22\377\203C\24\377*\37\21\377\12\11\7>\0\0\0\0"
+ "\0\0\0\0\5\5\4\10\32\25\17\343\211O\34\377\256X\23\377\236S\21\377\211F\20"
+ "\377\207H\20\377\207B\20\377\222K\21\377\237Q\22\377\241U\21\377\241U\21"
+ "\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\203C\20\377\243V\22\377\237Q\22"
+ "\377\21\14\6\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\2\1\1\10\7\6\4\371\211C\20\377\245P\22\377\232N\21\377\33\22\10"
+ "\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U\21\377\241"
+ "U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307|$\377"
+ "\323}\40\377\310i\25\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\205"
+ "B\20\377\241U\21\377\241N\21\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\10\7\5zD&\15\377\226S\27\377\256k#\377\265p&\377\276u'\377\301r$\377"
+ "\217T\32\377\17\14\10\324\4\4\3\6\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5l\207B\20"
+ "\377\241U\21\377\241U\21\377}A\20\377Z/\15\377y<\20\377\244T\23\377\275a"
+ "\26\377\261h\40\377\302{'\377\324\206)\377\322|\37\377\310i\25\377\27\21"
+ "\10\332\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\2478\37\13\377n7\17\377v"
+ ">\21\377s:\20\377s:\20\377x?\21\377_.\16\377\21\15\6\343\7\6\4\34\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\16\14\7\343W+\16\377\232N\21\377\230M\21\377\213"
+ "G\20\377\207H\20\377\207B\20\377\222K\21\377\310i\25\377\323\177$\377\326"
+ "\206'\377\27\22\14\377\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U\32\20\7\377\203C\20"
+ "\377\221K\22\377N+\17\377\7\6\4\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\210\235Q\24\377\322\201"
+ "!\377\213Y$\377\12\11\7\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252"
+ "\304q\37\377\316r\31\377\275\\\24\377\22\15\7\364\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\5\4\4X\33\23\10\377\215I\22\377\241U\21\377\25\16\6\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\14\11\7c\13\10\6\252\12\10\5[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\13\12\10\34\40\27\15\343l9\23\377\231R\22\377\232N\21\377\222K\21"
+ "\377a/\16\377$\30\13\377l@\31\377\313o\36\377\317v\40\377\317v\40\377\275"
+ "n\40\377?)\24\377\17\14\10L\0\0\0\0\0\0\0\0\11\10\6\34&\33\17\3323!\22\377"
+ "0\40\21\377\203J\30\377\266a\25\377\260Y\23\377\252W\23\377\206H\25\377%"
+ "\31\16\377\17\15\10\220\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10\177\253"
+ "c\34\377\320{\37\377\313|\36\377h?\33\377\17\15\12\324\7\6\6\34\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\16\13\7\252\216J\23\377\241U\21\377\237Q\22\377\33\22\10\270"
+ "\0\0\0\0\0\0\0\0\6\5\3\34\33\21\10\343\\.\15\377o7\16\377\37\24\10\377\10"
+ "\6\3\306\11\7\4\252\12\10\5\343\26\20\11\377='\22\377k@\32\377lB\31\377\40"
+ "\26\13\377\11\7\6\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\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\2348$\23\377\277r\40\377\257"
+ "b\36\377)\33\20\377\13\11\6""9\0\0\0\0\0\0\0\0\0\0\0\0\25\17\12\343d8\25"
+ "\377\240S\25\377P,\21\377\16\14\7\276\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\15\12\6\34\35\24\12\324\25\17\12\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\14\11\7U'\30\12\255\20\14\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\24\23\15\6\255\25\16\6\377\25\17\6\327"
+ "\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\252\276"
+ "b\27\377\313l\30\377\312o\27\377\27\21\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\21\15\12\252\303p\36\377\323|\36\377\315j\32\377\37"
+ "\25\14\377\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\213,\31\11\377\207H\20\377h6\15"
+ "\377\17\13\6\371\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\7\6\4""9,\31\11\377\211I\20\377\217F\20\3771\31\10\377\10\6\3\270\10\6\3"
+ "U\10\6\3\216\27\20\6\377\202B\17\377\221M\20\377W,\14\377\12\10\5\216\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10\2445\37\16\377\226J\23\377"
+ "\232N\21\377\224L\21\377A!\12\377\12\10\5\270\6\5\5\34\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\13\11\6\216\257f\36\377\317{\40\377\320r\37\377\304r!\377"
+ "Y8\32\377\21\15\12\377\13\10\6\252\11\7\6\252\13\10\6\252\17\13\10\252\22"
+ "\15\11\216\10\6\5\34\0\0\0\0\0\0\0\0\12\10\5]f5\21\377\237Q\22\377\232N\21"
+ "\377H%\13\377\13\10\6\343\11\7\6\252\13\10\6\306=$\24\377\304k\33\377\314"
+ "r\33\377\266f\37\377\23\16\12\252\0\0\0\0\0\0\0\0\6\6\5\24\32\23\13\306\34"
+ "\24\13\377\26\20\11\377\27\20\10\377\33\22\10\377\30\20\7\377\30\20\7\377"
+ "J'\13\377\213D\20\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0"
+ "\7\6\4JW,\14\377\233O\22\377\227I\20\377C\"\12\377\11\7\4\306\11\7\4`\10"
+ "\6\5\237\33\21\10\377\211C\20\377\236P\21\377p8\17\377\12\10\5\247\0\0\0"
+ "\0\0\0\0\0\7\5\4UJ$\13\377\226S\21\377\221M\20\3777\35\12\377\10\6\3\306"
+ "\10\6\3X\7\6\4\231'\30\14\377\307p\34\377\322s\37\377\270l!\377\21\16\12"
+ "\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\213E\22"
+ "\377\250V\23\377\232N\21\377\21\14\6\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\7\6\4U@\40\13\377\242P\23\377\306`\25\377m?\32\377\17\13"
+ "\10\343\12\10\7\252\10\7\5\303\35\22\10\377\211C\20\377\232N\21\377r;\17"
+ "\377\13\12\6\244\0\0\0\0\0\0\0\0\11\7\6Ua2\20\377\237Q\22\377\230M\21\377"
+ "J$\13\377\12\10\5\306\7\6\4}\12\10\5\306=$\24\377\310i\35\377\321z\34\377"
+ "\264h\35\377\20\14\11\252\0\0\0\0\0\0\0\0\14\12\7\252\240S\25\377\267Y\23"
+ "\377\256X\23\377\34\23\11\273\0\0\0\0\0\0\0\0\16\12\7U\217K\24\377\303b\24"
+ "\377\275\\\24\377\25\17\10\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\7\6\4U\32\20\7\377o7\16\377\204C\17\377'\27\10\377\10\6\3q\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6U\40\26\15"
+ "\377\274p\37\377\301r\36\377^9\31\377\21\15\12\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4"
+ "\216\12\10\5\377\12\10\5\306\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\10\7\5UX0\23\377\314r\33\377\320v\37\377o>\32\377\13\10\6\343"
+ "\10\7\5\226\12\10\5t\12\10\5X\11\7\4U\6\5\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\12\10\5cr8\15\377\217F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\10\7\3\202v<\15\377\224L\21\377\226L\21\377\30\20\7\252\0\0\0"
+ "\0\0\0\0\0\11\7\4Ur8\15\377\221J\20\377\217F\20\3774\34\11\377\10\6\3\306"
+ "\10\6\3X\10\6\3\220\27\17\6\377\202B\17\377\227P\20\377o7\16\377\12\10\5"
+ "\220\0\0\0\0\0\0\0\0\6\5\3;;\40\12\377\235S\22\377\271Z\24\377a6\26\377\16"
+ "\12\7\343\15\12\6\252\15\12\6\377T)\15\377\224L\21\377\233R\22\377\207B\20"
+ "\377\16\12\5\237\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\221J\20\377"
+ "7\34\12\377\11\7\4\306\10\6\3]\10\6\3\223\31\20\6\377\202@\17\377\227P\20"
+ "\377o7\16\377\12\10\5\216\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\217"
+ "F\20\3774\34\11\377\10\6\3\306\10\6\3f\10\6\3\213\10\6\3\252\11\10\4q\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\12\10\5[r8\15\377\226L\21\377\226L\21\377\21\14\6\374"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U@"
+ "!\13\377\221M\20\377\217F\20\3778\35\11\377\10\6\3\306\10\6\3U\6\5\3w\16"
+ "\13\5\377\200B\17\377\227I\20\377\217L\20\377\24\15\5\252\0\0\0\0\0\0\0\0"
+ "\11\7\4Ur8\15\377\217F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\10\7\3\202r8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0"
+ "\0\0\11\7\4Ur8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0"
+ "\7\6\4GW,\14\377\236W\21\377\241U\21\377g5\24\377\17\13\10\343\12\10\7\252"
+ "\12\10\7\303!\24\12\377\211C\20\377\227I\20\377o7\16\377\12\10\5\216\0\0"
+ "\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20\377\222K\21\377\22\15\7\377\0\0\0\0"
+ "\0\0\0\0\7\6\6J\30\20\7\377\204C\17\377\221M\20\377\207H\20\377\16\12\5\252"
+ "\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\217F\20\377:\37\13\377\13\10"
+ "\6\343\13\11\6\252\13\10\6\252\12\7\5\252\11\10\4q\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\13\11\6\241\257\\\30\377\313l\30\377\306e\27\377\31\22\12\377\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3\223r8\15\377\217F\20\377\217F\20"
+ "\377\24\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\252W\23\377\307j\30\377"
+ "\30\21\13\377\0\0\0\0\0\0\0\0\6\6\5\34\17\14\6\377\200B\17\377\221J\20\377"
+ "\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\6\5\3""99\37\12\377\221M\20\377"
+ "\217F\20\377Z,\15\377\23\15\6\377\12\10\5\377\15\12\6\377>!\13\377\207H\20"
+ "\377\227I\20\377l5\15\377\12\10\5\216\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217"
+ "F\20\377\217F\20\377\22\14\5\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U@!\13\377\221M\20\377\217"
+ "F\20\377C\"\12\377\16\12\5\3771\33\11\377\214H\21\377\240U\23\377\240U\23"
+ "\377n7\17\377\37\24\10\377\11\7\4""9\0\0\0\0\0\0\0\0\11\10\4Ur8\15\377\217"
+ "F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210v<\15"
+ "\377\232K\21\377\254W\23\377\30\21\11\314\0\0\0\0\0\0\0\0\10\7\5U_1\20\377"
+ "\241U\21\377\230M\21\377G\"\12\377\11\7\4\306\10\6\3X\10\6\3\216\27\17\6"
+ "\377\202B\17\377\227P\20\377o7\16\377\16\12\5\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\11\7\4\244v8\17\377\221J\20\377\217F\20\377\20\14"
+ "\5\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4UU+\14\377\227"
+ "P\20\377\217F\20\3777\35\12\377\10\6\3\306\10\6\3]\10\6\5\255-\33\16\377"
+ "\307p\34\377\322|\37\377\307w\"\377\23\17\12\335\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\15\13\10\252.\34\13\377\203A\20\377\221J\20\377\211C\20"
+ "\377F#\13\377\14\12\5\340\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5"
+ "\"%\31\16\377\265d\34\377\316q\37\377\317{\40\377\307w\"\377kC\34\377\34"
+ "\24\13\377\34\23\11\377T)\15\377\215K\20\377\221J\20\377\237R\24\377X5\31"
+ "\377\15\13\10c\0\0\0\0\0\0\0\0\15\12\6Ur<\21\377\224L\21\377\217F\20\377"
+ "\25\16\6\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252w=\16\377\221M\20\377\207"
+ "H\20\377\23\15\6\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\10\7"
+ "\3\216r8\15\377\217F\20\377\217F\20\377\20\14\5\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\13\10\6\252~>\17\377\227P\20\377p9\15\377\23\15"
+ "\6\377\10\6\3\220\10\6\3U\11\7\4q\10\6\3\247\10\6\3\252\10\6\3\252\11\10"
+ "\4q\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5[r8\15\377\221J\20\377\217F\20\377=\40"
+ "\12\377\11\10\4\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\0\0\0"
+ "\0\0\0\0\0\14\12\7\317J$\13\377\213J\20\377O(\14\377\12\10\5\322\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\33\21\6\377\202B\17\377\217F\20\377\217"
+ "L\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\10\6\3UJ'\13\377\221M\20\377\217F\20\377)\27\10\377\7\6\4\255"
+ "\5\5\2U\6\5\3q\16\12\5\377\201A\16\377\221J\20\377\221J\20\377\30\20\7\252"
+ "\0\0\0\0\0\0\0\0\12\10\5Up9\15\377\221M\20\377\217F\20\3774\34\11\377\10"
+ "\6\3\306\10\6\3X\10\6\3\220\27\17\6\377\202B\17\377\227P\20\377o7\16\377"
+ "\12\10\5\220\0\0\0\0\0\0\0\0\6\5\3;?\"\12\377\221M\20\377\217F\20\3777\35"
+ "\12\377\10\6\3\306\10\6\3U\10\6\3\220\40\23\7\377\213J\20\377\233O\22\377"
+ "\207B\20\377\16\12\5\252\0\0\0\0\0\0\0\0\6\5\3""99\37\12\377\221M\20\377"
+ "\217F\20\3777\35\12\377\10\6\3\306\10\6\3X\10\6\3\220\25\17\6\377\202B\17"
+ "\377\217L\20\377\222K\21\377\30\17\7\270\0\0\0\0\0\0\0\0\7\6\4GB!\13\377"
+ "\224O\21\377\217F\20\377-\31\10\377\7\5\4\260\7\5\4U\10\6\3U\11\7\4U\10\6"
+ "\3R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8"
+ "\15\377\217F\20\377\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\7\6\4\34\12\10\5\202\23\15\6\252\35\23\10\255\30\20\7\324\33\22"
+ "\10\301\24\15\7\3667\35\12\377\213J\20\377\217F\20\377\217F\20\377\22\15"
+ "\5\252\0\0\0\0\0\0\0\0\11\7\4Us6\16\377\217F\20\377\217F\20\377\20\14\5\335"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8\15\377\217F\20\377\217F\20\377\24\15"
+ "\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221J\20\377\221J\20\377\21\13\6\374"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252w=\16\377\221"
+ "J\20\377\217F\20\377\22\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20"
+ "\377\217F\20\377!\24\10\377\5\4\4\303\10\6\5\306.\32\11\377~>\17\377\204"
+ "C\17\377#\26\10\377\11\7\4]\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]r8\15\377\217"
+ "F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20"
+ "\377\217F\20\377\24\15\5\252\0\0\0\0\11\7\4}r8\15\377\25\15\6\322\0\0\0\0"
+ "\11\7\4Ur8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11"
+ "\7\4Ur8\15\377\217F\20\377\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\10\7\3\210r8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0"
+ "\0\6\5\3""99\37\12\377\221M\20\377\217F\20\377Z,\15\377\21\14\6\377\14\11"
+ "\5\377\24\17\11\377a3\24\377\251W\24\377\241U\21\377p6\17\377\12\10\5\216"
+ "\0\0\0\0\0\0\0\0\11\7\4Uy<\20\377\256X\23\377\260Y\23\377p;\21\377%\27\12"
+ "\377\32\20\7\377\31\22\10\377\30\17\7\377\27\20\10\377\22\15\11\306\12\11"
+ "\7c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\"\14\12\7\247\24\16\7\322\25"
+ "\17\6\377\32\21\7\377\30\20\7\377\32\21\7\377F#\13\377\216I\21\377\224L\21"
+ "\377\230M\21\377\30\17\7\252\0\0\0\0\0\0\0\0\15\12\6`\201A\22\377\252W\23"
+ "\377\252W\23\377\30\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2L\10\6\3U\10\6"
+ "\3U\10\6\3U\7\5\4U\6\5\3w\20\13\5\377\201A\16\377\227I\20\377v=\17\377\16"
+ "\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8\15\377\217F\20\377"
+ "\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7qmC\32\377"
+ "\270Z\25\377\224L\21\3774\34\11\377\10\6\3\306\10\6\3X\10\6\3\220\25\17\6"
+ "\377\202B\17\377\217L\20\377\217L\20\377\20\14\5\343\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\11\10\6\252C*\24\377\312|\37\377\320\200!\377\315j\32"
+ "\377h:\25\377\16\13\7\332\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4"
+ "\34\33\21\10\345f3\15\377\213D\20\377\217I\20\377\221J\20\377G%\14\377\32"
+ "\22\11\377P2\27\377\314z!\377\320s!\377\312h\31\377\225N\24\3774\36\13\377"
+ "\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\252U+\14\377\211I\20\377M'\14\377"
+ "\16\12\5\343\12\10\5\252\12\10\5\306.\32\11\377\211I\20\377s;\16\377\31\20"
+ "\6\350\10\6\3\37\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\12\10\5w\23\15\6\252\35"
+ "\23\10\255\32\20\7\322\33\22\10\273\21\14\6\366:\36\13\377\227M\22\377\300"
+ "a\25\377\300a\25\377\30\20\11\317\0\0\0\0\0\0\0\0\4\4\3\3\31\20\6\353s;\16"
+ "\377\217I\20\377\221M\20\377l5\15\377\25\16\6\377\7\6\4\244\12\7\5U\10\7"
+ "\5\223\11\7\4\210\10\6\5L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5"
+ """9:!\15\377\274k\33\377\300o\37\377U3\30\377\22\15\11\273\6\5\5\24\0\0\0"
+ "\0\0\0\0\0\13\11\6\234\213E\22\377\236S\21\377\224L\21\377\27\17\6\252\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\23\15\6\377f3\15\377\200B\17\377Q)\14\377"
+ "\14\11\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\15\12\10Us<\30\377\242K\27\377y<\24\377\27\17\10\216\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\6\12\10\5\252]0\14\377{A\16"
+ "\377{<\16\377\16\12\5\343\3\3\2U\14\12\7\252\243S\30\377\307c\32\377\301"
+ "`\30\377)\32\16\343\6\6\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\3\3\2\34\13\10\6\252j2\15\377\201?\16\377\201?\16\377\35\22\10\343\6\5"
+ "\5\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10\210\220I\25\377\266"
+ "Y\25\377c7\23\377\16\13\7\273\4\4\3\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11"
+ "\7\4q].\14\377\203B\16\377y>\16\377\20\13\5\252\0\0\0\0\0\0\0\0\0\0\0\0\7"
+ "\6\4\34\16\12\5\343d2\15\377n;\15\377g4\16\377y;\22\377\206E\25\377\40\25"
+ "\13\377\6\5\5\306\12\10\7\343.\34\15\377h3\17\377`.\15\377\16\12\5\213\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\12\10\7l?%\22\377\260X\27\377\240P\25\377\24\16\11\252\0\0"
+ "\0\0\0\0\0\0\10\6\5OU)\14\377\203A\20\377B\"\13\377\12\10\5\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\247"
+ "s8\20\377\245U\24\377pA\27\377\22\15\11\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\15\12\10\216\204D\25\377\242P\23\377\215F\22\377\21\14"
+ "\6\265\0\0\0\0\0\0\0\0\0\0\0\0\21\14\6\377g6\16\377\202B\17\377\37\24\10"
+ "\377\6\5\3q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\10\6\3\234#\26\10\377r:\15\377n;\15\377X-\13\377X*\13\377\\/\13\377h6"
+ "\15\377w:\16\377=\40\12\377\12\10\5\340\5\4\4\24\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\13\10\6Uq:\26\377\264Z\27\377\214E\21\377{?\16\377{<\16\377w8\16"
+ "\377x=\21\377\30\17\11\247\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\205\264"
+ "X\33\377\313k\36\377\307d\34\377\305h\34\377\277]\34\377\247N\30\377\204"
+ "D\25\377y>\22\377u<\22\377v9\21\377l2\17\377\21\14\6q\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\16\12\5\343A!\12\377s;\16\377s;\16\377m4\16\377t9\21\377y;\22\377\213"
+ "D\24\377\232I\23\377s>\24\377!\27\14\377\11\10\6G\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\2\1\10\10\6\3\252]2\14"
+ "\377}@\16\377{<\16\377\16\12\5\237\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\340A!"
+ "\12\377s;\16\377s;\16\377m4\16\377w=\22\377\201B\24\377\224K\25\377\252T"
+ "\25\377\201C\26\377%\31\16\377\10\7\5""9\0\0\0\0\0\0\0\0\5\5\4\27\30\21\11"
+ "\377g6\22\377\204?\21\377x>\17\377b1\15\377Z-\13\377^-\15\377|<\21\377\254"
+ "Q\25\377\226N\31\377,\35\21\377\11\10\6[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\10\7\3f].\14\377}@\16\377y>\16\377\22\14\5\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\0\0\0\0\14\12\5\343@!\13\377\204B"
+ "\21\377\236O\25\377\227F\26\377\202C\25\377n5\17\377l5\15\377v<\15\377U+"
+ "\14\377\25\16\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\343A!\12\377"
+ "\203A\20\377\225H\24\377\205D\24\377o6\20\377n5\17\377\212H\23\377\243Q\24"
+ "\377p:\23\377\34\24\11\377\10\7\5""9\0\0\0\0\0\0\0\0\11\7\4[`0\15\377\204"
+ "F\17\377{<\16\377\16\12\5\241\0\0\0\0\0\0\0\0\15\12\6U\224I\27\377\312e\33"
+ "\377\201C\32\377\22\15\11\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\6\5\3""0\21\14\6\343l7\15\377p7\15\377#\26\10\377\11\7\4""9"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\26\15\377\211"
+ "D\26\377\232I\23\377-\32\12\377\10\6\5\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3DC\"\12"
+ "\377s8\20\377m4\16\377\20\13\5\223\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\5\4\4\13\26\21\13\343\201L\34\377\303_\34\377\272T\27\377y;\22"
+ "\377k3\16\377`.\15\377Z-\13\377X-\13\377)\30\10\377\14\12\5\260\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\10\6\3LX,\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\11\7\4U\\/\13\377}@\16\377{<\16\377\20\13\5\226\0\0\0\0\0\0"
+ "\0\0\10\6\3>X-\13\377}@\16\377{<\16\377r:\15\377]2\14\377X,\13\377\\/\13"
+ "\377h6\15\377w:\16\377U+\14\377\25\17\6\377\7\6\4""3\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\14\12\5\335=\40\12\377x>\17\377{=\20\377m4\16\377`.\15\377f3\15\377"
+ "s;\16\377{A\16\377U+\14\377\31\20\6\377\7\6\4""3\0\0\0\0\0\0\0\0\10\6\3J"
+ "X-\13\377}@\16\377{<\16\377r:\15\377]2\14\377X-\13\377\\/\13\377h4\15\377"
+ "v<\15\377U+\14\377\25\17\6\377\7\5\4(\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}@"
+ "\16\377{<\16\377r:\15\377]2\14\377X-\13\377\\+\13\377]2\14\377]2\14\377\24"
+ "\15\5U\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}@\16\377y>\16\377\22\15\5\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\0\0\0\0\0\0\0\0\0\0\0\0\14\12"
+ "\5\343;\37\12\377s>\16\377r:\15\377]2\14\377X,\13\377X,\13\377h6\15\377v"
+ "<\15\377{<\16\377{<\16\377\16\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}"
+ "B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}"
+ "B\16\377{A\16\377\16\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{"
+ "A\16\377\16\12\5\237\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\335F#\13\377\233J\24"
+ "\377\301Y\32\377\271[\34\377\254U\33\377\245P\30\377\233N\26\377\204B\21"
+ "\377Z,\15\377\25\17\6\377\7\5\4(\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}@\16\377"
+ "y>\16\377\23\15\6\260\0\0\0\0\0\0\0\0\0\0\0\0\11\6\4\205]2\14\377\203B\16"
+ "\377{A\16\377\16\13\5\226\0\0\0\0\0\0\0\0\10\6\3>X-\13\377}@\16\377{<\16"
+ "\377v8\17\377x=\21\377\210C\25\377v9\21\377`0\15\377\\/\13\377\22\14\5U\0"
+ "\0\0\0\0\0\0\0\11\7\4Oh3\17\377\214B\21\377\207B\20\377\21\14\6\306\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{A\16\377\16"
+ "\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377\207B\20\377\210C\21\377\26\16"
+ "\7\306\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3wX-\13\377}@\16\377{<\16\377\16\12\5"
+ "\237\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\322;\37\12\377s>\16\377v<\15\377h6\15"
+ "\377d2\15\377d2\15\377r:\15\377w?\16\377U+\14\377\25\17\6\377\7\5\4(\0\0"
+ "\0\0\0\0\0\0\10\6\3JX-\13\377}B\16\377{<\16\377\22\14\5\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\14\12\5\343;\37\12\377s>\16\377r:\15\377d2\15\377r8\15\377\205B\20\377"
+ "\240P\25\377\260S\25\377-\33\14\377\6\5\3\252\0\0\0\0\0\0\0\0\0\0\0\0\10"
+ "\6\3RX-\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\11\7"
+ "\4U\\/\13\377\203=\16\377~>\17\377\21\13\6\252\0\0\0\0\0\0\0\0\0\0\0\0\16"
+ "\12\5\343A!\12\377s;\16\377s>\16\377]2\14\377X,\13\377\\/\13\377h6\15\377"
+ "w:\16\377U+\14\377\25\17\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\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\5\5\4\34\23\15\6\377T*\13\377s>\16"
+ "\377n;\15\377]2\14\377T,\13\377j6\17\377\260T\27\377\307d\34\377\274e\37"
+ "\377Z6\31\377\15\12\10\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\10\6\3\244H%\13\377\203B\16\377n6\15\377\14\11\5\340\3\3\2\21\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6U\36\24\15\377\276`\33\377"
+ "\307b\30\377yE\26\377\15\12\6\276\4\3\3\34\5\4\2i\33\21\6\377r8\15\377}@"
+ "\16\377-\32\12\377\10\7\5\231\0\0\0\0\0\0\0\0\0\0\0\0\12\7\5U`0\15\377}@"
+ "\16\377{<\16\377\20\13\5\303\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3n\\/\13\377\203"
+ "B\16\377{A\16\377\22\15\5\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\11\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\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\10\7\3c]2\14\377}B\16\377s;\16\377h6\15\377"
+ "X-\13\377X,\13\377\\+\13\377\\+\13\377\\+\13\377]2\14\377]2\14\377\24\15"
+ "\5U\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}@\16\377{<\16\377s>\16\377].\14\377"
+ "\20\13\5\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4"
+ "\4\34\14\12\5\366h6\15\377s;\16\377'\27\10\377\10\6\3R\0\0\0\0\0\0\0\0\0"
+ "\0\0\0:\37\11\377r:\15\377w?\16\377{<\16\377{A\16\377\22\14\5\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5"
+ "\343;\37\12\377s>\16\377n;\15\377X,\13\377P*\13\377X,\13\377h6\15\377s;\16"
+ "\377{<\16\377{<\16\377\20\13\5\226\0\0\0\0\0\0\0\0\10\6\3AX,\13\377}@\16"
+ "\377{<\16\377r:\15\377]2\14\377X,\13\377\\/\13\377h6\15\377w:\16\377U+\14"
+ "\377\25\17\6\377\7\6\4""3\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\340?\40\12\377"
+ "s>\16\377r8\15\377]2\14\377X,\13\377X-\13\377n;\15\377w=\16\377U+\14\377"
+ "\31\20\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\335;\37\12\377s>\16"
+ "\377r8\15\377]2\14\377X,\13\377\\/\13\377h6\15\377s;\16\377{<\16\377y>\16"
+ "\377\20\13\5\247\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\332;\37\12\377s>\16\377"
+ "n;\15\377X,\13\377P*\13\377X,\13\377X-\13\377X,\13\377\20\13\5i\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377"
+ "\22\14\5\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\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\306]2\14\377}B\16\377{<\16\377"
+ "\14\12\5\252\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{A\16\377\22\14\5\252"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{A\16\377\16\12\5\226"
+ "\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{<\16\377\22\15\5\252\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\13\11\7\4\343d2\15\377{<\16\377{<\16"
+ "\377\14\12\5\252\0\0\0\0\0\0\0\0\10\6\3>X-\13\377}B\16\377{<\16\377\16\12"
+ "\5\306\0\0\0\0\0\0\0\0\10\6\3\252#\26\10\377s;\16\377p7\15\377!\25\10\377"
+ "\10\6\3%\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}B\16\377{A\16\377\16\12\5\226\0"
+ "\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{A\16\377\16\13\5\223\0\0\0\0\11"
+ "\7\4U\\/\13\377\24\15\5\252\0\0\0\0\10\6\3>X-\13\377}B\16\377{A\16\377\16"
+ "\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{<\16\377\22\14\5\252"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\16\12\5\237"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\322;\37\12\377s;\16\377v<\15\377h6\15\377"
+ "f3\15\377p5\15\377z?\17\377{:\16\377U+\14\377\25\17\6\377\7\5\4-\0\0\0\0"
+ "\0\0\0\0\10\6\3Uq7\20\377\304\\\27\377\303`\30\377\31\21\12\377\4\3\3O\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\2\2\34\12\10\5\343"
+ "\212G\25\377\261W\24\377\256V\25\377\30\20\11\252\0\0\0\0\0\0\0\0\15\12\10"
+ "U\216I\27\377\303`\30\377\302[\27\377\30\21\13\343\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11"
+ "\5\226#\26\10\377P*\13\377T,\13\377X,\13\377P*\13\377X,\13\377a2\14\377v"
+ "<\15\377U+\14\377\25\17\6\377\10\6\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11"
+ "\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\6\5\5\34\21\15\10\343D\"\13\377s;\16\377n;\15\377]2\14\377X,\13\377"
+ "\\/\13\377h6\15\377s;\16\377{<\16\377{A\16\377\22\14\5\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\14\11\7\252\203E\30\377\277Z\26\377\210"
+ "G\23\377\17\13\6\343\4\3\3\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\7\6\4\37\20\13\5\343h4\15\377\203B\16\377b1\15\377\12\10\5\301\3\2\2"
+ "D\10\7\5\252yB\32\377\303`\30\377\234J\23\377\"\25\11\377\11\7\4U\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\10\6\3""3E#\12\377y>\16\377{<\16\377\20\13\5\343\4\3\3\34"
+ "\0\0\0\0\0\0\0\0\10\6\3\252\\/\13\377}@\16\377l7\15\377\16\12\5\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\7\5\4\306`0\15\377\206A\17\377\205B\20\377\17\13\6\252\0\0\0\0\0\0\0\0"
+ "\7\5\4UN'\13\377\202@\17\377\202@\17\377\206A\17\377\210C\21\377|>\21\377"
+ "r8\21\377q7\20\377v<\21\377k7\24\3770\35\17\377\14\12\7U\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252-\33\14\377\213F\24\377\203B\22\377k"
+ "5\16\377\23\15\6c\0\0\0\0\0\0\0\0\10\6\5U\\.\15\377\203=\16\377}@\16\377"
+ "\16\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0:\37\11\377n;\15\377s;\16\3778\35\11"
+ "\377\12\10\5\343\5\4\4\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\34\22\13\3241\34\20\377#\25\14\361\15"
+ "\12\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16"
+ "\12\5\216\24\16\5\252\20\14\5\244\10\6\3\34\0\0\0\0\0\0\0\0\30\20\11\216"
+ "\25\17\10\374\27\17\10\270\13\10\6\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\16\5\252\20\13\5\252"
+ "\12\10\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\31\24\15"
+ "\7\223\26\17\7\252\12\10\5\216\5\4\4\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12\5\234\16\12\5\345\30\17\11\377\40\24"
+ "\13\377\34\22\13\364\14\11\7l\0\0\0\0\0\0\0\0\12\10\5\216\23\15\10\353\30"
+ "\17\7\343\12\10\5;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]\27\17\10\252\34\22\11"
+ "\255\17\13\6\34\0\0\0\0\0\0\0\0\0\0\0\0\22\14\5\216\25\16\6\252\11\7\4\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\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\10\6\5qY,\16\377d3\25\377\15\12\10\343\6\5\5\34\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\10\21\14\6\216\32\20\7\252\22\14\5"
+ "\252\11\7\4\34\0\0\0\0\0\0\0\0\6\5\3U6\34\13\377\210B\23\377y;\22\377\17"
+ "\12\6\361\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\10\6\3""9\14\11\5\252\22\15\5\262\16\12\5\361\16\12\5\377"
+ "\16\12\5\374\20\13\5\303\20\13\5\252\10\6\3q\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\10\6\5\34\30\20\11\314\30\21\11\377\21\14\6\322\16\12"
+ "\5\252\20\13\5\252\21\13\6\366\33\21\12\366\16\12\7U\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\10\6\5\34\25\16\12\303\26\17\13\377\22\15\11\377\22\15\11\377"
+ "\26\17\11\377\23\15\10\377\21\14\6\377\21\13\6\377\17\13\6\377\21\14\6\377"
+ "\23\15\6\314\14\11\5\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6\3z\16\12\5"
+ "\252\22\15\5\260\16\12\5\353\17\13\6\377\17\13\6\377\23\14\6\314\23\15\6"
+ "\252\12\10\5\252\10\6\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252"
+ "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6\3}\16\12\5\252"
+ "\16\12\5\322\27\17\10\377\36\24\13\377\36\24\13\377\27\21\12\377\24\16\11"
+ "\364\20\14\11\252\11\10\6O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6A\17\13"
+ "\10\252\21\14\10\350\25\16\10\377\32\20\11\377\27\17\10\377\25\16\10\377"
+ "\17\13\6\377\26\17\7\262\13\11\6\252\12\10\7""9\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\216\24\15\5\252\20\13\5\252"
+ "\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4"
+ "\34\10\6\3\205\17\13\6\301\24\17\11\377\34\22\13\377\36\24\13\377\32\20\11"
+ "\377\16\12\5\356\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\5\4\2\34\10\6\3\216\22\14\7\317\26\17\11\377\34\22\13\377\33\22"
+ "\12\377\22\15\7\377\17\13\6\343\25\15\6\252\12\7\5\244\7\6\4""9\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\14\5\252\11\7\4\34\0\0"
+ "\0\0\0\0\0\0\12\10\7w\225@\32\377\203?\32\377\16\13\7\343\6\5\5\34\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12"
+ "\5\234\24\15\5\252\14\11\5\216\6\5\3\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\14\12\7\216\30\17\7\252\25\15\6\252\10\6\3L\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\11\7\6US+\20\377\260X\27\377\202>\25\377\20\13\7\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\0\0\0\0\11\10\6\34\15\12\10"
+ "\244\27\20\12\276\20\13\7\374\17\13\6\377\16\12\5\377\16\12\5\377\16\12\5"
+ "\377\20\13\5\350\16\12\5\252\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12"
+ "\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16"
+ "\12\5\210\20\14\5\252\20\13\5\252\22\14\5\252\20\13\5\322\16\12\5\377\16"
+ "\12\5\371\20\14\5\301\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\14\5\260\16\12\5\356\16\12\5"
+ "\366\20\14\5\303\22\15\5\252\20\13\5\252\11\7\4\226\7\5\4""6\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\16\12\5\216\20\14\5\252\20\13\5\252\22\14\5\252\20\13"
+ "\5\322\16\12\5\377\16\12\5\371\20\14\5\301\20\13\5\252\11\7\4\231\7\6\4""9"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\20\14\5\252\20\13\5\252\22\14"
+ "\5\252\20\13\5\322\16\12\5\374\14\11\5\377\20\13\5\377\24\15\5\311\13\11"
+ "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\213\24\15\5\252\20\13\5\252\11\7\4"
+ "\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\5\5\4\34\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\20\13"
+ "\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13\5\244\11\7\4\34\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\6\5\3\34\10\7\5\213\23\15\10\301\25\17\12\377\37\25\14"
+ "\377\40\25\15\377\37\24\14\377\27\21\12\377\22\14\7\324\12\10\5\237\7\6\4"
+ """9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11"
+ "\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\14\5\252"
+ "\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\210\20\14\5\252\20\13\5\252\22"
+ "\14\5\260\21\14\6\374\25\16\10\377\21\14\6\377\20\13\5\377\24\15\5\314\13"
+ "\11\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\16\6\252\22\14\5\252\11\10"
+ "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5"
+ "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252"
+ "\20\14\5\252\12\10\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\24\15"
+ "\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3}\16"
+ "\12\5\252\22\14\5\252\24\16\5\255\20\14\5\301\24\15\5\262\24\15\5\252\20"
+ "\13\5\252\11\7\4\231\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216"
+ "\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3}\16\12"
+ "\5\252\22\15\5\252\24\16\5\252\22\14\5\252\15\12\6\343H&\23\377\271V\40\377"
+ "\220@\35\377\24\17\13\350\10\7\7\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25"
+ "\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216"
+ "\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6"
+ "\3z\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\371\20\14\5\301"
+ "\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\7\4\244"
+ "\16\12\5\252\22\15\5\255\16\12\5\345\16\12\5\377\21\14\6\377\26\17\11\377"
+ "\24\16\11\374\25\17\12\260\13\11\6\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\4z\22\14\5\252\16\12\5\226\7\5\4\34"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\7""9"
+ "\30\20\13\255\32\22\11\276\15\12\6\216\5\4\4\13\0\0\0\0\0\0\0\0\10\7\3D\16"
+ "\12\5\252\20\13\5\252\11\7\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16"
+ "\12\5\216\24\16\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\16\12\5\216\24\16\5\252\20\13\5\252\11\10\4\34\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7"
+ "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216"
+ "\22\15\5\252\20\14\5\252\22\15\5\255\16\12\5\343\16\12\5\377\16\12\5\374"
+ "\14\11\5\377\14\11\5\377\20\13\5\377\24\15\5\311\13\11\4\34\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\14\12\5\210\20\14\5\252\20\13\5\252\20\13\5\301\25\17\6\270\16"
+ "\12\5\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\10\6\3\2136\36\11\377k2\14\377N'\13\377\11\7\4\241\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\24\15\5\216\22\14\5\322\20\13\5\252\20\13\5\252\20\13\5\252\11\7\4\34"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10""9\11\7"
+ "\6\237\10\6\5\237\12\10\7\202\12\10\7w\11\7\6\205\11\7\6\247\12\10\7\252"
+ "\13\11\10q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\34\10\6\3}\16\12\5\252\22\15\5\260\16\12"
+ "\5\356\16\12\5\377\20\13\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13"
+ "\5\244\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\210\20\14\5\252\20\13\5"
+ "\252\22\14\5\252\20\13\5\322\16\12\5\377\16\12\5\371\20\14\5\301\20\13\5"
+ "\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3"
+ "}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\371\20\13\5\301"
+ "\20\13\5\252\11\7\4\226\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34"
+ "\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\353\22\15"
+ "\5\255\20\13\5\252\20\14\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\353\16\12\5\377\16"
+ "\12\5\377\20\13\5\377\24\15\5\317\14\11\5\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3U\7\5\4U\6"
+ "\5\3U\5\4\4U\5\4\4i\11\10\4\361H%\13\377n6\15\377C\"\12\377\10\6\3\220\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\16\6\252\20\14\5\252\11\10\4\34\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11\7\4\34"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\7\5\2%\10\6\3\216\10\6\3\343\31\17\6\377K$\12\377"
+ "c3\14\377B!\11\377\10\6\3\202\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\213\25\15\6"
+ "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3O\16\12\5\252\22"
+ "\15\5\252\14\11\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6"
+ "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252"
+ "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\24\15\5U\13\10\4\34\0\0\0\0\0\0\0"
+ "\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\14\5\252\24\16\5\255\20\14\5\301\24"
+ "\15\5\262\24\15\5\252\20\13\5\252\11\7\4\241\7\6\4""9\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\10\6\3UT(\15\377\244I\27\377\270O\33\377\17\13\10\366\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\12\252\260"
+ "S%\377\304W!\377\300X\37\377\26\17\13\301\0\0\0\0\0\0\0\0\0\0\0\0\25\17\12"
+ "\237\32\21\13\377\30\21\13\335\12\10\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3;\14\11\5\252"
+ "\20\13\5\322\16\12\5\377\16\12\5\377\16\12\5\377\16\12\5\366\20\14\5\301"
+ "\20\13\5\252\11\7\4\231\6\5\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\10\6\3\177\16\12\5\252\22\15\5\260\16\12"
+ "\5\356\16\12\5\377\16\12\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13"
+ "\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\16\13\7\216\35\23\10\252\21\13\6\237\10\6\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12\5\226\24\15\5\252\14"
+ "\11\5\216\5\4\2\16\0\0\0\0\0\0\0\0\17\13\10\216\32\22\11\262\23\15\6\252"
+ "\10\6\3D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\14\5\216\20\13\5\356"
+ "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\20\13"
+ "\5\327\22\15\5\273\13\11\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\6\5\4"
+ "\2R\5\4\2U\5\4\2U\5\4\2U\5\4\2c\11\7\4\361H%\13\377p5\15\377M'\14\377\12"
+ "\10\5\252\0\0\0\0\0\0\0\0\0\0\0\0\23\15\10\270\24\16\11\377\20\13\7\377\16"
+ "\13\7\377\21\14\10\377\26\17\11\377\33\21\12\377\36\23\13\377\34\22\13\377"
+ "\25\17\12\377\17\14\10\306\11\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\10\6\5[\17\13\6\252\16\13\5\356\23\15\6\306\14\11\5\34\0\0\0"
+ "\0\0\0\0\0\6\5\3U6\35\11\377d0\15\377m4\16\377\17\13\6\252\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\23\15\6\220\16\12\5\377\20\13\5\262\10\6\3w\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7Xc,\24\377"
+ "\32\20\13\350\5\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9<"
+ "\34\13\377\236C\27\377X,\27\377\13\11\6\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11"
+ "\7n~3\31\377\31\21\14\350\5\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\34\23\16\12\3434\35\21\377"
+ "\36\24\15\377\11\10\6R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252"
+ "\254Q1\377\325}^\377\271X:\377\27\20\16\237\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\34\20\13\5\364D"
+ "\"\11\377>!\11\377\11\10\4\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\12\10\7""0G!\22\377l/\27\377k0\26\377q3\30\377m2\30\377h-\25\377h"
+ "-\25\377q1\30\377s2\30\377\22\15\11\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\11\7\6\"\22\15\11\364B\37\17\377T%\21\377S$\20\377K\"\16\377"
+ "I#\16\377[)\20\377n/\23\377O(\20\377\30\20\11\377\10\6\5""9\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\26\16\5\364(\27\7\377*\27\7\377"
+ "6\34\11\377<\37\11\377$\26\7\377\14\11\5\364\6\5\3\34\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6UH\"\15\377~8\25\377\224"
+ "?\31\377\31\21\16\276\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\17\14\14\205\262V9\377\310Y7\377\302R/\377\36\24\21"
+ "\273\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4c\21\14"
+ "\6\377*\26\11\3771\31\11\3776\32\13\3774\32\13\377;\34\14\377R%\17\377o1"
+ "\22\377T'\21\377\31\21\12\377\10\7\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9&\26\7\377U'\14\377"
+ "|4\25\377\24\15\11\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\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\10\6\5\34\32\20\13\252\13\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\14\10\5w\24\16\11\252\14\11\7\216\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\11\7\6\34\33\21\14\252\13\11\10U\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\7\6\6\34\10\7\5U\10\6\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\31\21\20\241)\33\32\377(\32\27\353\16\14\13R\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10"
+ "\6\3%\11\7\4\216\11\7\4\210\6\5\3\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\27\17\12\231\23\15\12\377\20\13\11\377\20\13\11\377\20"
+ "\13\11\377\20\13\11\377\20\13\11\377\22\15\11\377\30\20\13\314\20\13\11\37"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\216\22\14"
+ "\11\317\22\15\11\377\20\13\11\377\17\13\10\377\17\13\10\374\22\15\11\303"
+ "\22\14\11\252\13\10\6\247\10\7\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\216\16\12\5\252\15\12\6\252\15\11\6\252"
+ "\13\10\6\252\7\6\4\202\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\7\216\25\16\12\252\23\15\12"
+ "\252\16\13\11\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\10\7\10\16\31\21\20\216\33\22\20\301\32\22\17\252\17\13"
+ "\12\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\34\13"
+ "\10\6\252\16\12\7\350\17\12\10\377\17\12\10\377\17\12\10\377\17\12\10\374"
+ "\22\14\11\303\22\14\11\252\13\10\6\247\11\7\6""9\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\11\7\4[\20\13\7\252\24\15\11\252\15\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0",
+};
+
diff --git a/src/visualizations/Goom/goom2k4-0/tools/minicompress.c b/src/visualizations/Goom/goom2k4-0/tools/minicompress.c
new file mode 100644
index 0000000000..4509fec005
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/tools/minicompress.c
@@ -0,0 +1,65 @@
+#include <stdio.h>
+#include <string.h>
+
+#define THE_FILE "gfont.c"
+#define THE_FONT the_font
+#define THE_FONTS "the_font"
+
+#include THE_FILE
+
+int main (int argc, char **argv) {
+ int i = 1;
+ int size = 0;
+ unsigned char pc = the_font.pixel_data[0];
+ int nbz = 0;
+ unsigned char *rle;
+ rle = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel);
+
+ while (i < the_font.width *the_font.height*the_font.bytes_per_pixel) {
+ unsigned char c = the_font.pixel_data[i];
+ if (pc==0) {
+ nbz ++;
+ if (c==0) {
+ if (nbz == 0xff) {
+ rle [size++] = 0;
+ rle [size++] = nbz;
+ nbz = 0;
+ }
+ }
+ else {
+ rle [size++] = 0;
+ rle [size++] = nbz;
+ nbz = 0;
+ }
+ }
+ else {
+ rle [size++] = pc;
+ }
+ pc = c;
+ i++;
+ }
+
+ printf ("/* RGBA C-Source image dump (with zRLE compression) */\n"
+ "static const struct {\n"
+ " unsigned int width;\n"
+ " unsigned int height;\n"
+ " unsigned int bytes_per_pixel;\n"
+ " unsigned int rle_size;\n"
+ " unsigned char rle_pixel [%i];\n", size);
+ printf ("} " THE_FONTS " = {\n"
+ "%i, %i, %i, %i, {\n",
+ the_font.width,the_font.height,the_font.bytes_per_pixel,size);
+
+ printf ("%i",rle[0]);
+ for (i=1;i<size;i++) {
+ if (i%20)
+ printf (",%i",rle[i]);
+ else
+ printf (",\n%i",rle[i]);
+ }
+ printf ("}};\n");
+ printf (" /* Created by MiniCompress.. an iOS RLE compressor.\n"
+ " * Compress Rate : %2.2f %%\n"
+ " */\n", 100.0f * (float)size / (float)(the_font.width*the_font.height*the_font.bytes_per_pixel));
+ return 0;
+}
diff --git a/src/visualizations/Goom/goom2k4-0/tools/xmms-goom.spec b/src/visualizations/Goom/goom2k4-0/tools/xmms-goom.spec
new file mode 100644
index 0000000000..5e2e7ed887
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/tools/xmms-goom.spec
@@ -0,0 +1,41 @@
+%define _xmmsoutputdir %(xmms-config --visualization-plugin-dir)
+
+Summary: A neat visual plugin for XMMS.
+Name: xmms-goom
+Version: 1.9.0
+Release: fr1
+Copyright: GPL
+Group: Applications/Multimedia
+URL: http://goom.sourceforge.net/
+Source: http://prdownloads.sourceforge.net/goom/xmms-goom_%{version}.tgz
+BuildRoot: %{_tmppath}/%{name}-root
+Requires: xmms >= 0.9.5.1
+BuildPrereq: xmms-devel, gtk+-devel
+
+%description
+A great visual plugins for XMMS.
+
+%prep
+%setup -q -n %{name}_%{version}
+
+%build
+%configure --libdir=%{_xmmsoutputdir}
+make
+
+%install
+rm -rf %{buildroot}
+%makeinstall libdir=%{buildroot}/%{_xmmsoutputdir}
+strip %{buildroot}/%{_xmmsoutputdir}/*.so
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%defattr(-,root,root)
+%doc AUTHORS COPYING ChangeLog NEWS README doc
+%{_xmmsoutputdir}/libgoom.*
+
+%changelog
+* Sun Jan 6 2002 Matthias Saou <matthias.saou@est.une.marmotte.net>
+- Initial RPM release.
+
diff --git a/src/visualizations/Goom/goom2k4-0/xmms-goom/Makefile.am b/src/visualizations/Goom/goom2k4-0/xmms-goom/Makefile.am
new file mode 100644
index 0000000000..8e396ccace
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/xmms-goom/Makefile.am
@@ -0,0 +1,11 @@
+# the xmms plugin
+
+if HAVE_XMMS
+xmms_lib_LTLIBRARIES = libxmmsgoom2.la
+xmms_libdir = $(XMMS_VISUALIZATION_PLUGIN_DIR)
+libxmmsgoom2_la_LIBADD = $(top_builddir)/src/libgoom2.la $(XMMS_LIBS)
+libxmmsgoom2_la_SOURCES = xmms_goom.c
+INCLUDES=-DDATADIR=\"@XMMS_DATA_DIR@\" @XMMS_CFLAGS@ -Wall -I../src/
+endif
+
+libxmmsgoom2_la_LDFLAGS = -module -avoid-version
diff --git a/src/visualizations/Goom/goom2k4-0/xmms-goom/xmms_goom.c b/src/visualizations/Goom/goom2k4-0/xmms-goom/xmms_goom.c
new file mode 100644
index 0000000000..b8bb763d7d
--- /dev/null
+++ b/src/visualizations/Goom/goom2k4-0/xmms-goom/xmms_goom.c
@@ -0,0 +1,130 @@
+#include <glib.h>
+#include "goom_config.h"
+
+#include <xmms/plugin.h>
+#include <xmms/xmmsctrl.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <string.h>
+
+static void plug_init (void);
+static void plug_cleanup (void);
+static void plug_render_pcm (gint16 data[2][512]);
+
+static int fd_in, fd_out;
+static pid_t goom_pid = -1;
+
+static VisPlugin plug_vp = {
+ NULL,
+ NULL,
+ 0,
+ "What A GOOM!! " VERSION,
+ 2,
+ 0,
+ plug_init,/* init */
+ plug_cleanup,/* cleanup */
+ NULL,/* about */
+ NULL,/* configure */
+ NULL,/* disable_plugin */
+ NULL,/* playback_start */
+ NULL,/* playback_stop */
+ plug_render_pcm, /* render_pcm */
+ NULL /* render_freq */
+};
+
+VisPlugin *
+get_vplugin_info (void)
+{
+ return &plug_vp;
+}
+
+static void
+plug_init (void)
+{
+ int fd[2];
+ pid_t pid;
+
+ /* create a pipe */
+ if (pipe(fd) < 0) {
+ fprintf (stderr, "System Error\n");
+ /* TODO: en gtk? */
+ return;
+ }
+ fd_in = fd[0];
+ fd_out = fd[1];
+
+ /* load an executable */
+ pid = fork();
+
+ /* todo look at the result */
+ if (pid == 0) {
+ dup2(fd_in, 0);
+
+ execlp ("goom2", "goom2", NULL, 0);
+ fprintf (stderr, "Unable to load goom...\n"); /* TODO: Message en gtk
+ check the PATH */
+ exit (1);
+ }
+ if (pid == -1) {
+ /* erreur system : TODO -> dialog en gtk */
+ }
+ if (goom_pid != -1)
+ kill (goom_pid, SIGQUIT);
+ goom_pid = pid;
+}
+
+static void sendIntToGoom(int i) {
+ write (fd_out, &i, sizeof(int));
+}
+
+static void
+plug_cleanup (void)
+{
+ sendIntToGoom(2);
+ kill (goom_pid, SIGQUIT);
+ goom_pid = -1;
+}
+
+static void
+plug_render_pcm (gint16 data[2][512])
+{
+ fd_set rfds;
+ struct timeval tv;
+ int retval;
+
+ tv.tv_sec = 0;
+ tv.tv_usec = 10000;
+
+ FD_ZERO(&rfds);
+ FD_SET(fd_out, &rfds);
+ retval = select(fd_out+1, NULL, &rfds, NULL, &tv);
+ if (retval) {
+ /* send sound datas to goom */
+ {
+ sendIntToGoom(0);
+ write (fd_out, &data[0][0], 512*sizeof(gint16)*2);
+ fsync(fd_out);
+ }
+
+ /* send song title to goom */
+ {
+ static int spos = -1;
+ int pos = xmms_remote_get_playlist_pos(plug_vp.xmms_session);
+ char title[2048];
+ if (spos != pos) {
+ sendIntToGoom(1);
+ strcpy(title, xmms_remote_get_playlist_title(plug_vp.xmms_session, pos));
+ write (fd_out, &title[0], 2048);
+ spos = pos;
+ }
+ }
+ }
+ else {
+ usleep(100);
+ }
+}
diff --git a/src/visualizations/Goom/goom_config.h b/src/visualizations/Goom/goom_config.h
new file mode 100644
index 0000000000..6e7fef9220
--- /dev/null
+++ b/src/visualizations/Goom/goom_config.h
@@ -0,0 +1,12 @@
+#ifndef GOOM_CONFIG
+#define GOOM_CONFIG
+
+#ifdef MID
+#define GOOM_TEXTURE_WIDTH 256
+#define GOOM_TEXTURE_HEIGHT 256
+#else // MID
+#define GOOM_TEXTURE_WIDTH 512
+#define GOOM_TEXTURE_HEIGHT 512
+#endif // MID
+
+#endif // GOOM_CONFIG
diff --git a/src/visualizations/Goom/visualization.goom/addon.xml b/src/visualizations/Goom/visualization.goom/addon.xml
new file mode 100644
index 0000000000..4e6d20a5d9
--- /dev/null
+++ b/src/visualizations/Goom/visualization.goom/addon.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<addon
+ id="visualization.goom"
+ version="1.0.0"
+ name="Goom"
+ provider-name="Team XBMC">
+ <extension
+ point="xbmc.player.musicviz"
+ library_linux="Goom.vis" />
+ <extension point="xbmc.addon.metadata">
+ <summary lang="en">Goom 2k4 Visualization</summary>
+ <description lang="en">The Goom 2k4 visualization supports effects like Tentacles, Flash, Stars, Fireworks, Waves, Blurs and Glows and includes a large number of trippy hypnotic effects that dance, swirl and pop with the music</description>
+ <platform>linux</platform>
+ </extension>
+</addon>
diff --git a/src/visualizations/Goom/visualization.goom/icon.png b/src/visualizations/Goom/visualization.goom/icon.png
new file mode 100644
index 0000000000..5b958b37a1
--- /dev/null
+++ b/src/visualizations/Goom/visualization.goom/icon.png
Binary files differ